深入 WeKws 的 DS-TCN:深度可分离卷积如何把唤醒词模型压缩到 21K 参数
【免费下载链接】wekwsProduction First and Production Ready End-to-End Keyword Spotting Toolkit项目地址: https://gitcode.com/gh_mirrors/we/wekws
在智能音箱、耳机和 IoT 设备上,唤醒词检测(Wake-up Word Detection)通常需要常年驻留运行的极轻量模型:参数要少、算力要低、还得支持流式低延迟推理。WeKws 是一个 Production First 的端到端关键词唤醒工具包,其中的DS-TCN(Depthwise Separable TCN)骨干网络在 Hey Snips 数据集上把唤醒词模型参数压缩到了仅 21K,同时将误报率(FAR 固定为每小时一次时)的漏报率 FRR 压到 0.0197 左右。这篇文章带你拆解 DS-TCN 的压缩魔法,并给出实际训练配置。
为什么唤醒词模型必须"小而快"?
唤醒词模型常被部署在电池供电的嵌入式设备上,和语音助手主模型不同,它需要7×24 小时持续监听麦克风。这就对模型提出三个硬性要求:
- 📉参数少:几十 KB 以内,才能塞进单片机或低端 DSP
- ⚡算力低:每次推理的 MACs 要尽量小,省电
- 🔁可流式推理:只依赖历史帧,不允许 lookahead,延迟低
传统的卷积神经网络(CNN)虽然结构简单,但普通卷积的参数量和计算量随通道数平方增长,很难满足上述要求。DS-TCN 正是为了解决这个问题而设计的。
DS-TCN 的核心:深度可分离卷积(Depthwise Separable Convolution)
DS-TCN 的关键一招,是把普通卷积替换成深度可分离卷积,把一次标准卷积拆成两步:
- Depthwise 卷积:每个输入通道单独用一个卷积核做空间卷积,互不相通,参数仅
channel × kernel_size - Pointwise 卷积:用
1×1卷积把通道信息融合起来,参数为channel × channel
对比一下参数量(设通道数 C、卷积核大小 K):
- 普通 Conv1d:
C × C × K - 深度可分离:
C × K + C × C
当 K=8、C=64 时,普通卷积需要 32768 个参数,而深度可分离只需 512 + 4096 = 4608 个参数,压缩约 7 倍,而表达能力几乎不变。这就是"21K 参数"奇迹的数学基础。
在 WeKws 中,这个结构实现在wekws/model/tcn.py的DsCnnBlock里:
- 第一段:
Conv1d(channel, channel, kernel_size, groups=channel),即 depthwise 卷积 - 第二段:
Conv1d(channel, channel, kernel_size=1),即 pointwise 卷积 - 每段后面都跟
BatchNorm + ReLU,并加上 dropout 防止过拟合
每个 Block 还带残差连接(y = y + x),让 4 层堆叠的网络也能稳定收敛。tcn.py中的TCN类则负责按dilation = 2**i逐层递增膨胀率,用 4 层就获得指数级增长的感受野,既能覆盖整句唤醒词,又不会引入过多参数。
20 行 YAML 搭出 21K 参数的唤醒词模型
WeKws 的配置极其简洁,全部模型结构由一份 YAML 描述,训练脚本直接读取。以examples/hey_snips/s0/conf/ds_tcn.yaml为例,核心只有几行:
model: hidden_dim: 64 preprocessing: type: linear backbone: type: tcn ds: true num_layers: 4 kernel_size: 8 dropout: 0.1ds: true就是打开深度可分离开关,切换为DsCnnBlock- 4 层膨胀卷积 + 64 维隐藏层,就是 21K 参数的全部秘密
- 输入是 40 维 fbank 特征,经线性投影后进入 TCN 骨干
配上21K 参数,我们来验证一下账目(fbank 40 维输入):
| 模块 | 参数量(约) |
|---|---|
| 线性预处理 40→64 | 2.6K |
| 4 层 DsCnnBlock(64 通道,K=8) | 19.5K |
| 分类层 | 0.1K |
| 合计 | ≈ 21K |
可以看到,绝大部分参数都集中在骨干网络,而骨干又通过深度可分离卷积把体积压到了极限。
三种骨干如何切换:tcn / mdtc / fsmn
WeKws 的wekws/model/kws_model.py中的init_model函数负责根据配置构建完整模型:GlobalCMVN 归一化 → 预处理投影 → 骨干网络 → 分类器。骨干支持多种选择:
- tcn:标准 TCN,配合
ds: true即 DS-TCN,最省参数 - mdtc:多尺度深度可分离时序卷积(
wekws/model/mdtc.py),在examples/hey_snips/s0/conf/mdtc_small.yaml中约 31K 参数,FRR 可进一步降到 0.0087 - fsmn:适合需要更大上下文建模的场景
对于语音指令分类任务(如 Speech Command),还可以在配置里加classifier: global做全局平均池化后再分类。
一键训练到部署的完整流程
有了配置,训练到部署只需跑examples/hey_snips/s0/run.sh的 5 个阶段:
- Stage 0:用
local/prepare_data.py处理 Hey Snips 原始音频,生成data.list - Stage 1:
tools/compute_cmvn_stats.py计算全局 CMVN 统计量 - Stage 2:
torchrun启动多卡训练,--min_duration 50控制负样本切分 - Stage 3:
average_model.py平均最近 30 个 checkpoint,再用score.py+compute_det.py计算 FRR/FAR 指标 - Stage 4:
export_jit.py和export_onnx.py导出推理模型,可直接交给 runtime 端部署
训练完成后,模型可以导出为 ONNX 或 TorchScript 格式,配合runtime/目录下的 Android / 树莓派 / ONNX Runtime 前端,实现真正的端到端落地。tcn.py中的 Block 还内置了QuantStub/DeQuantStub和fuse_modules(),为后续 INT8 量化推理预留了通道——量化后模型还能再小 4 倍,真正为嵌入式场景而生。
小结
DS-TCN 用深度可分离卷积 + 膨胀因果卷积的组合,在参数规模和建模能力之间找到了绝佳平衡:21K 参数、流式推理、毫秒级延迟,让唤醒词检测可以毫无压力地跑在微控制器上。如果你正在做端到端关键词唤醒,不妨从 WeKws 的ds_tcn.yaml配置起步,几行 YAML 就能复现这个"21K 参数"的小模型。
【免费下载链接】wekwsProduction First and Production Ready End-to-End Keyword Spotting Toolkit项目地址: https://gitcode.com/gh_mirrors/we/wekws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考