ONNX 唤醒词模型怎么训练?从准备数据到导出 ONNX 的完整链路
先说一个常见的误解
一提到"训练模型",很多人脑子里跳出来的是:GPU、几万条数据、一个算法团队。
于是小团队做语音产品,直接在"自己训"这一步就被劝退了——转头去买几十万的 ASR 授权,或者绑芯片的硬件模组。
但唤醒词模型不是这么训的。它跟通用语音识别(ASR)是两码事,训一个能用的 ONNX 唤醒词模型,远没有你想的那么重。
这篇文章把ONNX 唤醒词模型怎么训练从头讲清楚:链路怎么走、每一步的坑在哪、以及不想自己训的话还有什么省事的路。
先分清:训的是 KWS,不是 ASR
很多人以为"识别一句话"就是语音识别,但唤醒词模型解决的是完全不同的任务。
| 唤醒词 / KWS | 语音识别 ASR | |
|---|---|---|
| 任务 | 只判断"某个固定词有没有出现" | 把整句话转成文字 |
| 模型大小 | 100KB ~ 2MB | 50MB ~ 200MB |
| 单次推理 | < 5ms | 200 ~ 500ms |
| 运行方式 | 常驻监听、低功耗 | 唤醒后才启动 |
| 典型场景 | “小爱同学”、命令词开关灯 | 语音输入、对话理解 |
一句话:产品只需要识别 2~10 个固定词,就用 KWS,别上 ASR。又省资源又快。
导出成 ONNX 是因为它能被 onnxruntime 在 Android、Linux、Windows、Web(WASM)、ESP32 上统一跑——一套模型,到处部署。
训练一条链路,五步走
想好唤醒词 │ ▼ ① 准备数据 —— 正样本(唤醒词)+ 负样本(噪声、其他语音) │ ▼ ② 特征提取 —— 音频 → Mel 频谱 │ ▼ ③ 训练模型 —— 一个小 DSCNN 就够 │ ▼ ④ 评估 —— 只看 recall 和误触发 │ ▼ ⑤ 导出 ONNX —— onnxruntime 到处跑① 准备数据:最费劲的一步
正样本是唤醒词的音频,要覆盖不同说话人、不同口音、不同距离音量。一般用 TTS 合成 + 真人录音混合。
负样本是除了唤醒词之外的一切——普通话/方言、噪声、音乐、键盘声。负样本的质量直接决定误触发率。
再加点数据增强(加噪、变速、混响),模拟真实环境。
这一步是 DIY 最大的坑:要凑出高质量的多说话人数据,通常得几小时到几十小时音频,小团队根本拿不出来。
② 特征提取:音频转 Mel 频谱
模型不吃原始波形,先算 Mel 频谱(或 MFCC)。参数基本固定:16kHz 采样、单声道、25ms 窗、10ms 跳、几十个 mel 频带。这段是标准套路,照着抄就行,没什么好纠结的。
③ 训练:一个小 DSCNN 就够
唤醒词模型常用 DSCNN(深度可分离卷积)——参数少、跑得快。正样本标 1、负样本标 0,做二分类,几个 epoch 就收敛。
训练命令(示意): --word "打开灯光" --negative /data/noise --epochs 60真实工程里还会加 SpecAugment、更深的 block、以及困难负样本挖掘(hard negative mining)。这里只讲链路,不展开。
④ 评估:只看两个指标
- Recall(召回率):喊唤醒词 10 次,正确识别几次。上线至少要 90%+,理想 95%。
- FA/h(每小时误触发):放着不喊,一小时内误唤醒几次。上线要压到 1 以内。
这两个指标互相拉锯:想多识别就得多容忍误触发,反之亦然。
⑤ 导出 ONNX
训练完把模型 export 成 ONNX,配 onnxruntime 加载。部署侧几行代码就能跑:
importonnxruntimeasort sess=ort.InferenceSession("wake_word.onnx",providers=["CPUExecutionProvider"])prob=sess.run(["output"],{"input":mel_input})[0]ifprob>0.5:trigger_wake_word()每一步的坑:能训出来 ≠ 能上线
上面这条链路看着不难,但"训出一个能跑 demo 的模型"和"训出一个能交给用户用的模型",中间隔着一条鸿沟:
数据量是硬门槛。多说话人 + 海量负样本,普通人没有这个数据资源。
非英文尤其难。主流开源方案(如 OpenWakeWord)官方只支持英文,因为训练数据基于英文 TTS。要训法语、中文(声调语言更难)、日语,得自己找对应语言 TTS,精度还要打折扣。
以 OpenWakeWord 社区公开的模型评估数据为例,很多模型的Recall 只有 40%~60%,非英文模型的FA/h 甚至高达每小时几十次。这个水平自己玩玩可以,给产品上线就是灾难——喊三次漏两次、没事自己乱触发,用户直接退货。
调参是个无底洞。连续帧过滤、阈值、冷却、防误触发逻辑……每个都影响最终体验,都得自己反复试。
不想自己训,一条更省事的路
如果不想搭上面这一整套(数据 + 特征 + 训练 + 调参),也有更省事的选择:输入关键词,系统自动训,十分钟直接出 ONNX。
输入关键词(如"打开灯光") → 自动 TTS 合成多说话人数据 + 数据增强 → 云端自动训练 → 10~20 分钟下载标准 ONNX 模型几个对开发者比较关键的点:
- 模型小、快:100~170KB,推理 < 5ms,完全离线,不依赖云端。
- 多语言:中文、英文逐步覆盖——这是自训最难、也最省事的地方。
- 跨平台:导出的 ONNX 配合开源引擎,Android / Linux / Windows / macOS / ESP32 / Web 六端统一部署。
- 可商用:生成的模型免费授权商用,不限设备数。
拿到模型后用法跟上面一样:onnxruntime 加载 → 喂 Mel 频谱 → 拿概率 → 阈值判断。
最后
| 你的情况 | 建议 |
|---|---|
| 有数据、有 ML 基础、想完全自控 | 自己训:五步链路 + DSCNN |
| 要英文唤醒词、能接受调参折腾 | 用 OpenWakeWord 等开源方案 |
| 要非英文、要快、要能商用上线 | 一键方案:输入关键词直接出 ONNX |
ONNX 唤醒词模型怎么训练,核心难点从来不是模型结构,而是数据 + 非英文 + 把 recall/误触发调到能上线。想清楚自己在这三点上有多少投入,就知道该走哪条路了。
在线训练:www.voicute.com
推理引擎:github.com/voicute/onnx-wakeword(Apache 2.0 开源)