=
其中的 = , 由式(6)决定。
= (6)
基于上述的思想就可以从出发点搜索,搜索过程中对每一个格点都存储相应的前一格点及相应的帧匹配距离。搜索结束,只保留一条最佳路径。这套DP算法就是所谓的DTW算法,DTW算法流程图如图6所示。
图6 DTW算法流程图
2.4.4 DTW算法的概述
首先假设2个n m的矩阵D和d,分别代表累计距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数目,以之分别作为二文坐标形成一个纵横交叉的网格。然后通过一个循环算法计算2个模板的帧匹配距离矩阵。紧接着对整个网格进行动态规划,为每个格点(i,j)都计算3个可能的前续格点的累积距离D1,D2,D3。自然有边界格点问题要考虑,比如有些格点的前续格点是不存在的,为这些特殊格点要加用一些判断条件。最后可利用函数min找到3个前续格点的最小累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直循环重复到最终格点(n,m),并将D(n,m)输出,作为模板匹配的最终结果[14]。
2.4.5 DTW算法的缺点
首先,传统的DTW需要存储较大的矩阵,直接计算会占据较大的空间,计算量也比较大,故而必然对系统硬件要求比较高[15]。
DTW算法在词汇表较小以及各个词条之间不容易混淆的情况下的应用是具有优越性的,这也只是在由于其只是简单的模板匹配。如果说应用与连续语音大量词汇量的场合,就需要建立一个大的模板库,如果词表更换,就要求重新采集大量数据,重新训练模板,训练好的模板都摆脱不了具有特定人的局限性。就不能保证词条与词条之间的较大差异,DTW算法的优势就会衰减甚至是得不到体现。如果是应用与连续语音的语句识别,模板与待识别语音的时域长度的差距范围也会增大,词条与词条之间的时域差距给语音识别带来新的更为复杂的难题,用DTW识别效果则更为不佳。
2.4.6 程序运行流程
程序运行,首先读入用函数wavread在命令窗口中读取wav文件,然后调用编写的mfcc函数获得语音的MFCC各个参数,进而用vad函数对其进行端点检测,并将参考模板和测试模板的语音部分的MFCC参数分别保存到相应的结构数组中或测试模板的结构数组中。
在模板匹配阶段,计算所有测试模板和参考模板之间的累加距离,保存到矩阵中,将最后的匹配分数用min函数找到最小值,得到匹配结果。
3. 系统仿真及结果
首先在比较安静的环境中,用WINDOWS系统自带的录音程序录取孤立词语音0~9,形成WAV文件,经过处理作为模板记为“Ref0.wav”~“Ref9.wav”。
在MATLAB中,通过函数对录音文件“Ref1.wav”波形及频谱显示参考模板数字1的波形及频谱如图7所示。
图7 参考模板数字1波形与频谱图
参考模板数字1语谱图如图8所示。
图8 参考模板数字1语谱图
利用for循环对元语音信号进行循环采样,抽取后的信号如图9所示。
图9 抽取后的信号
预处理过程中语音信号会通过一个滤波器组,其中一个滤波器的频率响应如图10所示。
图10 滤波器的频率响应
由于设计的滤波器是非理想的低通滤波器,所以经过该滤波器的语音频谱在低频以外的区域也会有频谱出现,低通滤波后的信号波形与频谱如图11所示。
图11 低通滤波后的信号波形与频谱
在GUI用户界面自定义三个按键,分别为“载入语音”,“文件识别”和“返回”,GUI用户界面如图12所示。
图12 GUI用户界面 MATLAB语音识别系统的设计+DTW算法+流程图(8):http://www.youerw.com/tongxin/lunwen_809.html