SpringBoot集成语音识别模型FunASR的过程详解

 更新时间:2025年08月25日 14:42:22   作者:智_永无止境  
文章介绍了在SpringBoot中集成FunASR语音识别模型的实践,重点解决Java客户端兼容性问题、Docker部署参数配置及序列化异常,最终实现模型成功运行并处理识别结果,感兴趣的朋友跟随小编一起看看吧

01 引言

应以为粉丝朋友要求,我们一起学习搭建了一个语言识别模型,并集成SpringBoot项目中。在搭建过程中遇到不少问题,总结一下分享给其他需要的朋友。

官网的给出的Java客户端稍微有点问题,并不能接受到大模型识别的反馈。网上的相关的技术博客也很少,这里帮大家把坑点填平,本文一片文章助你轻松拿下FunASR

02 FunASR简介

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

FunASR旨在通过语音识别的学术研究和工业应用之间架起一座桥梁。通过发布工业级语音识别模型的训练和微调,研究人员和开发人员可以更方便地进行语音识别模型的研究和生产,并推动语音识别生态的发展。让语音识别更有趣!

开源仓库地址:https://github.com/modelscope/FunASR

03 FunASR 部署

我们采用Docker技术直接部署,部署的官方指导文档:

https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_online_zh.md

Docker安装的本章不在赘述,之前的文章中已经介绍过安装过程。

3.1 拉取镜像并启动

我们这里使用的是cpu版本的模型:funasr-runtime-sdk-online-cpu-0.1.13。直接拉取镜像并启动:

#拉取镜像
sudo docker pull \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13
# 创建保存模型的文件夹
mkdir -p ./funasr-runtime-resources/models
# 挂载启动镜像
sudo docker run -p 10096:10095 -it --privileged=true \
  -v $PWD/funasr-runtime-resources/models:/workspace/models \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13

3.2 启动服务端

docker启动之后,启动 funasr-wss-server-2pass服务程序。

因为docker启动之后,直接进入到workspace下。可以继续使用cd 等命令

启动脚本

cd FunASR/runtime
nohup bash run_server_2pass.sh \
  --certfile 0 \
  --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  \
  --online-model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx  \
  --punc-dir damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-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 &
# 如果您想关闭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|> ”分别为对应的语种、情感、事件信息

这里的脚本比官网上增加了--certfile 0,用来关闭ssl

启动之后,可能需要等一会。直到服务启动起来,我们可以直接使用命令直接看看日志详情:

tail -f log.txt

直到出现模型初始化成功表示启动成功,如图:

3.3 客户端测试

官方提供了多个客户端,我们选择最简单的H5客户端测试大模型是否部署成功

Html客户端我们可以从GitHub直接下载,也可以从docker里面的下载,说明文档里面也给了链接:

wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/sample/funasr_samples.tar.gz

浏览器里面直接访问Url,自动下载压缩包。打开里面的Html即可:

下载的samples喜下面还包含了,离线的.wav后缀的audio语音文件。

测试

到这里,说明我们部署的语音大模型FunASR就已经成功了。

04 SpringBoot集成FunASR

FunASR的部署得益于Docker的容器化部署,几乎不会有问题。但是当与SpringBoot集成的时候,才是恶梦的开始。我们一起看看Java客户端。

Java的客户端是让我们将Java代码构建成shell命令,这并不是我们想要的。好在Github上提供了Java的案例

地址:https://github.com/modelscope/FunASR/tree/main/runtime/java/java_http2ws_src

4.1 踩坑1

代码里面的关键类:RecognitionServiceImpl

多么优秀的代码,直接拷贝到自己的项目中。为了能够就减少问题,特意看了官方依赖的Maven

<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>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version>
</dependency>

笔者这里采用单元测试的方式,使用的SpringBoot版本是2.6.13

standardWebSocketClient.execute()报错,最终采用了划红线的方法代替。

4.2 踩坑2

按照官方的模版代码,修正了错误之后,正常连接Websocket:

发现连上websocket,但是没有数据返回。这是最大的坑。

由于我们对接的事实时语音识别,服务端使用的是socket协议,我们看看官方文档的参数说明:

地址:https://github.com/modelscope/FunASR/blob/main/runtime/docs/websocket_protocol_zh.md

{
    "mode": "2pass",
    "wav_name": "wav_name",
    "is_speaking": true,
    "wav_format": "pcm",
    "chunk_size": [5,10,5],
    "hotwords": "{\"阿里巴巴\":20,\"通义实验室\":30}",
    "itn": true
}

参数说明:

  • modeoffline,表示推理模式为一句话识别;online,表示推理模式为实时语音识别;2pass:表示为实时语音识别,并且说话句尾采用离线模型进行纠错。
  • wav_name:表示需要推理音频文件名
  • wav_format:表示音视频文件后缀名,只支持pcm音频流
  • is_speaking:表示断句尾点,例如,vad切割点,或者一条wav结束
  • chunk_size:表示流式模型latency配置,[5,10,5],表示当前音频为600ms,并且回看300ms,又看300ms
  • audio_fs:当输入音频为pcm数据是,需要加上音频采样率参数
  • hotwords:如果使用热词,需要向服务端发送热词数据(字符串),格式为 “{“阿里巴巴”:20,“通义实验室”:30}”
  • itn: 设置是否使用itn,默认True
  • svs_lang: 设置SenseVoiceSmall模型语种,默认为“auto”
  • svs_itn: 设置SenseVoiceSmall模型是否开启标点、ITN,默认为True

对比参数发现,案例的入参和文档说明的入参差了一个chunk_size,我们加上参数看看结果:

结果发现直到导致服务异常了,服务器上可以看出json参数异常了。我们打印出参数看看参数看看:

传递的数据结果变成了内存地址了,我们不用官方提供的,我们直接用fastjson2序列化,只要保证数组打印出来的是数组的值就好了。

测试结果终于正常了:

但是chunk_size到底是什么?虽然官方给了解释,但是还是一头雾水,又从官方主页里面找到了相关的解释,终于有了一点点了解,但还是懵逼状态。

小编简单以为:就是控制返回文字的频率和时间的一个指标

4.3 踩坑3

识别结果的处理:官方demo加了TODO,可能就会有人问到,这里获取不到结果怎么处理?

真正接收识别结果的事图中黄色的WebSocketClient,那我们如何将识别的结果传到指定的位置呢?

具体实现可以通过java.util.concurrent.CompletableFuture实现,具体不在赘述。

到此这篇关于SpringBoot集成语音识别模型FunASR的文章就介绍到这了,更多相关SpringBoot语音识别模型FunASR内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Spring Boot实现操作数据库的接口的过程

    使用Spring Boot实现操作数据库的接口的过程

    本文给大家分享使用Spring Boot实现操作数据库的接口的过程,包括springboot原理解析及实例代码详解,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Sentinel流控规则实现限流保护详解

    Sentinel流控规则实现限流保护详解

    这篇文章主要介绍了Sentinel流控规则实现限流保护,Sentinel是一个分布式系统的流量控制组件,它可以实现限流,流控,降级等功能,提高系统的稳定性和可靠性,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Java集合中的LinkedHashSet源码解读

    Java集合中的LinkedHashSet源码解读

    这篇文章主要介绍了Java集合中的LinkedHashSet源码解读,在LinkedHashMap中,双向链表的遍历顺序通过构造方法指定,如果没有指定,则使用默认顺序为插入顺序,即accessOrder=false,需要的朋友可以参考下
    2023-12-12
  • SpringBoot使用TraceId进行日志追踪的实现

    SpringBoot使用TraceId进行日志追踪的实现

    本文主要介绍了SpringBoot使用TraceId进行日志追踪的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • java实现清理DNS Cache的方法

    java实现清理DNS Cache的方法

    这篇文章主要介绍了java实现清理DNS Cache的方法,分析了几种常用的清理方法,并给出了反射清理的完整实例,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • java.lang.OutOfMemoryError: Java heap space错误的问题解决

    java.lang.OutOfMemoryError: Java heap space错误

    本文主要介绍了java.lang.OutOfMemoryError: Java heap space错误的问题解决,包括内存泄漏、数据过大和JVM堆大小配置不足,提供了解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • java实现导出数据为zip压缩文件

    java实现导出数据为zip压缩文件

    这篇文章主要为大家详细介绍了java如何实现导出数据为zip压缩文件,并且解压后为json文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • Spring Boot整合Zookeeper实现分布式锁的场景分析

    Spring Boot整合Zookeeper实现分布式锁的场景分析

    这篇文章主要介绍了Spring Boot整合Zookeeper实现分布式锁,zk实现分布式锁完全是依靠zk节点类型当中的临时序号节点来实现的,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 提交gRPC-spring-boot-starter项目bug修复的pr说明

    提交gRPC-spring-boot-starter项目bug修复的pr说明

    这篇文章主要介绍了这篇文章主要为大家介绍了gRPC-spring-boot-starter项目提交bug修复的pr的原因说明,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • Springboot整合Dubbo+Nacos实现RPC调用的示例代码

    Springboot整合Dubbo+Nacos实现RPC调用的示例代码

    随着互联网技术的飞速发展,越来越多的企业和开发者开始关注微服务架构,Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,本文讲解如何将Spring Boot与Dubbo和Nacos整合,实现RPC调用,需要的朋友可以参考下
    2024-02-02

最新评论