DTW在语音唤醒中的应用

语音唤醒任务的一种常见解决方案是通过评估连续语音中分段时间窗内的音频特征和预先置入的关键词模板之间的相似性来决定系统是否唤醒,而DTW(动态时间规整算法)能够有效的衡量两个不等长序列之间的最短距离/相似性,因此在这类解决思路下被广泛使用。这里可以采用的特征有声学特征,后验特征,embedding特征或者BN特征等等,鲁棒的特征对最终的系统表现有着积极的影响。将连续语音和关键词模板之间的距离矩阵绘制出来(关键词模板在纵轴方向),可以得到如下的结果(使用的是MFCC特征)。图中蓝色的路径为最低代价下对齐/匹配路径。在唤醒系统中,我们将当前滑动窗下的最低匹配代价作为相似性打分,调出一个合理的阈值就可以做一个简单的唤醒演示系统了(实际表现中,打分平滑,模板平均等等还是有很多trick的)。

DTW算法是一种衡量两个不同长度的序列之间距离的一种算法,主要的思想是将序列元素之间通过某种规则对应起来得到等长序列,在计算这种情况下的距离。由于这种映射方式有很多种,DTW采用动态规划思想,每一次取最小距离代价的映射方案,以此获得最小的匹配距离以及对应的匹配方案。

定义序列$\boldsymbol{X}, \boldsymbol{Y}$,DTW算法可以找出一条匹配路径$\pi$满足:

令$D_{ij}$表示子序列$\boldsymbol{X}_{0 \to i}, \boldsymbol{Y}_{0 \to j}$的最小匹配距离,由动态规划思想,可以得到如下状态转移方程:

由此,可以在$O(n^2)$的时间复杂度内得到两个序列的最小匹配距离。该距离越小,表示序列相似度越高。在KWS任务中,$\boldsymbol{X}_i,\boldsymbol{Y}_j$表示的是声学特征或者因素后验,定义距离度量如下:

一般而言,对于声学特征采用余弦距离,对于后验特征采用内积度量。

以上是基本的DTW算法,对于KWS任务,最终的目标是从句子$\boldsymbol{U} = \{\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_U\}$中获取模板$\boldsymbol{T} = \{\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_T\}$可能出现的位置。而在实际的系统中,$U$要远远大于$T$,所以在应用中还是需要对DTW算法进行改进的。目前常见的方法是分段动态时间规整(SDTW)和分段局部正则(SLN-DTW)算法。

分段动态时间规整算法简单的理解(实际上论文中的表述不是这样)为通过设置一个滑动窗(窗长为$W$,窗移为$S$),在每一个滑动窗内,用标准DTW计算和模板的最小匹配距离。该方法计算复杂度较高(每$S$帧就要进行一次$O(n^2)$的计算),而且性能表现和窗长$W$以及窗移$S$相关。

分段局部正则(SLN-DTW)算法修改了标准DTW中的初始化方法,并且引入了平均距离作为距离度量方式,默认每一帧均可以作为最优匹配的起始点,这样无需通过句子切分得到匹配起点,也无需重新计算距离矩阵,极大的降低了算法 的计算复杂度。定义累积步长$S$, $\Theta = {(i - 1, j - 1), (i, j - 1), (i - 1, j)}$,初始化$D_{0j} = \text{dis}(\boldsymbol{T}_0, \boldsymbol{U}_j)$,$S_{0j} = 1$,则状态转移方程修正为:

其中

在关键词只出现一次的情况下,回溯位置$j = \underset{j}{\text{argmin}}\{D_{Tj}, 0 \leqslant j \leqslant U\}$处的得到的最优路径作为最优匹配路径。

在实验中,SLN-DTW效率和准确性上要优于前者。