【語音識別-說話人識別】基于傅立葉變換和MFCC特征結(jié)合DTW算法實現(xiàn)0-9的數(shù)字語音識別
1 簡介
??1、語音識別系統(tǒng)概述
????????語音信號是一種典型的非平穩(wěn)信號,并且在錄音過程中不免受到電噪音,呼吸產(chǎn)生的氣流噪音以及錄音環(huán)境下的突發(fā)噪音的影響,所以語音信號要經(jīng)過預(yù)濾波、采樣量化、分幀、加窗、預(yù)加重、端點檢測等預(yù)處理過程后才可以進行下一步的特征征參數(shù)提取等工作。在接下來的語音訓(xùn)練階段,我們將那些信號狀態(tài)良好,攜帶噪聲小且特征參數(shù)穩(wěn)定的語音信號作為指定詞條的模板,進而為每個詞條創(chuàng)建一個模板并保存為模板庫。在識別階段,語音信號經(jīng)過相同的通道生成測試模板,用相同的方法計算測試模板的特征參數(shù)后,將其與模板庫模板的特征參數(shù)進行匹配,配分數(shù)最高的參考模板作為識別結(jié)果。
????????2、語音信號的錄入
????????語音信號的采集方法有很多,鑒于該系統(tǒng)是在MATLAB上實現(xiàn),且MATLAB本身提供了一定的音頻處理函數(shù),因此我們完全可以采用在MATLAB中先完成錄音函數(shù)的編寫,然后再結(jié)合windows自帶的錄音設(shè)備進行錄音。錄音得到的wav文件即是經(jīng)過預(yù)濾波采樣和量化的語音。利用soundview讀所錄入的文件時,會彈出一個GUI界面,并可以通過輸出設(shè)備對所錄語音進行回訪,該GUI界面如圖1所示。單擊Play Again按鈕可可回放,單擊Done按鈕可關(guān)閉界面。
????????3、語音信號的預(yù)加重
????????我們知道,對語音識別更有用的是語音的高頻部分,而對于語音信號的頻譜,通常是頻率越高幅值越低。因此我們必須對語音的高頻進行加重處理。處理方法是將語音信號通過一個一階高通濾波器,即預(yù)加重濾波器,它不僅能濾除低頻提升高頻,還能很好的抑制50Hz到60Hz的工頻干擾。尤其在短點檢測之前進行預(yù)加重還可起到消除直流漂移、抑制隨機噪聲和提升清音部分能量的效果。預(yù)加重在Matlab中可由語句x=filter([1-0.9375],1,x)實現(xiàn)。
????????4、語音信號的分幀和加窗
????????經(jīng)過數(shù)字化的語音信號實際上是一個時變信號,為了能用傳統(tǒng)的方法對語音信號進行分析,應(yīng)假設(shè)語音信號在10ms-30ms內(nèi)是短時平穩(wěn)的。為了得到短時的語音信號,要對語音信號進行加窗操作。窗函數(shù)平滑地在語音信號上滑動,將語音信號進行分幀,幀與幀的交疊為幀移,一般為窗長的一半。
????????語音信號的分幀采用enframe函數(shù),其語法為f=enframe(x,len,inc);其中X為輸入的語音信號,len為制定的幀長,inc為指定幀移。函數(shù)將返回一個n×len的一個矩陣,每行都是一幀數(shù)據(jù)。在本系統(tǒng)中幀長取240,幀移取80。在Matlab中要實現(xiàn)加窗即將分幀后的語音信號乘上窗函數(shù),本文加漢明窗,即為x=x.*hamming(N)。
????????5、端點檢測
????????在語音識別系統(tǒng)中,訓(xùn)練階段和建模階段都比較重要的環(huán)節(jié)都是要先通過端點檢測找到語音的起點和終點,這樣,我們就可以只對有效語音進行處理,這對于識別的準(zhǔn)確率和識別效率至關(guān)重要。本論文在短點檢測環(huán)節(jié)采用雙門限端點檢測法,即采用短時能量檢測和短時過零率檢測雙重指標(biāo)約束。結(jié)合實際,我們將整個語音端點檢測分為四個段落,即:無聲段、等待段、語音段、結(jié)束段,再為短時能量和短時過零率各設(shè)置一個高門限和一個低門限:EHigh、ELow和ZHigh、ZLow。結(jié)合MATLAB中所編程序,可以較準(zhǔn)確的確定語音的各個部分。圖2所示為語音“1”的處理結(jié)果。
????????6、特征參數(shù)的提取
????????經(jīng)過預(yù)處理的語音數(shù)據(jù)就可以進行特征參數(shù)提取,特征參數(shù)的好壞將直接影響系統(tǒng)的性能和效率。本文將梅爾倒譜系數(shù)(MFCC)和一階MFCC系數(shù)的差分結(jié)合起來,將其合并為一個矢量作為一幀語音信號的參數(shù),這樣,不僅描述了語音的靜態(tài)特性,由于加入了差分倒譜參數(shù),語音的動態(tài)特性得到了更好的體現(xiàn)。梅爾倒譜參數(shù)的計算流程為:先將預(yù)處理過的語音信號進行快速傅立葉變換,將時域信號變換成為信號的功率譜。再用一組Mel頻標(biāo)上線性分布的三角窗濾波器(本文采用24個三角窗濾波器)對信號的功率譜濾波,每一個三角窗濾波器覆蓋的范圍都近似于人耳的一個臨界帶寬,以此來模擬人耳的掩蔽效應(yīng)。然后對三角窗濾波器組的輸出求取對數(shù),可以得到近似于同態(tài)變換的結(jié)果。最后去除各維信號之間的相關(guān)性,將信號映射到低維空間。梅爾倒譜系數(shù)的計算差分參數(shù)的計算采用下面的公式:
????????7、模式匹配
????????本語音識別系統(tǒng)的模式匹配算法采用動態(tài)時間彎折(Dynamic Time Warping,DTW)算法,該算法基于動態(tài)規(guī)劃的思想,解決了發(fā)音長短不一的模板匹配問題。DTW是語音識別中出現(xiàn)較早,較為經(jīng)典的一種算法。與HMM算法相比而言,DTW算法具有計算量小,識別效率高的特點。模式匹配的過程其實就是根據(jù)一定的規(guī)則,計算輸入矢量特征與庫存模式之間的相似度,判斷出輸入語音的語意信息。本文中,失真測度采用下式所示的歐式距離:
????????其中,l=1,2,…M;i=1,2,…I;k=1,2,…K.是待測矢量之間的距離,是第i個碼本的第l個碼字矢量的第k個分量。I為說話者的數(shù)量,M為碼本的大小,K為參數(shù)矢量的總維數(shù)。由上式得出該語音相對于該命令詞的最短距離,然后取最短距離最小的命令詞作為該段語音的首先識別結(jié)果。結(jié)合MATLAB程序,得到數(shù)字1-10的匹配距離矩陣:
????????圖3即為針對數(shù)字1-10的待測模板和模板庫模板匹配距離的現(xiàn)實,由該距離矩陣,我們可以很清楚的看到,左上角到右下角的對角線上的距離匹配值在該值所在的行和列都是最小的。即距離最短的命令詞為識別結(jié)果。
????????8、結(jié)語
????????該論文闡述了基于DTW的語音識別系統(tǒng)在MATLAB上實現(xiàn)的基本過程,在實驗室錄音情況下,該識別系統(tǒng)的識別率可以達到百分之九十以上,效果良好。
2 部分代碼
clear all
close
clc;
disp('正在計算參考模板的參數(shù)...')
for i=1:10
fname=sprintf('%d0.mp3',i-1);
[x,fs]=audioread(fname);
sound(x,fs);
?[x1 x2]=vad(x);
% ? x1=abs(round(x1));
% ? x2=abs(round(x2));
?m=mfcc(x);
?m=m(x1-2:x2-4,:);
?ref(i).mfcc=m;
end
disp('正在分析語音信號...')
for i=1:10
fname=sprintf('%d0.mp3',i-1);
%[x,fs,bit]=audioread(fname,[2000,2512]); ? ? %采樣%
[x,fs]=audioread(fname,[2000,2512]);
%sound(x,fs); ? ? ?%播放語音信號
figure(i);
subplot(3,3,1);
plot(x(1:256)); ? ?%原始語音信號的時域圖形%
title('原始信號')
subplot(3,3,2)
[h,w]=freqz(x,fs); ? ? ?%原始語音信號的頻率響應(yīng)圖
hr=abs(h); ? ? ? ? ? ?%求系統(tǒng)幅頻響應(yīng)
plot(w,hr);
title('幅頻圖');
xlabel('Frequency in rad mple')
ylabel('Magnitude in dB')
subplot(3,3,3)
hphase=angle(h);
hphase=unwrap(hphase); ?%求系統(tǒng)相頻響應(yīng)
plot(w,hphase);
title('相頻圖');
xlabel('Frequency in rad mple')
ylabel('Phase in degrees')
y=fft(x,512); ? ? ?%傅立葉變換%
mag=abs(y);
mag1=10*log10(mag);
f=fs*(0:255)/512;
subplot(3,3,4)
plot(f,mag(1:256)); ? %FFT頻譜圖 %
title('fft變換后信號')
iff=ifft(y,512); ? %反傅立葉變換%
ifm=abs(iff);
subplot(3,3,5)
plot(f,ifm(1:256))
title('ifft后信號')
% 短時傅里葉變換
Ts=1/fs;
%N=T/Ts;
N=512;
Nw=20; ? ? %窗函數(shù)長
L=Nw/2; ? ?%窗函數(shù)每次移動的樣點數(shù) ?
Tn=(N-Nw)/L+1; ? ?%計算把數(shù)據(jù)x共分成多少段
nfft=32;%FFT的長度
Tn=round(Tn);
TF=zeros(Tn,nfft); ? %將存放三維譜圖,先清零
for i=1:Tn
? ?xw=x((i-1)*10+1:i*10+10); ? ?%取一段數(shù)據(jù)
? ?temp=fft(xw,nfft); ? ? ? ? ? %FFT變換
? ?temp=fftshift(temp); ? ? ? ? %頻譜以0頻為中心
? ?for j=1:nfft
? ?TF(i,j)=temp(j); ? ? ? ? ? ? ? ?%把譜圖存放在TF中
? ?end
end
subplot(3,3,6)
fnew=((1:nfft)-nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
title('短時傅立葉變換時頻圖')
subplot(3,3,7)
contour(F,T,abs(TF))
title('等高線表示')
end
disp('正在計算測試模板的參數(shù)...')
for i=1:10
fname=sprintf('%d2.mp3',i-1);
x=audioread(fname);
disp('正在進行模板匹配...')
dist=zeros(10,10);
for i=1:10
end
disp('正在計算匹配結(jié)果...')
for i=1:10
?[d,j]=min(dist(i,:));
?fprintf('測試信號%d的識別結(jié)果為:%d\n',i-1,j-1);
end
3 仿真結(jié)果

4 參考文獻
[1]肖利君. 基于DTW模型的孤立詞語音識別算法實現(xiàn)研究[D]. 中南大學(xué), 2010.
博主簡介:擅長智能優(yōu)化算法、神經(jīng)網(wǎng)絡(luò)預(yù)測、信號處理、元胞自動機、圖像處理、路徑規(guī)劃、無人機等多種領(lǐng)域的Matlab仿真,相關(guān)matlab代碼問題可私信交流。
部分理論引用網(wǎng)絡(luò)文獻,若有侵權(quán)聯(lián)系博主刪除。
