语音特征MFCC提取过程详解

转自:https://blog.csdn.net/jojozhangju/article/details/18678861

原来对语音特征参数MFCC的提取过程不是很了解,最近做实验需要自己手动去提取,所以借此机会,深入的学习了一下,所以记录下来,希望能够对日后的学习有一定的帮助。

一、MFCC概述

 

在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC)。根据人耳听觉机理的研究发现,人耳对不同频率的声波有不同的听觉敏感度。从200Hz到5000Hz的语音信号对语音的清晰度影响对大。两个响度不等的声音作用于人耳时,则响度较高的频率成分的存在会影响到对响度较低的频率成分的感受,使其变得不易察觉,这种现象称为掩蔽效应。由于频率较低的声音在内耳蜗基底膜上行波传递的距离大于频率较高的声音,故一般来说,低音容易掩蔽高音,而高音掩蔽低音较困难。在低频处的声音掩蔽的临界带宽较高频要小。所以,人们从低频到高频这一段频带内按临界带宽的大小由密到疏安排一组带通滤波器,对输入信号进行滤波。将每个带通滤波器输出的信号能量作为信号的基本特征,对此特征经过进一步处理后就可以作为语音的输入特征。由于这种特征不依赖于信号的性质,对输入信号不做任何的假设和限制,又利用了听觉模型的研究成果。因此,这种参数比基于声道模型的LPCC相比具有更好的鲁邦性,更符合人耳的听觉特性,而且当信噪比降低时仍然具有较好的识别性能。
      

梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients,简称MFCC)是在Mel标度频率域提取出来的倒谱参数,Mel标度描述了人耳频率的非线性特性,它与频率的关系可用下式近似表示:

       

 

式中f为频率,单位为Hz。下图展示了Mel频率与线性频率的关系:

 

图1 Mel频率与线性频率的关系

二、语音特征参数MFCC提取过程

 

基本流程:

 

图2 MFCC参数提取基本流程

1.预加重

 

预加重处理其实是将语音信号通过一个高通滤波器:

 (1)

式中的值介于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)形式如下:

(2)

 

不同的a值会产生不同的汉明窗,一般情况下a取0.46

4.快速傅里叶变换

 

由于信号在时域上的变换通常很难看出信号的特性,所以通常将它转换为频域上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。所以在乘上汉明窗后,每帧还必须再经过快速傅里叶变换以得到在频谱上的能量分布。对分帧加窗后的各帧信号进行快速傅里叶变换得到各帧的频谱。并对语音信号的频谱取模平方得到语音信号的功率谱。设语音信号的DFT为:

(3)

式中x(n)为输入的语音信号,N表示傅里叶变换的点数。

5.三角带通滤波器

将能量谱通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,中心频率为 。M通常取22-26。各f(m)之间的间隔随着m值的减小而缩小,随着m值的增大而增宽,如图所示:

图3 Mel频率滤波器组

三角滤波器的频率响应定义为:

(4)

式中:

三角带通滤波器有两个主要目的:

对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。(因此一段语音的音调或音高,是不会呈现在MFCC 参数内,换句话说,以MFCC 为特征的语音辨识系统,并不会受到输入语音的音调不同而有所影响)此外,还可以降低运算量。

6.计算每个滤波器组输出的对数能量为

(5)

7.经离散余弦变换(DCT)得到MFCC系数

(6)

将上述的对数能量带入离散余弦变换,求出L阶的Mel-scale Cepstrum参数。L阶指MFCC系数阶数,通常取12-16。这里M是三角滤波器个数。

8.对数能量

此外,一帧的音量(即能量),也是语音的重要特征,而且非常容易计算。因此,通常再加上一帧的对数能量(定义:一帧内信号的平方和,再取以10为底的对数值,再乘以10)使得每一帧基本的语音特征就多了一维,包括一个对数能量和剩下的倒频谱参数。

注:若要加入其它语音特征以测试识别率,也可以在此阶段加入,这些常用的其它语音特征包含音高、过零率以及共振峰等。

9.动态查分参数的提取(包括一阶差分和二阶差分)

标准的倒谱参数MFCC只反映了语音参数的静态特性,语音的动态特性可以用这些静态特征的差分谱来描述。实验证明:把动、静态特征结合起来才能有效提高系统的识别性能。差分参数的计算可以采用下面的公式:

(7)

式中,dt表示第t个一阶差分;Ct表示第t个倒谱系数;Q表示倒谱系数的阶数;K表示一阶导数的时间差,可取1或2。将上式中结果再代入就可以得到二阶差分的参数。

 

总结:

因此,MFCC的全部组成其实是由:

N维MFCC参数(N/3MFCC系数+ N/3一阶差分参数+ N/3二阶差分参数)+帧能量(此项可根据需求替换)

三、MATLAB实现方法(不含有关能量的维数)

 

注:在提取MFCC参数之前需要加载并使用VOICEBOX工具包

实现代码:

 
  1. <span style="font-size:18px;">[x fs]=wavread('000.wav');

  2. bank=melbankm(24,256,fs,0,0.4,'t');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为16000Hz

  3. %归一化mel滤波器组系数

  4. bank=full(bank);

  5. bank=bank/max(bank(:));

  6. for k=1:12 %归一化mel滤波器组系数

  7. n=0:23;

  8. dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));

  9. end

  10. w=1+6*sin(pi*[1:12]./12);%归一化倒谱提升窗口

  11. w=w/max(w);%预加重滤波器

  12. xx=double(x);

  13. xx=filter([1-0.9375],1,xx);%语音信号分帧

  14. xx=enframe(xx,256,80);%对x 256点分为一帧

  15. %计算每帧的MFCC参数

  16. for i=1:size(xx,1)

  17. y=xx(i,:);

  18. s=y'.*hamming(256);

  19. t=abs(fft(s));%fft快速傅立叶变换

  20. t=t.^2;

  21. c1=dctcoef*log(bank*t(1:129));

  22. c2=c1.*w';

  23. m(i,:)=c2';

  24. end

  25. %求取一阶差分系数

  26. dtm=zeros(size(m));

  27. for i=3:size(m,1)-2

  28. dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);

  29. end

  30. dtm=dtm/3;

  31. %求取二阶差分系数

  32. dtmm=zeros(size(dtm));

  33. for i=3:size(dtm,1)-2

  34. dtmm(i,:)=-2*dtm(i-2,:)-dtm(i-1,:)+dtm(i+1,:)+2*dtm(i+2,:);

  35. end

  36. dtmm=dtmm/3;

  37. %合并mfcc参数和一阶、二阶差分mfcc参数

  38. ccc=[m dtm dtmm];

  39. %去除首尾两帧,因为这两帧的一阶差分参数为0

  40. ccc=ccc(3:size(m,1)-2,:);

  41. ccc

  42. % subplot(2,1,1)

  43. % ccc_1=ccc(:,1);

  44. % plot(ccc_1);title('MFCC');ylabel('幅值');

  45. % [h,w]=size(ccc);

  46. % A=size(ccc);

  47. % subplot(212)

  48. % plot([1,w],A);

  49. % xlabel('维数');

  50. % ylabel('幅值');

  51. % title('维数与幅值的关系')

  52. </span>

结果:

 

 

四、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

-将来源文件取zeromean,即去掉DC值

USEHAMMING=T

-使用hammingwindow

PREEMCOEF=0.97

-预加重系数0.97

NUMCHANS=31

-在MEL刻度下等分成31个频带

USEPOWER=F

-不使用c(0)参数

NUMCEPS=13

-最后使用13阶MFCC

CEPLIFTER= 22                     

-倒谱滤波系数

ENORMALISE=T

-窗的能量值做正规化

LOFREQ=200

-设定频带的下截止频率

HIFREQ=3500

-设定频带的上截止频率

注:电话线品质,如果麦克风的话,L为0,H为8000

DELTAWINDOW=2

ACCWINDOW=2

-设定delta和delta-delta的计算参数

此处config如下所示:

生成的mfcc文件可以使用HList工具查看

全部输出:

HList–h –o 000.mfcc > 000.txt

只输出mfcc便于使用:

HList–r 000.mfcc > 000.txt

以上即是语音特征参数MFCC提取过程的详细解释和具体实现。
 

 

 

  • 25
    点赞
  • 233
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值