Flutter 下的语音识别方案
最近在做龙与地下城角色卡APP,因为手动输入投骰子数量会比较麻烦,想尝试使用语音识别来自动计算投骰子的结果。调研后发现这个效果Flutter上实现还是比较麻烦的。目前查到了三种包:
- speech_to_text
- sherpa-onnx
- speech_xf
speech_to_text
第一项是叫做 speech_to_text 的库,这个库在Flutter中比较流行,它调用的是安卓端内置的语音识别。我手上的Pixel 6设备和模拟器都能够正常识别,但是对于国产手机来说,可能没有安装谷歌服务,导致需要进行配置。参考GitHub上的方案进行配置之后,并没有成功。
sherpa-onnx
第二项是 sherpa-onnx,这个库定义了一个跨端的方法,其优势在于离线识别,不需要网络参与。参考这个库的官方demo实现了一个基本的例子,发现识别比较好的模型需要的容量可能达到200MB到500MB,而移动端小型模型的尺寸可能在50MB左右。现阶段,不考虑语音识别模型的尺寸,我未优化的打包程序其实也是50MB。这样的应用体积代价是我基本不能承受的。
不管怎样,我找了一个官方提供的预训练模型 sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23-mobile,这是一个比较小的用于移动端设备的模型。随后用这个数据进行了测试,发现响应速度比较快,但精度并不是很高,可能会有漏识别的情况。
随后我发现,对我来说最严重的问题是,我的目标功能需要用户说出类似“3D8”这样的输入进行语音识别。但这样的输入在语音识别模型训练集中可能比较少,导致识别时倾向于修改成其他结果。现在手机上有一些方法可以做一些纠正,比方说根据上下文和句子的连贯程度调整识别结果。我在带有修正的讯飞输入法上进行了测试,发现输入“3D8”这样的内容时效果仍旧不太好。至此,我基本放弃了语音识别的方案。
speech_xf
speech_xf 是集成了讯飞语音识别的库,通过联网访问API进行识别。我没有进行更进一步的测试,因为我感觉对我当前的需求来说,这不是一个合适的解决方案。我接下来的计划是调整UI设计,看看能不能在UI设计上加一些功能,让我能够快速创建指定数量的骰子。