天天看點

Matlab2013a學習之提取語音特征參數MFCC

在語音識别(SpeechRecognition)和話者識别(SpeakerRecognition)方面,最常用到的語音特征就是梅爾倒譜系數(Mel-scaleFrequency Cepstral Coefficients,簡稱MFCC)。

根據人耳聽覺機理的研究發現,人耳對不同頻率的聲波有不同的聽覺敏感度。從200Hz到5000Hz的語音信号對語音的清晰度影響對大。兩個響度不等的聲音作用于人耳時,則響度較高的頻率成分的存在會影響到對響度較低的頻率成分的感受,使其變得不易察覺,這種現象稱為掩蔽效應。由于頻率較低的聲音在内耳蝸基底膜上行波傳遞的距離大于頻率較高的聲音,故一般來說,低音容易掩蔽高音,而高音掩蔽低音較困難。在低頻處的聲音掩蔽的臨界帶寬較高頻要小。是以,人們從低頻到高頻這一段頻帶内按臨界帶寬的大小由密到疏安排一組帶通濾波器,對輸入信号進行濾波。将每個帶通濾波器輸出的信号能量作為信号的基本特征,對此特征經過進一步處理後就可以作為語音的輸入特征。由于這種特征不依賴于信号的性質,對輸入信号不做任何的假設和限制,又利用了聽覺模型的研究成果。是以,這種參數比基于聲道模型的LPCC相比具有更好的魯邦性,更符合人耳的聽覺特性,而且當信噪比降低時仍然具有較好的識别性能。

梅爾倒譜系數(Mel-scale Frequency Cepstral Coefficients,簡稱MFCC)是在Mel标度頻率域提取出來的倒譜參數,Mel标度描述了人耳頻率的非線性特性,它與頻率的關系可用下式近似表示:

Matlab2013a學習之提取語音特征參數MFCC

式中f為頻率,機關為Hz。下圖展示了Mel頻率與線性頻率的關系:

Matlab2013a學習之提取語音特征參數MFCC

用Matlab程式,從自己錄制的一句單詞中獲得MFCC特征值:

添加voicebox:

addpath(genpath('G:\2018and2019two\duomeitijishu\Ruanjian\voicebox'))
           

代碼:

% MFCC implement with Matlab %  
[x fs]=wavread('G:\2018and2019two\duomeitijishu\實驗報告\實驗四\siyuone.wav');  
bank=melbankm(24,256,fs,0,0.4,'t'); %Mel濾波器的階數為24,FFT變換的長度為256,采樣頻率為16000Hz  
%歸一化Mel濾波器組系數  
bank=full(bank); %full() convert sparse matrix to full matrix  
bank=bank/max(bank(:));  
for k=1:12  
    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);%對xx 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(2,1,2);  
plot([1,w],A);  
xlabel('維數');ylabel('幅值');  
title('維數與幅值的關系');  
           

運作結果:

Matlab2013a學習之提取語音特征參數MFCC

繼續閱讀