4. 唤醒词模型架构:经典DNN架构、CNN架构、TCNN(时间卷积网络)、CRNN(卷积循环网络)

好,咱们进入正题。唤醒词模型到底长什么样?说白了,就是怎么把一段声音信号,变成「是/否」的判断。我这些年折腾过不少架构,从最土的DNN到现在的CRNN,踩过的坑能写本书。今天就把四种主流架构掰开揉碎了讲给你听。

4.1 经典DNN架构:简单粗暴,但够用

先说说最基础的DNN。你想想看,2014年左右那会儿,大家刚把深度学习用到语音上,思路特别直接——把音频切成帧,每帧提个MFCC特征,然后堆几个全连接层完事。

核心思路: 把时序问题当成静态问题处理。每帧独立判断,最后用平滑策略做决策。

我记得第一次做唤醒词项目,用的就是三层DNN。结构大概是这样的:

输入层: 40维MFCC特征(每帧)
隐藏层1: 256个神经元,ReLU激活
隐藏层2: 128个神经元,ReLU激活
隐藏层3: 64个神经元,ReLU激活
输出层: 2个神经元(唤醒词/非唤醒词),Softmax

嗯,这里要注意——DNN有个致命问题:它完全不考虑时序上下文。你想想看,一个「你好」的发音,前后帧是有依赖关系的。DNN把每帧割裂开,就像看电影只看单帧画面,当然容易误判。

我的经验: 如果资源极度受限(比如只有几十KB的Flash),DNN还是能打的。我在一个低功耗蓝牙耳机项目里用过,配合简单的状态机做后处理,准确率也能到90%以上。

4.2 CNN架构:引入局部感受野

后来大家发现,语音的时频图其实很像图像。那为什么不把卷积神经网络搬过来呢?

CNN的好处很明显:它能捕捉局部模式。比如「小爱同学」这个唤醒词,「小」和「爱」之间的过渡特征,CNN通过卷积核就能学到。

我常用的一个轻量级CNN结构:

输入: 40x20的时频图(40维MFCC,20帧上下文)
Conv1: 3x3卷积,32通道,ReLU + BN
Conv2: 3x3卷积,64通道,ReLU + BN
Conv3: 3x3卷积,128通道,ReLU + BN
全局平均池化
全连接层: 128 -> 2

说实话,CNN比DNN强不少。我在项目中做过对比,同样的训练数据,CNN的唤醒率能提升5-8个点,虚警率降低一半。

避坑指南: 我曾经在CNN里堆了太多层,结果模型在低信噪比环境下反而变差了。后来发现是过拟合了噪声模式。建议CNN不超过4层卷积,否则小模型容易学歪。

4.3 TCNN(时间卷积网络):因果卷积的妙用

TCNN,说白了就是带因果约束的CNN。为什么要加因果?你想想看,唤醒词模型是实时运行的——当前时刻的输出,只能依赖过去和现在的信息,不能看未来的帧。

标准CNN是双向的,它会「偷看」未来的帧。这在离线任务里没问题,但在线推理时就露馅了。TCNN通过因果卷积解决了这个问题:

因果卷积: 输出t时刻的值,只依赖输入t, t-1, t-2,... 的帧
空洞卷积: 通过跳步扩大感受野,比如dilation=2时,能看到t, t-2, t-4

我个人习惯用WaveNet那种堆叠空洞卷积的方式。举个例子:

输入: 40维MFCC序列
Conv1: 因果卷积,kernel=3,dilation=1,64通道
Conv2: 因果卷积,kernel=3,dilation=2,64通道
Conv3: 因果卷积,kernel=3,dilation=4,64通道
Conv4: 因果卷积,kernel=3,dilation=8,64通道
输出: 2维(每帧一个预测)

这样做的好处是感受野指数级增长。4层卷积就能看到1+2+4+8=15帧的上下文,而参数只增加了线性量。

关键点: TCNN特别适合对延迟敏感的场景。我在智能音箱项目里用过,端到端延迟能控制在50ms以内,比后面要讲的CRNN快不少。

4.4 CRNN(卷积循环网络):时序建模的王者

最后说说CRNN,这基本是现在唤醒词模型的标配了。它把CNN和RNN结合起来——CNN负责提取局部特征,RNN负责建模长时序依赖

我常用的CRNN结构:

输入: 40维MFCC序列(比如100帧)
CNN部分:
  Conv1: 3x3卷积,32通道,ReLU + BN
  Conv2: 3x3卷积,64通道,ReLU + BN
  时间降采样: stride=2(帧数减半)
RNN部分:
  GRU层: 128个隐藏单元(双向或单向)
  或者用LSTM,看你的偏好
输出层:
  全连接: 128 -> 2
  每帧输出一个预测分数

为什么CRNN强?因为唤醒词通常有0.5-1秒的时长,CNN的感受野有限,而RNN理论上能记住整个序列。我在实际项目里测过,CRNN比纯CNN的唤醒率高出3-5个点,尤其是在口音变化大的场景下。

我的建议: 如果设备算力允许,优先选CRNN。但要注意——双向RNN在实时推理时会有延迟,因为要看未来帧。我一般用单向GRU,配合适当的上下文窗口,效果和双向差不多,延迟还低。

4.5 四种架构对比总结

好了,四种架构都讲完了。我整理了个表格,方便你对比:

架构 时序建模能力 参数量 推理延迟 适合场景
DNN 弱(无上下文) 资源极度受限
CNN 中(局部上下文) 中等算力设备
TCNN 较强(因果时序) 低延迟在线推理
CRNN 强(长时序依赖) 高精度唤醒

说实话,没有银弹。我见过有人用DNN做得很好的,也见过CRNN翻车的。关键还是看你的硬件约束和场景需求。嗯,下一章咱们聊聊怎么选型,以及实际部署时要注意的那些坑。