语音识别:docker部署FunASR以及springboot集成funasr

news/2025/1/15 4:55:10/

内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md

FunASR

FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程,支持预训练好的模型的推理与微调。

此文章补充了一些内容,让小白更容易上手

注意:1.	certfile ssl证书问题,不了解的话就关闭即可2.	关闭FunASR服务(有守护线程杀完会自动启动,如果想修改启动命令的话就kill和nohup全部编辑好在贴进去执行)

镜像启动

通过下述命令拉取并启动FunASR软件包的docker镜像:

# 拉取镜像
sudo docker pull \
registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.6# 当前文件路径下创建目录 用于挂载模型
mkdir -p ./funasr-runtime-resources/models# 启动镜像
sudo docker run -p 10095:10095 -it --privileged=true \
-v $PWD/funasr-runtime-resources/models:/workspace/models \
registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.6

服务端启动

docker启动之后,进入到docker里边

docker exec -it <imageid> /bin/bash

启动funasr-wss-server服务程序(有16K 和 8K模型可选择):

cd FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
--model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
--itn-dir thuduj12/fst_itn_zh \
--hotword /workspace/models/hotwords.txt > log.txt 2>&1 &

查看打印日志

tail -f log.txt
  • 如果您想关闭SSL,增加参数:--certfile 0
  • 如果您想使用SenseVoiceSmall模型、时间戳、nn热词模型进行部署,请设置--model-dir为对应模型:
    • iic/SenseVoiceSmall-onnx
    • damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(时间戳)
    • damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn热词)
  • 如果您想在服务端加载热词,请在宿主机文件./funasr-runtime-resources/models/hotwords.txt配置热词(docker映射地址为/workspace/models/hotwords.txt):每行一个热词,格式(热词 权重):阿里巴巴 20(注:热词理论上无限制,但为了兼顾性能和效果,建议热词长度不超过10,个数不超过1k,权重1~100)
  • SenseVoiceSmall-onnx识别结果中<|zh|><|NEUTRAL|><|Speech|> 分别为对应的语种、情感、事件信息

如果您想部署8k的模型,请使用如下命令启动服务:

cd FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--vad-dir damo/speech_fsmn_vad_zh-cn-8k-common-onnx \
--model-dir damo/speech_paraformer_asr_nat-zh-cn-8k-common-vocab8358-tensorflow1-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst-token8358 \
--itn-dir thuduj12/fst_itn_zh \
--hotword /workspace/models/hotwords.txt > log.txt 2>&1 &

使用客户端测试

官方提供了:html页面、java、python、cpp
docker镜像中的html页面下载到宿主机,然后下载到本机

docker cp  <容器 ID 或名称>:/workspace/FunASR/runtime/html5 /funasr-runtime-resources

在浏览器中打开html/static/index.html,即可出现如下页面,支持麦克风输入与文件上传,直接进行体验。
在这里插入图片描述

服务端用法详解

启动FunASR服务(注意:certfile SSL证书问题,小心访问不通):

cd /workspace/FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
--itn-dir thuduj12/fst_itn_zh \
--certfile  ../../../ssl_key/server.crt \
--keyfile ../../../ssl_key/server.key \
--hotword ../../hotwords.txt  > log.txt 2>&1 &

run_server.sh命令参数介绍

  • --download-model-dir:模型下载地址,通过设置model ID从Modelscope下载模型
  • --model-dir:modelscope model ID 或者 本地模型路径
  • --vad-dir:modelscope model ID 或者 本地模型路径
  • --punc-dir:modelscope model ID 或者 本地模型路径
  • --lm-dir:modelscope model ID 或者 本地模型路径
  • --itn-dir:modelscope model ID 或者 本地模型路径
  • --port:服务端监听的端口号,默认为10095
  • --decoder-thread-num:服务端线程池个数(支持的最大并发路数),脚本会根据服务器线程数自动配置decoder-thread-num、io-thread-num
  • --io-thread-num:服务端启动的IO线程数
  • --model-thread-num:每路识别的内部线程数(控制ONNX模型的并行),默认为1,其中建议decoder-thread-num*model-thread-num等于总线程数
  • --certfile:SSL的证书文件,默认为:../../../ssl_key/server.crt,如果需要关闭SSL,参数设置为0
  • --keyfile:SSL的密钥文件,默认为:../../../ssl_key/server.key
  • --hotword:热词文件路径,每行一个热词,格式:热词 权重(例如:阿里巴巴 20),如果客户端提供热词,则与客户端提供的热词合并一起使用,服务端热词全局生效,客户端热词只针对对应客户端生效

关闭FunASR服务

  • 查看funasr-wss-server对应的PID:
ps -x | grep funasr-wss-server
  • 杀死进程:
kill -9 PID

修改模型及其他参数

替换正在使用的模型或者其他参数,需先关闭FunASR服务,修改需要替换的参数,并重新启动FunASR服务。其中模型需为ModelScope中的ASR/VAD/PUNC模型,或者从ModelScope中模型finetune后的模型。

例如替换ASR模型为damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx,则如下设置参数--model-dir

--model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx
  • 设置端口号--port
--port <port number>
  • 设置服务端启动的推理线程数--decoder-thread-num
--decoder-thread-num <decoder thread num>
  • 设置服务端启动的IO线程数--io-thread-num
--io-thread-num <io thread num>
  • 关闭SSL证书:
--certfile 0

springboot集成funasr示例

样例代码中如注入接口,调用改为自己的即可,我只提供了主要逻辑方法,uri改为自己的

依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- 引入org.json所需依赖 --><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20240303</version></dependency></dependencies>

配置


spring:application:name: java_http_client
server:port: 18081parameters:model: "offline" #离线模型为例hotWords: "{\"自定义\":20,\"热词\":20,\"设置\":30}"fileUrl: "E:/work/project/gitee/mycloud/funasr/src/main/resources/upload"serverIpPort: "ws://192.168.1.101:10095"

controller

 @GetMapping("/z2")public void z2() throws Exception {WebSocketClient client = new StandardWebSocketClient();client.doHandshake(new WebSocketHandler() {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {// todo 注入自己的接口调用方法即可recognitionService.z2(session);// 处理连接后保存session}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {// 在这里处理接收到的消息if (message instanceof TextMessage) {String receivedMessage = ((TextMessage) message).getPayload();System.out.println("Received message from server: " + receivedMessage);// 在这里处理接收到的消息}}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {// 异常处理System.err.println("handleTransportError: " + exception.getMessage());}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {System.out.println("WebSocket connection closed with status: " + closeStatus);}@Overridepublic boolean supportsPartialMessages() {return false;}}, null, new URI("ws://192.168.1.101:10095"));}

实现方法


@Service
public class RecognitionServiceImpl implements RecognitionService {@Value("${parameters.model}")private String model;@Value("${parameters.hotWords}")private String hotWords;@Overridepublic Object z2(WebSocketSession webSocketSession) throws Exception {JSONObject configJson = new JSONObject();configJson.put("mode", model);configJson.put("wav_name", "test");configJson.put("wav_format", "wav"); // 文件格式为pcmconfigJson.put("is_speaking", true);configJson.put("hotwords", hotWords);configJson.put("itn", true);// 发送配置参数与meta信息webSocketSession.sendMessage(new TextMessage(configJson.toString()));byte[] audioData;String localFilePath = "E:\\work\\project\\gitee\\mycloud\\funasr\\src\\main\\resources\\test.wav";try {audioData = Files.readAllBytes(Paths.get(localFilePath));} catch (IOException e) {System.err.println("Error reading file: " + e.getMessage());e.printStackTrace();return "Error reading audio file";}ByteBuffer audioByteBuffer = ByteBuffer.wrap(audioData);BinaryMessage binaryMessage = new BinaryMessage(audioByteBuffer);webSocketSession.sendMessage(binaryMessage);// 发送音频结束标志JSONObject endMarkerJson = new JSONObject();endMarkerJson.put("is_speaking", false);webSocketSession.sendMessage(new TextMessage(endMarkerJson.toString()));return null;}}

识别后返回的数据内容
在这里插入图片描述


http://www.ppmy.cn/news/1544422.html

相关文章

WebGL(Web Graphics Library)

WebGL&#xff08;Web Graphics Library&#xff09;是一种基于 JavaScript 的 API&#xff0c;允许在网页上渲染高性能的 2D 和 3D 图形。它利用计算机的 GPU 来实现硬件加速&#xff0c;因此适合创建游戏、数据可视化和交互式应用程序。 WebGL 的基本概念&#xff1a; 上下文…

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

0xGame 2024 [Week 4] Jenkins

1.前言 由于好久没做web题了&#xff0c;所以今天来尝试来做一波web题&#xff0c;仅供刷题记录。 2.题目 这个给的提示对于小白来说实在是友好的过劲。 3.分析 上网搜到一个关于Jenkins的历史漏洞&#xff0c;下面链接可供参考 https://blog.csdn.net/2301_80127209/arti…

[FE] React 初窥门径(四):React 组件的加载过程(render 阶段)

1. 回顾 前几篇文章中&#xff0c;我们采用了 VSCode 插件 CodeTour 来记录代码的执行过程&#xff0c; 并把相关的数据 .tour/ 放到了 github: thzt/react-tour 中。 截止到本文为之&#xff0c;我们总共记录了这些 code-tour&#xff0c; .tour/ ├── 2. 构建过程.tour ├─…

HTML入门教程22:HTML文件路径

一、绝对路径 定义&#xff1a;绝对路径是从网站根目录开始的完整路径&#xff0c;它包含了协议、域名和文件路径。例如&#xff0c;<script src"https://www.example.com/js/script.js"></script>就使用了绝对路径来引用外部的JavaScript文件。特点&am…

Gitlab-runner running on Kubernetes - hostAliases

*Config like this. *That in your helm values.yaml.

Redis设计与实现 学习笔记 第十四章 服务器

Redis服务器负责与多个客户端建立网络连接&#xff0c;处理客户端发送的命令请求&#xff0c;在数据库中保存客户端执行命令所产生的数据&#xff0c;并通过资源管理来维持服务器自身的运转。 14.1 命令请求的执行过程 如果我们使用客户端执行以下命令&#xff1a; 那么从客…