折騰了好幾天,看了不少資料,終於把語音特徵參數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的提取過程詳解,但願可以幫助到你們!