随着技术的迭代,目前来说TTS和STT 已经非常完善了,无论是国内的在线版本,还是github 上的那些离线版本,对于应用层来说,TTS服务蛮常见的,比如说 现在的听书软件,核心就是TTS服务,将文本转换为语音,中文存在多音字,所以语义分析就很重要了,像微信读书这种,感觉就不是太强,偶尔有,偶尔没有。
在华为的无障碍服务中就提到了,提供音频提示,在大的方向上就两种,一种是本地离线文件,一种就是TTS服务了,离线文件就是直接播文件,这个没有啥技术难点,TTS则是我们需要考虑的问题,一种是通过action查询本机已有的TTS服务,一种就是自己搞一个在线或离线的TTS服务,然后自己用,因为我们业务特性,所以搞了一个离线版本。
TTS
tts 其实是文字转语音服务,Android 其实是内置了APi的,可以自己基于action 自己实现,也可以通过action查找其他应用的服务,国内很多东西都被干没了,所以这个可能也在其中,解决方案就几种:
- 搞一个支持TTS的app,安装到手机,然后调用这个app的TTS。
- 搞国内的付费服务,比如说讯飞。
- 自己搞服务器,然后让后端生成,然后做缓存文件。
- 在github 上找一个离线版本的中文tts,缺点就是吃内存。
结合业务诉求,我们选择了离线版本,用的是
github.com/benjaminwan… 反正就改吧改吧就用了,对外就说遥遥领先。
tts 服务的action是:
android.intent.action.TTS_SERVICE
我们通过PMS 直接获取可用的即可,剩下的就是通过包名调用对应的TTS服务即可,然后回收内存。
至于为什么要先说TTS,这和标题不符合,这主要是之前和一个大佬沟通有关,大佬说了很多,我记下来的不多大概就这么点:
最简单的中文TTS就是搞一大堆字母的pcm到本地,然后把中文转拼音,通过拼音去查询对应的pcm,然后读出来。那么音色啥的,都可以通过pcm 文件去控制,优点是你能理解,缺点就是用户体验不好。
stt
STT 是语音转文字,这个第三方的也有,离线的也有,但是直接使用的场景不多的:
- 翻译软件
- 语音助手
- 唤醒词
这个功能都是差不多的感觉,主要是基于不同的业务进行拆分。而STT则只是在这业务场景中的第一环,直接使用STT是比较难进行业务闭环的。stt 的离线服务比如就有vosk,这个Android 离线代码拖过来就直接用了。
唤醒词
这个经过大佬指点,说有两个版本,一个版本是硬件版本,一个是基于STT结合分词器版本,唤醒词常见的就是语音助手,要喊个特定的词语就直接唤醒,一种是麦克风里面有一个固定的硬件(芯片,说的是最早是在遥控器上),硬件我完全不懂,我们直接还是基于STT,国内讯飞的就有离线版本,当然还是付费。
为什么说,stt不容易形成业务闭环,因为只有文本,代码很难去理解到用户想要干什么,那么基于分词器的概念就很重要了,这不仅仅是技术上的分词概念,而是基于业务的分词概念,我们从用户的语言中提取关键信息,然后去执行对应的操作,比如说,‘回到首页’这句话中文可以好几种表达方式去表达相同的意思,但是首页是目的地是不变的,结合用户表达习惯,部分地区会习惯性的加上一些前缀或后缀,这才是分词器的关键。
通过分词器的逻辑,我们通过定义业务中的关键操作(好像叫槽位),提取正确的结果,所以槽位的中的内容直接影响到了识别率。