MFCC特征提取及MATLAB代码分析(一)
本文不涉及MFCC的理论,所以读此文前请对MFCC以及相关语音信号处理有初步认识。本文重点在于代码实现的分析。
先对MFCC有个初步认识。
MFCCs(Mel Frequency Cepstral Coefficents)是一种在自动语音和说话人识别中广泛使用的特征。提取MFCC特征的过程包括:
1)对语音进行预加重、分帧和加窗;
2)对每一个短时分析窗,通过FFT得到对应的频谱;
3)将上面的频谱通过Mel滤波器组得到Mel频谱;
4)在Mel频谱上面进行倒谱分析,获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征。
下面对MFCC提取的实现进行分析。
1. 参数分析
MFCC程序需要输出什么?当然是MFCC参数了。如果愿意,还可以将帧(windowed frames)、滤波器组能量(filterbank energies)也一起输出,这样以后用到了也方便。
MFCC程序的输入参数呢?
总的来说有语音信号、采样频率、帧时、帧移、预加重系数、窗函数、频率范围、Mel滤波器个数、倒谱系数个数和提升参数。
下面一个一个来分析。
首先是语音信号(speech signal),这没得说,用matlab一句wavread搞定。比如
[ speech, fs, nbits ] = wavread( wav_file );
就分别得到了时域语音信号(speech)、采样频率(fs)和精度(nbits)。一般来说有前两个参数就够了。
采样频率(sampling frequency)用刚刚得到的就行了,接下来是帧时和帧移了。
帧时(frame duration)代表的是加窗后一个语音帧的长度,一般人说话的声音在10ms~30ms的时间段内被认为是短时平稳的,所以一般取10~25ms作为帧长。
帧移(frame shift)表示取下一帧时窗移动的距离(毫秒数)。因为人说话是连续的,分成一段一段的显然不合适,需要重叠一部分。所以帧移一般小于帧时。如图所示,
一般帧时取25ms或20ms,帧移取10ms。
接下来就是预加重系数(preemphasis coefficient)了。
其实预加重就是相当于一个高通滤波器。一般取0.95~0.97。
比如
speech = filter( [1 -alpha], 1, speech );
alpha就是预加重系数,speech还是原来得到的语音信号。
取alpha=0.95,画图看看:
m = -30:1:30;
plot(m, filter( [1 -0.95], 1, m ))
接下来是窗函数(window function)的选择了。
窗函数有矩形窗、汉宁窗、汉明窗等。当然汉明窗是目前应用最广泛的。
在matlab中输入
help hamming
就会出现说明。
用matlab画出来看看,
plot(hamming(256))
汉明窗大致长这个样子。
这样截取信号的边缘就平滑多了。
频率范围(frequency range)一般使用300Hz~3400Hz(电话语音),或者取到采样频率的一半即可,即fs/2(fs是wavread得到的)。
Mel滤波器(filterbank channels)个数一般取20~26个,取24个就行。
倒谱系数(cepstral coefficients)个数这个因具体情况而异,我遇到过的有取12个、16个和19个的情况。取的个数直接决定最后得到的每帧MFCC的维度。
提升参数(liftering parameter)个人感觉主要是为了让不同的倒谱系数拥有不同的权重。有论文证明不同的倒谱系数对语音识别或说话人识别的性能有不同的程度的影响。所以它们应该被赋予不同的权重。
比如
ceplifter = @( N, L )( 1+0.5*L*sin(pi*[0:N-1]/L) );
其中N为Mel滤波器个数,L为提升参数。
比如取N=19,L=22,
plot(ceplifter(19, 22))
画图得:
我们看到它对6~18阶MFCC的重要性都有提升,对低阶或高阶的影响力进行打压。这样做也是符合经验的。
好了,今天暂时告一段落吧。这篇大致说了一下参数选择,如果您不明白MFCC或者参数的作用,请先恶补一下相关知识吧。最近弄毕设开题比较忙,可能要隔几天,下回争取对整个流程进行代码分析。
转载请注明作者:周星宇,原文所在博客地址:http://www.cnblogs.com/xingyuhit/