探研智能语音交互(二)

凌封小子 2025-09-25 11:03 1

索性写一个系列贴子吧,方便大家系统学习,贴子我写随意点,以后在我自己站点上整理比较完整的


之前有发过求助贴子: 求佬们给一些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寸安卓屏上,出现了两个问题:



  1. 官方的代码,对芯片的支持判断有个小问题,需要修改下,目前我已经提PR在主分支上更新了( Support armv8l in Java API (#2556) · k2-fsa/sherpa-onnx@daac04b · GitHub )

  2. 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显卡,但是硬盘空间不够了,需要准备两个数据:



  1. 基础数据集:wenetspeech ,10000+ 小时的基础语音样本数据,估计要下载好久,下载前还要去这个机构申请下载权限,数据开源地址: GitHub - wenet-e2e/WenetSpeech: A 10000+ hours dataset for Chinese speech recognition

  2. 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


有看机会的请私我

最新回复 (19)
  • 深奥 09-25 11:09
    1

    强呀佬,感谢分享

  • 大帅哥 09-25 11:24
    2

    太强了,大佬

  • cocala 09-25 11:41
    3

    不容易,遇到同行了,不过我们在LLM出来之前就有做了,讯飞/思必驰的安卓集成方案都很成熟了,期待看到楼主后续的开发方案,不过被踢出群这个着实好笑,是因为提到逆向了嘛?

  • hwang 09-25 11:52
    4

    谢谢分享,说不定哪天就用上了

  • 奥托·阿波卡利斯 09-25 11:57
    5

    是不是你拍一拍群主,然后显示被移除群聊,后面看到了就真移除了 ^-^

  • 凌封小子 楼主 09-25 13:39
    6

    我猜是因为我发了科大讯飞的使用反馈,还发了一个报价截图,所以就踢我了(把我当其他服务推广商了?)

  • 奥托·阿波卡利斯 09-25 13:40
    7

    把你当广告佬了估计

  • 风戈 秦 09-25 13:55
    8

    直接用在线服务吧,感觉需求很像小智AI,可以看一下

  • 凌封小子 楼主 09-25 14:10
    9

    不能联公网的

  • 莫名 09-25 17:05
    10

    佬友,俺也在杭州

  • 凌封小子 楼主 09-25 17:08
    11

    幸会幸会

  • littlerookie 09-25 17:16
    12

    可以私有化部署呀,有开源实现。GitHub - xinnan-tech/xiaozhi-esp32-server: 本项目为xiaozhi-esp32提供后端服务,帮助您快速搭建ESP32设备控制服务器。Backend service for xiaozhi-esp32, helps you quickly build an ESP32 device control server.

  • littlerookie 09-25 17:19
    13

    关键词训练如果只剩下数据准备,那应该也不复杂吧,不是已经有自己的tts了吗,直接生成不就可以了。无论是用自己的声音克隆,还是用提示词生成,写好脚本,也不需要人工做啥了。

  • 凌封小子 楼主 09-25 17:52
    14

    这个单端点场景可以的,相当于关键词唤醒做到服务端去了,不过我这场景这样做,对服务端压力比较大了,办公室语音会一直录着请求服务端,端侧有300多台设备, 并发一直这样请求服务端受不了

  • 凌封小子 楼主 09-25 17:53
    15

    TTS不是文本转语音,我现在是人喊话,唤醒开始录音,功能点不一样的

  • 凌封小子 楼主 12-23 18:31
    16

    现在优化完成 stt llm tts ,都本地部署,对话速度上还可以

    不过又出来这个:Fun-Audio-Chat-8B,好像可以直接替换掉stt llm tts…

  • nullsnow 01-13 21:24
    17

    佬友 tts和asr本地了吗

  • 凌封小子 楼主 01-14 10:55
    18

    本地弄demo玩一下可以,但不能用于商业,准确率太低了…

  • 凌封小子 楼主 01-14 10:56
    19

    现在重构了客户端 和 服务端,按照那个开源小智项目的协议,基本上重做了

    细节点太多了,坑超级多,有空我得准备第三篇分享文章了

* 帖子来源Linux.do
返回