DTW算法(語音識別)


DTW主要是應用在孤立詞識別的算法,用來識別一些特定的指令比較好用,這個算法是基於DP(動態規划)的算法基礎上發展而來的。這里介紹語音識別就先介紹下語音識別的框架,首先我們要有一個比對的模版聲音,然后需要去截取其里面包含真正屬於語音的部分,這個要采用一個叫做vad(voice activedetection)語音活動檢測的算法,而在vad中間我們最常使用雙門限端點檢測這種方法,如圖所示,我們采用vad判斷語音的開始和結束,判斷方法就是通過音量的大小做一個閾值判定,在時域上很簡單就能判定。

圖.speech(語音信號),Energy(短時能量),zcr(短時過零率值)

然后需要尋找一個特征矢量,在語音識別中很多采用MFCC,也就是梅爾倒譜這個參數作為特征矢量。一般的譜分析我們都是采用頻譜,或者小波這樣與頻譜的區別只是不同量度,這些都是解決加性噪聲的濾波問題,而還存在倒譜,階次譜這樣是為了特定的需求所構建的另外的譜方法,這些是在NI的探討會上次說的。倒譜是一種為了濾除乘性噪聲的譜方法,簡單的說就是對功率譜求log,再反傅里葉變換,公式如   ,這種方法用來做信號分離很有用,下面綜合下matlab分析下DTW語音識別。

 

  fname = sprintf( ‘%da.wav’ ,i);

    x=fname;

   [x,fs]=wavread(x);

    [x1 x2] =vad(x);

    m = mfcc(x);

m = m(x1-2:x2-2,:);

ref(i).mfcc = m;

首先這里是讀取一段語音,通過wavread,然后通過vad函數獲取語音的開始於結束部分,這里很多函數都是調用語音應用庫voicebox的,獲取x1,x2就是語音的兩端時候,先對語音信號整體計算mfcc梅爾倒譜,然后截取其中語音部分的作為其函數值。

    fname= sprintf( ‘%db.wav’ ,i);

    x=fname;

   [x,fs]=wavread(x);   

    [x1 x2] =vad(x);

    m = mfcc(x);

    m =m(x1-2:x2-2,:);

    test(i).mfcc =m;

然后以同樣的方法計算需要識別的語音文件其語音段的梅爾倒譜系數,然后對模版與識別文件進行“比對”,這里的比對方法就是DTW算法,我們經常把整個語音識別算法叫做DTW語音識別,但實際上,DTW主要是應用在比對兩個梅爾倒譜的比對上,而且這也是一種基於距離的比對,也可以認為是一種基於有導師學習的聚類方法。不過在講比對之前我們需要講下匹配,之前圖像匹配我們是采用譜分析的方法,而這里屬於一維信號的匹配,故解釋下相關模板匹配方法。語音識別的匹配需要解決的一個關鍵問題是說話人對同一個詞的兩次發音不可能完全相同,這些差異不僅包括音強的大小、頻譜的偏移,更重要的是發音時音節的長短不可能完全相同,而且兩次發音的音節往往不存在線性對應關系。設參考模板有M幀矢量{R(1),R(2),…R(m),…,R(M)},R(m)為第m幀的語音特征矢量,測試模板有N幀矢量{T(1),T(2),…T(n),…,T(N)},T(n)是第n幀的語音特征矢量。d(T(i n ),R(i m ))表示T中第i n 幀特征與R中i m 幀特征之間的歐幾里得距離。直接匹配是假設測試模板和參考模板長度相等,即i n =i m ;線性時間規整技術假設說話速度是按不同說話單元的發音長度等比例分布的,即  。這兩種假設其實都不符合實際語音的發音情況,我們需要一種更加符合實際情況的非線性時間規整技術,也就是DTW算法。 

圖.三種匹配模式的對比

DTW算法的原理圖如圖,把測試模板的各個幀號n=1~N在一個二維直角坐標系中的橫軸上標出,把參考模板的各幀m=1~M在縱軸上標出,通過這些表示幀號的整數坐標畫出一些縱橫線即可形成一個網格,網格中的每一個交叉點(t i ,r j )表示測試模式中某一幀與訓練模式中某一幀的交匯。DTW算法分兩步進行,一是計算兩個模式各幀之間的距離,即求出幀匹配距離矩陣,二是在幀匹配距離矩陣中找出一條最佳路徑。搜索這條路徑的過程可以描述如下:搜索從(1,1)點出發,對於局部路徑約束如圖,點(i n ,i m )可達到的前一個格點只可能是(i n -1,i m )、(i n -1,i m -l)和(in -1,i m -2)。那么(i n ,i m )一定選擇這三個距離中的最小者所對應的點作為其前續格點,這時此路徑的累積距離為:

D(i n ,i m )=d(T(i n ),R(i m ))+min{D(i n -1,i m ),D(i n -1,i m -1),D(i n -1,i m -2)},這樣從(l,1)點出發(令D(1,1)=0)搜索,反復遞推,直到(N,M)就可以得到最優路徑,而且D(N,M)就是最佳匹配路徑所對應的匹配距離。在進行語音識別時,將測試模板與所有參考模板進行匹配,得到的最小匹配距離 D min (N,M)所對應語音即為識別結果。

 

圖.DTW算法原理 

圖.局部約束路徑

以下就是matlab對於DTW算法的具體實現:

function dist = dtw(t,r)

n = size(t,1);

m = size(r,1);

% 幀匹配距離矩陣

d = zeros(n,m);

for i = 1:n

for j = 1:m

    d(i,j) = sum((t(i,:)-r(j,:)).^2);

end

end

% 累積距離矩陣

D =  ones(n,m) * realmax;

D(1,1) = d(1,1);

% 動態規划

for i = 2:n

for j = 1:m

    D1 = D(i-1,j);

    if j>1

        D2 = D(i-1,j-1);

    else

        D2 = realmax;

    end

    if j>2

        D3 = D(i-1,j-2);

    else

        D3 = realmax;

    end

    D(i,j) = d(i,j) + min([D1,D2,D3]);

end

end

dist = D(n,m);

圖.DTW語音識別算法測試結果

最終測試結果如圖,我們可以完成特定孤立詞的識別,其實這種局部優化的想法還有很多地方被使用到,如N皇后的解法上,我們可以采用的比較快速的方法中就有局部搜索法。在語音識別我們除了梅爾倒譜還可以采用LPC(Linear Prediction Coefficient,線性預測系數)推導出的LPCC(LinearPrediction Cepstrum Coefficient,線性預測倒譜系數),但是據說其對輔音結果差,對元音結果好,以上介紹的DTW算法實際上也是在英語的識別率上比較高,實際上英語的識別應該要比漢語簡單,在話語識別技術上,我們還需要考慮語音合成技術等一系列如何組成一段語音的方法,才能夠方便實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM