这章是将前面学的一些处理综合起来,设计出一个语音识别系统,判断当前语音的匹配度。
很多知识是和我前面总结的CMSC5707是重合的,因此笔者只关注其中不太相同的部分。
进行语音识别的过程主要如下:
关于第1步,首尾端点检测其实就是为了检测在一段语音(一般有多帧)中开始和结束的位置,方便我们分析。其需要统计帧的累积能量以及该帧中过零点的个数,过零点定义如下,直观理解下,开始位置的能量会增高,同时过零点数目变多;结束的位置的能量会降低,同时过零点数量也会降低。
找starting point, 假设一帧the time frame length =20 ms, and non-overlapping =10 ms,需要统计出连续帧(比如3个连续帧)的能量energy以及过零点数目zero crossing count,当这连续帧的能量和过零点都超过某个阈值,则可认为当前第一帧的第一个时间点,为starting point。
当3个连续帧,第一个帧id=32,找starting point的流程如下:
if (
E(i=32)> e_threshold and ZC(i=32) > zc_threshold ) and
and (E(i=33)> e_threshold and ZC(i=33) > zc_threshold) and
and (E(i=34)> e_threshold and ZC(i=34) > zc_threshold)
) then the starting time (in seconds) of the 32th frame is the starting point
其中一帧的能量E(i)=0.5*sum(s(k)*s(k))
找ending point就是找连续低于阈值的时候。
关于第2,3步,在我之前CMSC5707的文章中有讲到。
关于第4步,MFCC特征提取相当于在之前倒谱分析的过程中加入了一层Mel滤波,之前倒谱分析参考我的上一篇文章CMSC5707-高级人工智能之音频信号特征提取,加入Mel滤波的MFCC特征提取的步骤如下:
(c1,c2...c13)
和(c1',c2'...c13')
分量差距的累加和。在经过上面的预处理后,就可以进入语音识别阶段speech recognization了。针对已有的标准的样本(reference sample/ template sample)与一个待识别的输入(unknown input),已经可以计算出它们不同帧之间组成的差异矩阵distortion matrix了,问题是如何进行匹配,因为其中最难处理的就是不同语音之间的时间对齐,也就是不同语音对应音帧的时间是不完全相同的。课件中采取了一种动态规划Dynamic Programming的方法,进行弹性匹配,如下图所示。
在Accumulated distortion score matrix中找到累加差异的最小值optimal score,然后从这里开始回溯找到最佳匹配路径optimal path.
找到累加差异的最小值optimal score(最佳路径的终点)应该在最顶端一行top-row或者最靠近右边的一列right-most-column,其找到的最佳路径起点也应该在最底部一行bottom-row或者最靠近左边的一列left-most-cloumn的最小值。
但是也应该尽量让最佳匹配路径在下图中的白色区域,也就是最佳路径的终点也应在白色区域中。如果匹配的位置在黑色区域中,就会让匹配得到的输入未知序列input sequence和参考模板reference之间的长度差异过大,即使optimal score很小,这也不算是种好匹配。
习题1:
在有n个testing sample测试样本set B和有n个reference sample模板样本 set A的时候,我们可以通过绘制混淆矩阵,如下图,来表示每个测试样本和模板样本之间的差异,这也是最后在作业中展现结果的一种方式。混淆矩阵大小为n*n,每个格子填的是对应reference/input pair计算出来的累加差异的最小值optimal score.
由于测试样本和模板样本的特征表示都不一样,因此每个格子的值应该都不一样,但可以想到的是,对应同一类的声音,它们之间的差异值应该是最小的。