索性写一个系列贴子吧,方便大家系统学习,贴子我写随意点,以后在我自己站点上整理比较完整的
之前有发过求助贴子: 求佬们给一些ASR和TTS的选型建议 - #27,来自 fengin
收到各位佬友们的反馈和建议,我重复一下背景:
由于工作需要,需要实现一个人工智能语音交互的业务场景功能。
主要背景是办公区域安装一个10寸/4寸 安卓屏(10寸的配置稍高点,4寸的比较低),想利用语音交互相关功能,这里涉及到几个技术实现点需要选型:
屏端关键词唤醒(因为不能一直接收不需要的语音到服务端ASR),比如我们百度小爱、天猫精灵唤醒,本质上是本地热词识别;
唤醒后,对话语音断句检测(VAD端点检测),形成一个完整的句子发送到服务端;
服务端ASR(语音转文本,好多ASR选择,不知道哪个好);
业务处理/大模型推理,这个不需要大家推荐选型;
业务结果反馈,TTS(文本转语音,选型也比较多);
经过我一段时间摸索,基本上走通了demo主流程:端侧(手机/10寸安卓屏/4寸安卓屏)语音唤醒、VAD检测内容——发送到服务端——ASR 转文本——LLM推理(目前业务上下文mock)——操作业务mock——TTS转语音——返回端侧显示结果/播放语音
这个是测试MO


技术方案选择
端测VAD和热词唤醒 采用了sherpa-onnx ,开源地址是: GitHub - k2-fsa/sherpa-onnx: Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, x86_64 servers, websocket server/client, support 12 programming languages
ASR TTS、LLM目前临时使用了阿里在线的,后续会继续研究离线部署的,后面再更新章节
端侧实现
今天主要讲的是端侧实现
由于团队技术储备有限,Android没有专门开发人员,目前采用 Android原生+JSbridge+H5方式来做,H5来做业务, Android原生主要做语音交互部分(热词唤醒+VAD检测+服务端请求处理)
sherpa-onnx其实有很多功能,比如ASR,考虑到依赖的模型比较大(几百M),而且效果不怎么好,用在商业上肯定不够精准的,所以我只用了热词和VAD检测,热词会用到模型,比较小,就总共13M左右大小:

然后需要的是JNDI本地库,官方有编译好了的版本,自己都不用编译:

官方开源地址里面也有android的demo,是用kotlin写的,我让AI根据我的需要,参考官方的kotlin实现,写了一遍JAVA版本,把官方的接口包都拷了过来(由于调用JNDI,com.k2fsa.sherpa.onnx包名不能修改):

在AI Coding的加持下,2天就在手机上能跑起来了基本的热词检测和VAD检测,实现上还有些逻辑处理,比如热词唤醒后开始VAD检测,语音播放时停止VAD检测(消回音),播放时热词检测同步,可以打断语音播放等等。
然后移到10寸安卓屏和4寸安卓屏上,出现了两个问题:
- 官方的代码,对芯片的支持判断有个小问题,需要修改下,目前我已经提PR在主分支上更新了( Support armv8l in Java API (#2556) · k2-fsa/sherpa-onnx@daac04b · GitHub )
- 2.4寸安卓屏由于硬件配置比较低,热词一直唤醒不了,后来花了一天多时间调了很多参数,终于把语音的采样率修改为12000以下就能识别了(默认是16000设置)
后面就是服务端的开发demo实现了,整个流程基本上算是跑通了。
新的麻烦
主流程跑通了,但是遇到一个问题,我这客户场景热词是需要定制的,我发现k2-fsa/sherpa-onnx这个开源框架提供的模型,对内置的几个关键词识别率很高,基本95%以上,但是加其他关键词识别率非常低,60%都没有,根本无法商用。
根据官方的提示(有个群大佬也这样做了,并且验证了),需要做关键词微调,查看了官方的微调脚本和文档信息(https://github.com/k2-fsa/icefall/blob/master/egs/wenetspeech/KWS/run.sh)
需要一系列的环境准备、数据集准备、微调,通过AI协助阅读训练脚本和数据,基本上有了思路,让AI帮写了整个训练文档。
当我准备数据时,就遇到麻烦了,训练的服务器要求比较高:
- 需要显卡,至少要3060及以上
- CPU 要求低点,但不能太差
- 硬盘 4T以上空间;
我这本来有一台服务器有3060显卡,但是硬盘空间不够了,需要准备两个数据:
- 基础数据集:wenetspeech ,10000+ 小时的基础语音样本数据,估计要下载好久,下载前还要去这个机构申请下载权限,数据开源地址: GitHub - wenet-e2e/WenetSpeech: A 10000+ hours dataset for Chinese speech recognition
- 100~200份新热词的语音相本,包括正负样本,包含各种年纪、性别、场景、距离的关键词录音
对于我需要增加一个热词的需求来说,感觉太重了,具体操作是可以操作的,我感觉现阶段做这个太麻烦了。
我弄的训练方案可以分享供大家参考(解压后是markdown文档):
关键词训练完整操作方案.7z (9.0 KB)
其他选择
然后我又调研了一些其他开源方案选择,基本信息汇总下如下:
- Picovoice , 国外的,支持离线,需要收费,好像不便宜
- WakeNet, 需要训练,Android还要封装,用在开发模上比较多,比如这个乐鑫提供的( 乐鑫语音唤醒方案客户定制流程 - ESP32-S3 - — ESP-SR latest 文档 )
- Snowboy, 开源地址:https://github.com/Kitt-AI/snowboy, 这个前几年开源比较热门的,但是后来官方关停了,现在也还能跑通,增加热词也很简单方便,但是有一个缺点,增加热词只是几个样品,训练的模型只是个人模型,不是通用模型,也就是说,你个人用的场景是可以的,比如家庭,但不适合我这场景公共场所各种人群的热词,开发者们要是自己玩玩,自己家里弄这个语音交互非常适合。
- 科大讯飞,现在经过各种选择,又回到了科大讯飞的收费版本,之前觉得太贵了,现在对比自己训练成本,还算便宜的(2500元,500个装机量),试了下自定义词效果还不错,但有个缺点,不支持读音近的热词、不支持英文词、不支持特殊发音词等,不过目前来看基本能满足我的需求,可能会选择这个。
相关的热词唤醒选择网上这里也有个汇总简单说明: 语音激活和唤醒词检测(Wake Word Detection) - 机器人开源项目资源网
后面有时间我继续去试下基于k2-fsa/sherpa-onnx的训练场景训练自己的热词,和大模型训练基本上差不多了,成本比较高,短期内可能使用科大讯飞的试用了。
吐槽下,k2-fsa/sherpa-onnx有个kaldi群,我在里面聊了蛮长时间关于语音的这些技术,昨天提了下科大讯飞的试用反馈,结果把我踢出群了,我有点懵逼,群规则都没提到这些,也没给我任何解释反馈,突然把我踢了,好无语:

好了,今天的分享就到这里了,希望能给研究语音交互的佬友们一点收获。
后面章节可能会讲TTS、ASR、LLM相关的实践内容了,等我研究有结论后再来分享。
借地发个需求:
坐标:杭州 未来科技城
需求:资深JAVA或者技术专家,后端有物联网相关的工作经验的(5~10年,有基础的架构能力)
待遇:20~25K
有看机会的请私我