本文主要是介绍【笔记】Small-footprint Keyword Spotting Using Deep Neural Networks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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官网或其他网站搜索阅读。
这篇关于【笔记】Small-footprint Keyword Spotting Using Deep Neural Networks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!