折腾了好几天,看了不少资料,终于把语音特征参数MFCC搞明白了,闲话少说,进入正题。 shell
1、MFCC概述 性能
在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最经常使用到的语音特征就是梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients,简称MFCC)。根据人耳听觉机理的研究发现,人耳对不一样频率的声波有不一样的听觉敏感度。从200Hz到5000Hz的语音信号对语音的清晰度影响对大。两个响度不等的声音做用于人耳时,则响度较高的频率成分的存在会影响到对响度较低的频率成分的感觉,使其变得不易察觉,这种现象称为掩蔽效应。因为频率较低的声音在内耳蜗基底膜上行波传递的距离大于频率较高的声音,故通常来讲,低音容易掩蔽高音,而高音掩蔽低音较困难。在低频处的声音掩蔽的临界带宽较高频要小。因此,人们从低频到高频这一段频带内按临界带宽的大小由密到疏安排一组带通滤波器,对输入信号进行滤波。将每一个带通滤波器输出的信号能量做为信号的基本特征,对此特征通过进一步处理后就能够做为语音的输入特征。因为这种特征不依赖于信号的性质,对输入信号不作任何的假设和限制,又利用了听觉模型的研究成果。所以,这种参数比基于声道模型的LPCC相比具备更好的鲁邦性,更符合人耳的听觉特性,并且当信噪比下降时仍然具备较好的识别性能。 测试
梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients,简称MFCC)是在Mel标度频率域提取出来的倒谱参数,Mel标度描述了人耳频率的非线性特性,它与频率的关系可用下式近似表示: spa
式中f为频率,单位为Hz。下图展现了Mel频率与线性频率的关系: code
图1 Mel频率与线性频率的关系 ci
2、语音特征参数MFCC提取过程 it
基本步骤: io
图2 MFCC参数提取基本流程 class
1.预加剧 im
预加剧处理实际上是将语音信号经过一个高通滤波器:
(2)
式中μ的值介于0.9-1.0之间,咱们一般取0.97。预加剧的目的是提高高频部分,使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用一样的信噪比求频谱。同时,也是为了消除发生过程当中声带和嘴唇的效应,来补偿语音信号受到发音系统所抑制的高频部分,也为了突出高频的共振峰。
2.分帧
先将N个采样点集合成一个观测单位,称为帧。一般状况下N的值为256或512,涵盖的时间约为20~30ms左右。为了不相邻两帧的变化过大,所以会让两相邻帧之间有一段重叠区域,此重叠区域包含了M个取样点,一般M的值约为N的1/2或1/3。一般语音识别所采用语音信号的采样频率为8KHz或16KHz,以8KHz来讲,若帧长度为256个采样点,则对应的时间长度是256/8000×1000=32ms。
3.加窗(Hamming Window)
将每一帧乘以汉明窗,以增长帧左端和右端的连续性。假设分帧后的信号为S(n), n=0,1…,N-1, N为帧的大小,那么乘上汉明窗后,W(n)形式以下:
(3)
不一样的a值会产生不一样的汉明窗,通常状况下a取0.46
4.快速傅里叶变换
因为信号在时域上的变换一般很难看出信号的特性,因此一般将它转换为频域上的能量分布来观察,不一样的能量分布,就能表明不一样语音的特性。因此在乘上汉明窗后,每帧还必须再通过快速傅里叶变换以获得在频谱上的能量分布。对分帧加窗后的各帧信号进行快速傅里叶变换获得各帧的频谱。并对语音信号的频谱取模平方获得语音信号的功率谱。设语音信号的DFT为:
(4)
式中x(n)为输入的语音信号,N表示傅里叶变换的点数。
5. 三角带通滤波器
将能量谱经过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组(滤波器的个数和临界 带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,...,M。M一般取22-26。各 f(m)之间的间隔随着m值的减少而缩小,随着m值的增大而增宽,如图所示:
图3 Mel频率滤波器组
三角滤波器的频率响应定义为:
(5)
式中
三角带通滤波器有两个主要目的:
对频谱进行平滑化,并消除谐波的做用,突显原先语音的共振峰。(所以一段语音的音调或音高,是不会呈如今 MFCC 参数内,换句话说,以 MFCC 为特征的语音辨识系统,并不会受到输入语音的音调不一样而有所影响) 此外,还能够下降运算量。
6.计算每一个滤波器组输出的对数能量为:
(6)
7.经离散余弦变换(DCT)获得MFCC系数:
(7)
将上述的对数能量带入离散余弦变换,求出L阶的Mel-scale Cepstrum参数。L阶指MFCC系数阶数,一般取12-16。这里M是三角滤波器个数。
8.对数能量
此外,一帧的音量(即能量),也是语音的重要特征,并且很是容易计算。所以,一般再加上一帧的对数能量(定义:一帧内信号的平方和,再取以10为底的对数值,再乘以10)使得每一帧基本的语音特征就多了一维,包括一个对数能量和剩下的倒频谱参数。
注:若要加入其它语音特征以测试识别率,也能够在此阶段加入,这些经常使用的其它语音特征包含音高、过零率以及共振峰等。
9.动态差分参数的提取(包括一阶差分和二阶差分)
标准的倒谱参数MFCC只反映了语音参数的静态特性,语音的动态特性能够用这些静态特征的差分谱来描述。实验证实:把动、静态特征结合起来才能有效提升系统的识别性能。差分参数的计算能够采用下面的公式:
(8)
式中,dt表示第t个一阶差分,Ct表示第t个倒谱系数,Q表示倒谱系数的阶数,K表示一阶导数的时间差,可取1或2。将上式的结果再代入就能够获得二阶差分的参数。
总结:
所以,MFCC的所有组成实际上是由:
N维MFCC参数(N/3 MFCC系数+ N/3 一阶差分参数+ N/3 二阶差分参数)+帧能量(此项可根据需求替换)
MATLAB实现
[x fs]=wavread('8.wav'); bank=melbankm(24,256,fs,0,0.4,'t');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为16000Hz %归一化mel滤波器组系数 bank=full(bank); bank=bank/max(bank(:)); for k=1:12 %归一化mel滤波器组系数 n=0:23; dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24)); end w=1+6*sin(pi*[1:12]./12);%归一化倒谱提高窗口 w=w/max(w);%预加剧滤波器 xx=double(x); xx=filter([1-0.9375],1,xx);%语音信号分帧 xx=enframe(xx,256,80);%对x 256点分为一帧 %计算每帧的MFCC参数 for i=1:size(xx,1) y=xx(i,:); s=y'.*hamming(256); t=abs(fft(s));%fft快速傅立叶变换 t=t.^2; c1=dctcoef*log(bank*t(1:129)); c2=c1.*w'; m(i,:)=c2'; end %求取一阶差分系数 dtm=zeros(size(m)); for i=3:size(m,1)-2 dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:); end dtm=dtm/3; %求取二阶差分系数 dtmm=zeros(size(dtm)); for i=3:size(dtm,1)-2 dtmm(i,:)=-2*dtm(i-2,:)-dtm(i-1,:)+dtm(i+1,:)+2*dtm(i+2,:); end dtmm=dtmm/3; %合并mfcc参数和一阶差分mfcc参数 ccc=[m dtm dtmm]; %去除首尾两帧,由于这两帧的一阶差分参数为0 ccc=ccc(3:size(m,1)-2,:); ccc % subplot(2,1,1) % ccc_1=ccc(:,1); % plot(ccc_1);title('MFCC');ylabel('幅值'); % [h,w]=size(ccc); % A=size(ccc); % subplot(212) % plot([1,w],A); % xlabel('维数'); % ylabel('幅值'); % title('维数与幅值的关系')
HTK实现:
运行: HCopy config 8.wav 8.mfcc 其中,涉及mfcc的参数为: TARGETKIND=MFCC_E_D_A -目标是MFCC文件,以及energy(E), delta(D),delta-delta(A) TARGETRATE=100000 -窗间隔为10ms WINDOWSIZE=250000 -窗长为25ms 注:HTK中时间单位为100ns ZMEANSOURCE=T -未来源文件取zero mean,即去掉DC值 USEHAMMING=T -使用hamming window PREEMCOEF=0.97 -预加剧系数0.97 NUMCHANS=31 -在MEL刻度下等分红31个频带 USEPOWER=F -不使用c(0)参数以上便是语音特征参数MFCC的提取过程详解,但愿可以帮助到你们!