电子说
# 给 Android 设备加个语音唤醒词:100KB 模型常驻监听,不费电不联网
## 为什么不直接买块语音模组
做硬件的朋友可能会问:现在海凌科、机芯智能的离线语音模组几块钱一片,为什么还要在 Android 上跑软件方案?
有时候 Android 设备不归你选——客户的硬件已经定了,主控就是一块安卓板。额外挂个模组需要飞线、改 PCB、调 BOM,老板不一定批。或者你做的其实是手机 App,纯软件,根本没法加外设。
这种情况就需要一个纯软件方案:不用改硬件、不打板子、一个 APK 搞定。
## 关键词识别(KWS)和通用 ASR 的区别
| | 通用 ASR | KWS |
|---|---------|-----|
| 能做什么 | 听懂任何话 | 只识别预设的几个词 |
| 模型大小 | 50-200 MB | **100 KB** |
| 是否常驻 | 不敢,耗电 | 可以,功耗 < 1mW |
| 离线可用 | 部分支持 | 完全离线 |
| 典型场景 | 自由对话 | 唤醒词 + 命令词 |
做车载助手、点餐机、智能开关面板这类 Android 终端,最常见的需求是"唤醒词 + 几个命令词",不是"自由对话"。这种情况用 KWS 就够了。
## 方案:onnx-wakeword
[onnx-wakeword](https://github.com/voicute/onnx-wakeword) 是一个轻量 KWS 推理引擎,Apache 2.0 开源,专为这个场景做的。
特点:
- 纯 ONNX Runtime,无其他依赖
- Android AAR 直接集成
- 内置五层防误触发逻辑
- 支持同时跑多个关键词模型
## Android 集成步骤
### 1. 添加依赖
```groovy
dependencies {
implementation 'com.microsoft.onnxruntime:onnxruntime-android:1.18.0'
}
把 ONNX 模型放到 assets/ 下:
assets/
├── melspectrogram.onnx # Mel 频谱提取(公共)
├── open_light.onnx # "打开灯光"
├── close_light.onnx # "关闭灯光"
└── model_info.json # 模型配置
模型从哪来?自己用 OpenWakeWord 训,或者去 听词 在线生成——输入关键词,几分钟出 ONNX。
WakeWordEngine engine = new WakeWordEngine(context);
engine.load("model_info.json", "melspectrogram.onnx");
engine.setCallback(new WakeWordCallback() {
@Override
public void onDetection(String word, float confidence) {
switch (word) {
case "打开灯光": turnOnLight(); break;
case "关闭灯光": turnOffLight(); break;
}
}
});
engine.start();
引擎内置了五层过滤,开发者不用自己写:
| 层 | 干嘛的 | 举例 |
|---|---|---|
| L1 | 连续帧确认 | 键盘"哒"一声不触发 |
| L2 | 峰值/背景比 | 安静环境底噪不幻觉 |
| L3 | 冷却 | 不会同一句话重复触发 |
| L4 | 爆发封锁 | 扬声器回声不会回路触发 |
| L5 | 能量跳变 | 背景音乐不误触 |
实测安静环境误触发 < 1 次/24h,带背景音乐 1-2 次/几小时。回调里直接写你的业务逻辑,不需要关心误触。
小米 14(骁龙 8 Gen2),Android 14:
| 指标 | 数值 |
|---|---|
| 模型大小 | ~130KB |
| 单帧推理 | < 5ms |
| 后台 CPU 占用 | < 1% |
| 内存 | ~20MB(含 ORT 运行时) |
| 安静环境误触发 | < 1 次/24h |
低端机型(骁龙 660)推理耗时约 15-20ms,照样远低于实时。
不需要改硬件、不需要开模、不需要挂外设。一个 APK 搞定离线语音唤醒。100KB 模型常驻监听,几乎不耗电。
开源推理引擎:[github.com/voicute/onnx-wakeword]
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !