如何永久运行Speech Recognizer实现“OK Phone”唤醒词功能
Google「OK Google」持续唤醒的实现逻辑
Google的唤醒能力是硬件+系统层面协同优化的专属能力,并非调用上层SpeechRecognizer接口实现:设备的低功耗音频DSP会常驻后台运行,提前预置唤醒词的声学特征模型,实时匹配麦克风拾取到的音频流,只有特征匹配成功才会唤醒上层服务调用完整的语音识别能力,全程不存在两次监听的间隙问题,该能力暂不对外开放给第三方应用直接调用。
可行实现方案
- 方案1:拆分「离线唤醒词检测+云端全量识别」两步流程,平衡准确率和性能
舍弃老旧的PocketSphinx库,改用专门的离线唤醒词检测引擎做第一步常驻监听,这类引擎针对短唤醒词做了专门优化,自定义「OK Phone」作为唤醒词的准确率远高于PocketSphinx,功耗极低可后台常驻。仅当唤醒词匹配成功后,再调用Google官方SpeechRecognizer做后续指令识别,既解决了连续监听的间隙问题,也能复用官方识别的高准确率。 - 方案2:优化
SpeechRecognizer循环调用逻辑,压缩监听间隙
之前的方案间隙大是因为等待上一次识别返回结果后才启动下一次监听,可采用双实例交替衔接的方式优化:提前初始化两个SpeechRecognizer实例,在上一个实例触发onPartialResults回调时就做好下一个实例的准备工作,上一个实例的onResults回调触发的瞬间立刻启动下一个实例的startListening(),可将监听间隙压缩到100ms以内,用户几乎感知不到空白。该方案的缺点是功耗较高,仅适合应用在前台运行的场景,后台驻留容易被系统回收。 - 方案3:适配Android 12+系统,调用系统官方
VoiceInteractionServiceAPI
该API是系统开放给语音助手类应用的专属接口,申请对应权限后可直接注册自定义唤醒词,由系统底层完成持续监听逻辑,匹配到唤醒词后会直接给应用发送回调,不需要自行处理音频录制、识别衔接的问题,稳定性最高。缺点是权限申请门槛较高,仅支持Android 12及以上的系统版本。
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

