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

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