SMALL-FOOTPRINT KEYWORD SPOTTING USING DEEP NEURAL NETWORKS
Date: 2021.8.17
Author: Xin Pan
摘要
我们的应用需要一个KWS系统,这个系统需要满足这些条件。内存占用小,计算消耗小,高精度。为了满足这些条件,我们提出了一个基于DNN的方法。训练一个直接预测关键词或者关键词字词单元的DNN,后边接一个后验概率处理方法产生最终的置信度得分。对比传统的HMM系统,该系统达到45%相对的性能提升,同时在babble噪声下达到39%的相对性能提升。
想解决的问题
一个能够运行在移动设备的高精度,低延迟,低内存消耗的KWS系统。KWS是为了检测音频中的预定义关键词
准备知识
在传统的HMM-Filler模型中,每个关键词有一个自己的HMM,用其他的非关键词训练一个Filler模型。在解码过程中使用Viterbi解码,但是在HMM topo上的解码很消耗计算资源。
方法
作者给这个方法起名叫做DeepKWS,14年那时候的论文都喜欢叫做Deep阿巴阿巴的哈哈。
DeepKWS尝试直接预测关键词或者关键词的子词单元,再用一个后续的后验概率处理单元处理得到置信度分数。这个方法的好处就是不需要序列搜索(解码),序列解码那么势必就会导致一个问题就是整句解码的延迟会比较高。因此呢本方案就是每10毫秒做一次决策。
首先利用VAD将非静音区分出去,之后论文详细介绍了VAD怎么做的。这里不再讨论。
特征提取
本方法在所有的语音区内提取40-dim FBbank,窗长25ms,每10ms计算一次。将相邻的帧堆叠一起构成了上下文相关的输入帧。这里的输入窗是不对称的,为什么呢? 因为每增加一个未来帧都会增加10ms的一个延迟。实验中该方案使用30过去帧+10未来帧。论文里说这么做是最好的平衡了精度延迟和计算量。
DNN设计
labeling
基线系统的HMM系统,NN的label是CD(context-dependent) HMM状态。更具体的就是基线系统使用2002个CD状态。
对于提出的DeepKWS系统,label可以表示完全的关键词或者关键词额子词单元。后边的实验结果是完全关键词的因为它超过了子词建模单元。
标签是怎么产生的呢? 本文使用一个50M参数的LVCSR系统做了强制对齐,使用完整的词作为标签而不是HMM状态。这么做是有优点的:
- 更小的输出标签就更节省空间,因为最后一层的单元少了;
- 一个简单的后验决策就可以完成决策过程;
- 全词模型可以有更好的性能。
训练
最大化CE loss作为目标,公式如下
F
(
θ
)
=
∑
j
l
o
g
P
i
j
F(\theta)=\sum_j{log P_{ij}}
F(θ)=j∑logPij
表示的是
x
j
x_j
xj j帧的DNN后验输出在第
i
t
h
i^{th}
ithlabel上的概率就是
P
i
j
P_{ij}
Pij。在优化的过程中使用了SGD和learning rate decay。
后验处理
这里是说怎么把DNN的后验处理为置信度。其实决策很简单就是如果置信超过一个预定义的值就激活决策。这里作者假设只针对一个词做置信度决策,因为他可以很简单的扩展到多个关键词上。、
后验平滑
接下来的解释就很有意思了。我还真是不理解作者说从DNN出来的值是噪声(noisy),这里是说有毛刺或者说跳变的意思吗?
TODO
- 检查这个noisy到底是什么意思呢?
为了解决这个问题也是很简单的就在一个长度
w
s
m
o
o
t
h
w_{smooth}
wsmooth的窗内做平滑。假设
p
i
j
′
p'_{ij}
pij′就是平滑后的后验:
p
i
j
′
=
1
j
−
h
s
m
o
o
t
h
+
1
∑
k
=
h
s
m
o
o
t
h
j
p
i
l
p'_{ij}=\frac{1}{j-h_{smooth}+1}\sum^{j}_{k=h_{smooth}}p_{il}
pij′=j−hsmooth+11k=hsmooth∑jpil
其中的
h
s
m
o
o
t
h
=
m
a
x
(
1
,
j
−
w
s
m
o
o
t
h
+
1
)
h_{smooth}=max(1,j-w_{smooth}+1)
hsmooth=max(1,j−wsmooth+1)就是窗内第一帧的索引。这个窗是在frame这个维度上的,在frame那个维度上做滑动的平均。自己刚才推了一次大概上是那个样子的。
置信度计算
这置信度计算有点意思啊我草。第
j
t
h
j^{th}
jth的置信度是这么计算的
c
o
n
f
i
d
e
n
c
e
=
∏
i
=
1
n
−
1
max
h
m
a
x
≤
k
≤
j
p
i
k
′
n
−
1
confidence=\sqrt[n-1]{\prod_{i=1}^{n-1}\max_{h_{max}\leq{k}\leq{j}}p'_{ik}}
confidence=n−1i=1∏n−1hmax≤k≤jmaxpik′
其中
h
m
a
x
=
m
a
x
(
1
,
j
−
w
m
a
x
+
1
)
h_{max}=max(1,j-w_{max}+1)
hmax=max(1,j−wmax+1)是窗内的第一个索引。实验中
w
s
m
o
o
t
h
=
30
w_{smooth}=30
wsmooth=30,
w
m
a
x
=
100
w_{max}=100
wmax=100。然而实际上新能对于窗的大小并不十分的敏感,上下帧输入的堆叠帮助编码了上下文信息。
后来和同事讨论了一下,觉得这里的confidence计算就是通过计算每个i维度在窗内中最大值,最后把所有的最大值相乘得到了最后的confidence。
基线系统
基线系统使用的是标准keyword-filler HMM系统。Filler模型的构建有几个方法。从全连接的音素单元到完全您的LVCSR系统,其中的词典是除去了关键词的。后边的这个系统明显得到了更好一点的性能。但是这个办法的缺点就是消耗计算资源和内存以及速度会慢。因此本文实现了一种三音素HMM作为filler。
数据集
训练集
- 3000小时通用数据,代号为VS;
- 特定的关键词数据,代号KWS。每个关键词2.3k正样本,133k负样本。
数据集大概包括这些关键词。对于“ok google”这个关键词有40k正样本用于训练。
测试集
每个关键词有1k正样本,70k负样本。正样本和负样本比例是1.4%。对于关键词“ok google”有2.2k正样本。
噪音数据使用的是babble噪声以10db进行仿真。
结果对比
首先这里放上一个论文的截图。
本文对比HMM-DNN和DeepKWS两种方法中的KWS系统,两个模型的DNN部分使用相同的网络结构,但是输出层单元和输入的上下文维度不一样。这就导致两个模型的参数量不一样,HMM-DNN是373K参数,而DeepKWS是244K。
从图3可以看出来,使用一个voice search corpus(我其实认为这就是一个一般的ASR数据)就是VS那个结果训练测试。相比于用VS+KWS的方式是差很多的。那么从实验的分析中可以看出来最好的就是用ASR pretrain 再去用一个KWS去fine-tuning的这种方法是最好的。
之后把模型的结构增加之后,KWS直接训练的模型效果不好了,究其原因是因为数据少不能支撑起现在的这个模型。
从图5,后边作者还在噪音环境下进行了测试结果就是也变好了。
评价指标
ROC曲线,包括false alarm 和false reject。
总结
作者提出的DeepKWS这个模型在干净环境和噪声环境下都是超过了传统的HMM的方案。但是现在的应用只是一个是/否的决策,不能够对关键词的截止时间进行建模。这是作者认为的一个缺点。
附言
很抱歉大家,因为单位购买数据库有版权问题我不能把论文全文放在这里,但是还是欢迎大家一起讨论。论文原文请前往IEEE官网或其他网站搜索阅读。