多唤醒词方案 — 一个模型识别多个唤醒词
唤醒词为什么不止一个
"唤醒词"和"命令词"不一样:命令词是让设备做事(播放、暂停、开灯),唤醒词是让设备听你说话。所以多唤醒词的需求也很不一样——
- 一家人各有各的叫法:爸爸习惯叫"小悠",孩子喜欢喊"小娜",老人就认"你好小悠"。一个设备装一个模型,谁喊都能应,不用抢。
- 一个固件,多个产品型号:同一套硬件出了三个 SKU,各自要不同的品牌唤醒词。一块模型全包了,产线只刷一次固件。
- 换唤醒词不用返厂:传统离线方案改个唤醒词要重新烧录,甚至返厂。模型里多放几个候选词,现场改配置文件就能切换。
- 一个词的多种叫法:品牌名"小瑞"经常被叫成"小瑞小瑞""你好小瑞",把各种叫法都放进模型,用户怎么说都能唤醒。
一个模型 vs 一堆模型
多唤醒词最怕的误区是"几个词就训几个模型"。那样部署麻烦不说,N 个模型 N 次推理,在 ESP32 这类资源受限的平台上根本跑不动。正确的做法是一个模型里放多个唤醒词:
| 每词一个模型 | 一个多唤醒词模型 | |
|---|---|---|
| 部署文件 | N 个 ONNX | 1 个 ONNX |
| 10 个词的体积 | ~1.28 MB | 167 KB |
| 推理次数 | N 次 | 1 次,同时出全部结果 |
| 词间误触发 | 没有约束,容易混 | 一起训练,天然区分 |
| 切换唤醒词 | 换模型文件 | 改一行配置 |
换唤醒词,改配置就行
多唤醒词模型配套一个 model_info.json,每个词是一条配置:
{
"model_type": "dscnn",
"mel_time": 98,
"multi_model": true,
"models": [
{"wake_word": "小悠", "model_file": "xiaoyou.onnx", "cons_frames": 2},
{"wake_word": "小娜", "model_file": "xiaona.onnx", "cons_frames": 2},
{"wake_word": "你好小悠", "model_file": "nihaoxiaoyou.onnx", "cons_frames": 2}
]
}
设备默认监听全部词;只想启用其中一两个,把配置里的条目删掉就行,不用重新训练,也不用动固件。这就是"多唤醒词一个模型"对产品最实际的价值:把换词的自由留给了你自己。
误触发怎么办
词多了,误触发的面也大了,这是多唤醒词最该关心的问题。两道保险:
- 训练侧:多个唤醒词在同一个模型里一起训练,互相就是对方的"负样本",词与词之间天然分得开。上线后跑一轮 R1 误触发优化,实测每小时误触发从三百多次降到个位数(平均降幅约 95%)。
- 推理侧:开源推理引擎内置 5 层防误触发检测(连续帧过滤、冷却、能量跳变等),按场景开关。
哪些场景适合多唤醒词
| 场景 | 唤醒词举例 | 推荐词数 |
|---|---|---|
| 家用音箱 / 智能家居 | 小悠 / 小娜 / 你好小悠 | 2-4 个 |
| 多 SKU 产品线 | 各型号的品牌唤醒词 | 3-6 个 |
| 玩具 / 教育硬件 | 角色名 + 各种昵称叫法 | 3-8 个 |
| 车载 | 品牌词 + 中英文两种叫法 | 2-4 个 |
| 机器人 | 名字 + 名字叠词 | 2-5 个 |
怎么拿到模型
在 听词 Voicute 选"多关键词",把唤醒词用逗号分隔填进去(比如"小悠,小娜,你好小悠"),TTS 自动合成训练语音,十来分钟出模型。2-10 个词一个模型,价格按词数分档:3 词 ¥169、5 词 ¥199、8 词 ¥249、10 词 ¥299,一次付费不限设备数量。
模型是标准 ONNX 格式,配合 开源推理引擎 onnx-wakeword,Android / Linux / Windows / Web / ESP32 全平台离线运行。如果要识别"播放、暂停"这类动作词,看这篇 多命令词识别方案。
生成你的多唤醒词模型 →