Android 离线语音控制实战:不用云 ASR 识别固定命令
如果 App 只需识别“拍照、停止、下一页、返回”等固定命令,可以在手机本地运行多关键词模型,检测后直接调用 UI 方法,无需上传音频或生成完整转录。
准备模型和工程
先生成包含目标命令的 ONNX 多关键词模型,再打开开源仓库的 android/ Android Studio Demo。工程已经包含麦克风采集、Mel 特征、ONNX 推理和检测后处理。
git clone https://github.com/voicute/onnx-wakeword.git
# 用 Android Studio 打开 android/
把命令映射为 UI 动作
private void handleCommand(String word) {
switch (word) {
case "拍照": capturePhoto(); break;
case "下一页": showNextPage(); break;
case "返回": onBackPressed(); break;
case "停止": stopCurrentAction(); break;
}
}推理线程检测到关键词后,应切换到主线程更新界面。识别词表与业务权限应分离:删除、支付、解锁等动作不能因为一次语音检测直接执行。
权限和生命周期
- 在清单和运行时申请
RECORD_AUDIO,清楚解释麦克风用途; - 页面退出或功能关闭时停止录音并释放资源;
- 只有用户明确需要持续监听时才考虑前台服务;
- 在真机测量功耗后,才能决定是否适合后台常驻。
调试顺序
- 确认模型和配置文件成功加载。
- 确认音频为 16 kHz、16-bit、单声道且不是全零。
- 先观察目标词和安静环境的原始分数。
- 再调整连续帧、阈值、冷却和能量过滤。
- 最后用相似词、电视声和不同说话人做回归测试。
当前实现边界:开源 Android Demo 使用 ONNX Runtime。平台可以导出 TFLite,但仓库目前没有完整的 Android TFLite SDK,不应混为一谈。
生成 Android 多命令词模型