語音特徵引數MFCC提取過程詳解
原來對語音特徵引數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
由於訊號在時域上的變換通常很難看出訊號的特性,所以通常將它轉換為頻域上的能量分佈來觀察,不同的能量分佈,就能代表不同語音的特性。所以在乘上漢明窗後,每幀還必須再經過快速傅立葉變換以得到在頻譜上的能量分佈。對分幀加窗後的各幀訊號進行快速傅立葉變換得到各幀的頻譜。並對語音訊號的頻譜取模平方得到語音訊號的功率譜。設語音訊號的DFT為:
![](http://static.oschina.net/uploads/space/2014/0115/170219_Sixd_852488.jpg)
式中x(n)為輸入的語音訊號,N表示傅立葉變換的點數。
5.三角帶通濾波器 將能量譜通過一組Mel尺度的三角形濾波器組,定義一個有M個濾波器的濾波器組(濾波器的個數和臨界帶的個數相近),採用的濾波器為三角濾波器,中心頻率為 。M通常取22-26。各f(m)之間的間隔隨著m值的減小而縮小,隨著m值的增大而增寬,如圖所示:![](http://static.oschina.net/uploads/space/2014/0115/170601_pFt0_852488.jpg)
圖3 Mel頻率濾波器組
三角濾波器的頻率響應定義為:
![](http://static.oschina.net/uploads/space/2014/0115/170727_MZJC_852488.jpg)
![](http://static.oschina.net/uploads/space/2014/0115/170822_PzSG_852488.jpg)
三角帶通濾波器有兩個主要目的:
對頻譜進行平滑化,並消除諧波的作用,突顯原先語音的共振峰。(因此一段語音的音調或音高,是不會呈現在MFCC 引數內,換句話說,以MFCC 為特徵的語音辨識系統,並不會受到輸入語音的音調不同而有所影響)此外,還可以降低運算量。
6.計算每個濾波器組輸出的對數能量為![](http://static.oschina.net/uploads/space/2014/0115/170955_1B4i_852488.jpg)
7.經離散餘弦變換(DCT)得到MFCC係數
![](http://static.oschina.net/uploads/space/2014/0115/171031_pNWw_852488.jpg)
將上述的對數能量帶入離散餘弦變換,求出L階的Mel-scale Cepstrum引數。L階指MFCC係數階數,通常取12-16。這裡M是三角濾波器個數。
8.對數能量
此外,一幀的音量(即能量),也是語音的重要特徵,而且非常容易計算。因此,通常再加上一幀的對數能量(定義:一幀內訊號的平方和,再取以10為底的對數值,再乘以10)使得每一幀基本的語音特徵就多了一維,包括一個對數能量和剩下的倒頻譜引數。
注:若要加入其它語音特徵以測試識別率,也可以在此階段加入,這些常用的其它語音特徵包含音高、過零率以及共振峰等。
9.動態查分引數的提取(包括一階差分和二階差分)標準的倒譜引數MFCC只反映了語音引數的靜態特性,語音的動態特性可以用這些靜態特徵的差分譜來描述。實驗證明:把動、靜態特徵結合起來才能有效提高系統的識別效能。差分引數的計算可以採用下面的公式:
![](http://static.oschina.net/uploads/space/2014/0115/171233_M7ap_852488.jpg)
式中,dt表示第t個一階差分;Ct表示第t個倒譜系數;Q表示倒譜系數的階數;K表示一階導數的時間差,可取1或2。將上式中結果再代入就可以得到二階差分的引數。
總結:
因此,MFCC的全部組成其實是由:
N維MFCC引數(N/3MFCC係數+ N/3一階差分引數+ N/3二階差分引數)+幀能量(此項可根據需求替換)
三、MATLAB實現方法(不含有關能量的維數)
注:在提取MFCC引數之前需要載入並使用VOICEBOX工具包
實現程式碼:
[x fs]=wavread('000.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
-將來原始檔取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