ASR1:MFCC特征提取

今天语音识别课结束了,这学期花了很多时间在上面也有很多收获,准备写个系列总结一下。老师上课不断强调重点不是算法的细节,而是要知道每个方法的优缺点,每一步这么做的道理,最后只要知道开源库每个参数的含义就ok了。所以我也不想说太多细节,主要是领会精神。今天先写一下MFCC。

最开始先说一下录音的几个参数,实验中选用的是采样率16000Hz,(如果用Mac则是44100Hz),用16bit量化,单声道。

对任何数据特征值的提取都是很重要的步骤,实验中我们使用了MFCC作为语音特征,MFCC特征提取大概有以下几步:

  1. Preemphasizing a speech signal:语音信号的高频能量明显低于低频能量,所以最好找到办法让它的高频和低频能量大概相等,这里让s[n]=s[n]-0.95*s[n-1]即可,至于具体为什么是这个公式我也不是很清楚。

  2. 然后是分帧(frame),一般每帧长度为20-25ms,每隔10ms取一帧,之所以这样是因为我们之后做识别时要用到HMM,HMM中将每个观测值看作是平稳的,而20-25ms的语音信号可以看作是基本平稳的,每隔10ms取一帧则会出现同一个时间的信号属于多个帧的情况,这样重复利用了数据,能让效果变好。

  3. 然后加窗,因为之后要做DFT,而一个信号的DFT与这个信号的周期信号的DFT相同,所以如果这个信号边缘不平滑,那么这个信号的周期信号在现实中是很少遇到的,这样就不make sence了,所以最好加个窗函数使信号边缘变平滑,Hamming window,Hanning window之类的都ok。

  4. 然后是补零,因为做FFT(快速傅里叶变化,DFT的一种实现)要求信号长度为2^n,所以如果采样率为16000Hz,16000*0.025=400,要补0使长度为512。

  5. 下面就是做FFT,信号的横坐标变为频率,纵坐标变为功率。

  6. 然后要转化到梅尔刻度,梅尔刻度是一种基于人耳对等距的音高变化的感官判断而定的非线性频率刻度。人耳对低频声音的变化比高频的变化更敏感,所以要做一个转化,公式见这里,具体做法为让原始信号通过一系列滤波器,实验中取40个,这40个滤波器的横轴在单位为梅尔时是均匀的,但单位转化为赫兹就不均匀了,为了保证这些滤波器面积相同,所以它们的高度不同,让信号分别与这40个滤波器相乘,就得到了40个特征,滤波器的图见下面,横轴为梅尔,纵轴为赫兹。

  7. 最后做一个DCT变化,将40维的特征变成13维的。然后归一化一下,每个帧的特征减去特征的平均值就ok了,至此MFCC特征就算出来了。

下一次会写一下怎么算Levenshtein distance,看心情更: )

lufo /
Published under (CC) BY-NC-SA tagged with speech_recognition