语音识别: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;}}
识别后返回的数据内容
相关文章:

语音识别:docker部署FunASR以及springboot集成funasr
内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md FunASR FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD…...

Rust项目结构
文章目录 一、module模块1.文件内的module 二、模块化项目结构1.关于module2.各个模块之间互相引用 三、推荐项目结构1.实例 参考 一、module模块 1.文件内的module 关键字:mod 引入模块中的方法 usemod名字:方法名usemod名字.*写全路径 二、模块化项…...

计算并联电阻的阻值
计算并联电阻的阻值 C语言代码C代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 对于阻值为r1和r2的电阻,其并联电阻阻值公式计算如下: R1/(1/r11/r2) 输入 两个电阻阻抗大小,浮…...
MySQL符号类型(详细)
在 MySQL 中,符号可以分为几种主要类型,以下是所有符号类型的小写分类: 1. 占位符 ?:用于准备语句中的占位符,表示将来要替换的值。 2. 分隔符 ;:表示 sql 语句的结束。 ,:用于分隔列、值或…...

Angular引用控件类
说明: angular 在一个控件类里面,引入另外一个控件类,这样做的好处,就是代码分离,当你一个页面存在多少类似于独立的界面时,可以使用这种方式,分离代码 更好维护程序 效果图: step…...

stm32 踩坑笔记
串口问题: 问题:会改变接收缓冲的下一个字节 串口的初始化如下,位长度选择了9位。因为要奇偶校验,要选择9位。但是接收有用数据只用到1个字节。 问题原因: 所以串口接收时会把下一个数据更改...
文件上传和文件包含
声明: 本文章只是适用于网络安全教学,请自觉遵守网络安全法,严禁用于非法途径,若读者做出来任何危害网络安全的行为,后果自负,均与本人无关. 文件上传: 大部分的网站和应用系统都有上传的功能,如用户头像上传,图片上传,文档上传…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作空洞骑士独有的EventSystem和InputModule总结 前言 hello大家好久没见,之所以隔了这么久才更新并不是因为我又放弃了这个项目,而…...

yelp数据集上试验SVD,SVDPP,PMF,NMF 推荐算法
SVD、SVD、PMF 和 NMF 是几种常见的推荐算法,它们主要用于协同过滤和矩阵分解方法来生成个性化推荐。下面是对每种算法的简要介绍: 1. SVD(Singular Value Decomposition) 用途:SVD 是一种矩阵分解技术,通…...

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练
我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录…...
Flink和Spark在实时计算方面有何异同
Flink和Spark在实时计算方面既有相似之处,也存在显著的差异。以下是对它们之间异同的详细分析: 一、设计理念与世界观 Flink: 专注于流处理,认为批是流的特例。数据流分为有限流(Bounded)和无限流…...

纵然千万数据流逝,唯独vector长存
公主请阅 1.vector的一些方法1vector和stringpush_back 插入以及三种遍历数组的方式一些方法vector中的一些常见的方法1. push_back()2. pop_back()3. size()4. clear()5. empty()6. resize()7. insert()8. erase()9. at()10. front和 back()11. data()12. capacity()13. shrin…...
【LeetCode】【算法】739. 每日温度
LeetCode 739. 每日温度 题目描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0…...

2025年知识管理新方案:十款前沿知识库搭建工具详解
随着企业信息化和智能化的发展,知识管理已成为提升企业竞争力的关键要素。一个高效的知识库不仅能促进内部沟通,还能展示企业的专业形象。以下是2025年十款前沿知识库搭建工具的详解。 1. HelpLook AI知识库 HelpLook AI知识库是一款专注于为企业提供高…...
WebSocket实现消息实时推送
文章目录 websocket介绍特点工作原理 用websocket实现实时推送引入依赖WebSocket 函数定义变量声明初始化 WebSocket 连接WebSocket 连接的初始化和事件处理连接打开事件接收消息处理连接关闭和重连机制心跳机制使用 WebSocket代码完整显示 websocket介绍 WebSocket 是一种网络…...

flink 内存配置(三):设置JobManager内存
flink 内存配置(一):设置Flink进程内存 flink 内存配置(二):设置TaskManager内存 flink 内存配置(三):设置JobManager内存 flink 内存配置(四)…...
蓝桥杯 Python组-神奇闹钟(datetime库)
神奇闹钟 传送门: 0神奇闹钟 - 蓝桥云课 问题描述 小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 11 日 00:00:00)开始,每经过 x 分钟,这个闹钟便会触发一次闹铃 (…...

解决阿里云三个月证书过期 免费SSL证书部署教程
相信有上线过自己的网站、小程序经验的同学深有体会,给服务加上 SSL 证书还挺麻烦的,尤其是没有运维经验的同学。本来最省事的方法是买个证书,但是一看价格,还是算了吧,动辄就是几万块一年。作为个人来说,这…...

VBA03-变量
一、什么是变量 变量是一个自定义名称的储存单位,变量是一个载体。 二、代码调试 在代码逐句运行的过程中查看变量的存储内容。 2-1、示例1 2-2、示例 三、变量的数据类型 若是定义的数据类型的变量,存储了超出了她范围的数,则会报溢出。 注…...
docker-ce-stable‘ 下载元数据失败 : Cannot download repomd.xml: Cannot download
看起来你在尝试安装 containerd.io-1.6.32 时遇到了问题,因为 docker-ce-stable 仓库的元数据下载失败。以下是一些可能的解决方案: 1. 检查仓库配置 确保你的 /etc/yum.repos.d/ 目录下的 docker-ce.repo 文件配置正确。你可以尝试手动编辑该文件&…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...