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

内容摘选自: 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.xdnf.cn/news/809.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙进阶篇-模态转场

hello大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天让我们来学习鸿蒙进阶篇-模态转场 模态转场 今天来学习模态转场&#xff0c;就是页面中弹出&#xff0c;全屏&半屏的弹框&#xff1a; 就像这样&#xff0c;模态转场主要分为半模态和全屏模态&#xff0c;上面的…

RGA DEMO 下部

#加载llm模型通过ollama最好别用ollama我是没经济条件 from langchain_community.llms import Ollama llm Ollama(model"qwen1_5-4b-chat-q2_k")#pip install langchain_ollama -i https://pypi.tuna.tsinghua.edu.cn/simple #OllamaEmbeddings 要写地址本地也要写&…

Faces in Things数据集: 由麻省理工学院、微软等联合发布,探索人类视觉错觉的新里程碑

2024-09-24&#xff0c;由麻省理工学院、微软、丰田研究院、NVIDIA联合发布的 Faces in Things&#xff0c;为我们打开了研究人类视觉错觉——尤其是面部错觉&#xff08;Pareidolia&#xff09;的新篇章。专注于人类视觉系统如何在各种随机刺激中检测到类似面孔的结构&#xf…

知识见闻 - Workday公司介绍

人力资源“一哥”Workday的前世今生 01 Duffield 既然要聊Workday&#xff0c;我们首先要认识一个人。David Duffield&#xff0c;又一位企业软件服务行业的绝对大神。 大卫杜菲尔德&#xff08;David Duffield&#xff09;出生于1941年。 40岁&#xff0c;很多职场人都已经认命…

宁德时代嵌入式面试题及参考答案(万字长文)

vector 和 list 的主要区别是什么&#xff1f; 向量&#xff08;vector&#xff09;和链表&#xff08;list&#xff09;是 C 中两种常用的容器。 从底层数据结构来讲&#xff0c;vector 是基于连续的内存存储的动态数组。这使得它可以通过索引快速访问元素&#xff0c;时间复杂…

设计模式08-行为型模式1(命令模式/迭代器模式/观察者模式/Java)

五、行为型模式 **行为模式的定义&#xff1a;**行为型模式是对不同的对象之间划分职责和算法的抽象化。行为型模式定义了系统中对象之间的交互与通信&#xff0c;研究系统在运行时对象之间的相互通信与协作&#xff0c;进一步明确对象的职责&#xff0c;包括对系统中较为复杂的…

【设计模式】结构型模式(二):代理模式

结构型模式&#xff08;二&#xff09;&#xff1a;代理模式 3.代理模式&#xff08;Proxy&#xff09;3.1 主要特点3.2 组成部分3.3 示例代码3.3.1 Subject 接口3.3.2 RealSubject 实际对象3.3.3 Proxy 代理对象3.3.4 客户端代码3.3.5 运行结果 3.4 总结 3.代理模式&#xff0…

第二十八章 Vue之自定义指令

目录 一、引言 二、自定义指令的注册和使用方式 2.1. 自定义指令-全局注册使用 2.2. 自定义指令-局部注册使用 三、自定义指令完整代码 3.1. 自定义指令全局注册/使用 3.1.1. main.js 3.1.2. App.vue 3.2. 自定义指令局部注册/使用 3.2.1. main.js 3.2.2. App.vue …

Charles简单压力测试

1.接口请求次数&#xff0c;并发量&#xff0c;请求延迟时间均可配置 1.1选中需要进行测试的接口&#xff0c;鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中&#xff0c;选择了1个接口&#xff0c;每次迭代中1个接口同时请求&#xff0c;迭代1000次&#xff08;…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求&#xff0c;可以自己改造。 日历 实现分析&#xff1a; 页面显示 - 分为顶部显示和日历显示&#xff0c;我这里做了多行和单行显示两种情况&#xff0c;主要是当时看着手机的日历做的&#xff0c;手机上的…

Java设计模式(代理模式整理中ing)

一、代理模式 1、代理模式定义&#xff1a; 代理模式&#xff1a;由于某些原因要给某对象提供一个代理以控制对该对象的访问&#xff0c;这时访问对象不适合或者不能够直接引用目标对象&#xff0c;代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…

Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ Thumb指令集 ARM 指令集&#xff1a;最早在 1985 年随第一代 ARM 处理器问世。ARM 指令集一开始是 32 位固定长度的指令&#xff0c;用于各种计算任务。 Thu…

Leetcode - 周赛421

目录 一&#xff0c;3334. 数组的最大因子得分 二&#xff0c;3335. 字符串转换后的长度 I 三&#xff0c;3336. 最大公约数相等的子序列数量 四&#xff0c;3337. 字符串转换后的长度 II 一&#xff0c;3334. 数组的最大因子得分 暴力方法就不演示&#xff0c;这里介绍一个…

文件管理工具的按路径名称归类功能大公开,将大量文件批量复制或移动到指定路径,办公软件达人的秘密武器

是否还在为成堆的文件归类而苦恼&#xff1f;想要一键就能将海量文件按路径名称轻松归类&#xff0c;无论是复制还是移动&#xff1f;别急&#xff0c;今天就让文件批量改名高手软件的按路径名称归类功能来拯救你的文件管理世界&#xff01;让我们一起告别繁琐&#xff0c;迎接…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

vue3uniapp实现自定义拱形底部导航栏,解决首次闪烁问题

前言&#xff1a; 我最初在网上翻阅查找了很多方法&#xff0c;发现大家都是说在page.json中tabbar中添加&#xff1a;"custom": true,即可解决首次闪烁的问题&#xff0c;可是添加了我这边还是会闪烁&#xff0c;因此我这边改变了思路&#xff0c;使用了虚拟页面来解…

【P2-5】ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——TCP数据透传

前言:完成ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——实现TCP数据透传 AP模式,通俗来说模块可以发出一个WIFI热点提供给电脑/手机连接。 TCP服务端,通俗来说就是模块/单片机作为服务器,可以接收多个客户通道的连接。 本…

Kali Linux 新工具推荐: Sploitscan

在 2024.2 版本 Kali Linux 增加了一个新攻击工具: Sploitscan 1.简介: Sploitscan 能够发现操作系统和应用程序中的安全漏洞。 2.特点: 简单的命令行界面 扫描多个操作系统和应用程序 检测多种漏洞 提供详细信息 可定制性强 3.示例: 2024.2 及以后的版本 Kali Linux…