dtw算法 c语言实现,dtw算法 - WELEN
dtw路徑與線性變換路徑對比
轉(zhuǎn)自:http://baike.baidu.com/link?url=z4gFUEplOyqpgboea6My0mZPBh3_sZZpk6EfpzwuZ16uMlyPl7utZQi-XNkotLzLrGih9zUFNG4_tygNg8khiK
在孤立詞 語音識別
中,最為簡單有效的方法是采用DTW(Dynamic Time Warping,動態(tài)時間歸整)算法,該算法基于動態(tài)規(guī)劃(DP)的思想,解決了發(fā)音長短不一的模板匹配問題,是語音識別中出現(xiàn)較早、較為經(jīng)典的一種算法,用于孤立詞識別。HMM算法在訓(xùn)練階段需要提供大量的語音數(shù)據(jù),通過反復(fù)計算才能得到模型參數(shù),而DTW算法的訓(xùn)練中幾乎不需要額外的計算。所以在孤立詞 語音識別
中,DTW算法仍然得到廣泛的應(yīng)用。
無論在訓(xùn)練和建立模板階段還是在識別階段,都先采用端點(diǎn)算法確定語音的起點(diǎn)和終點(diǎn)。已存入模板庫的各個詞條稱為參考模板,一個參考模板可表示為R={R(1),R(2),……,R(m),……,R(M)},m為訓(xùn)練語音幀的時序標(biāo)號,m=1為起點(diǎn)語音幀,m=M為終點(diǎn)語音幀,因此M為該模板所包含的語音幀總數(shù),R(m)為第m幀的語音特征矢量。所要識別的一個輸入詞條語音稱為測試模板,可表示為T={T(1),T(2),……,T(n),……,T(N)},n為測試語音幀的時序標(biāo)號,n=1為起點(diǎn)語音幀,n=N為終點(diǎn)語音幀,因此N為該模板所包含的語音幀總數(shù),T(n)為第n幀的語音特征矢量。參考模板與測試模板一般采用相同類型的特征矢量(如 MFCC
,LPC系數(shù))、相同的幀長、相同的窗函數(shù)和相同的幀移。
假設(shè)測試和參考模板分別用T和R表示,為了比較它們之間的相似度,可以計算它們之間的距離 D[T,R],距離越小則相似度越高。為了計算這一失真距離,應(yīng)從T和R中各個對應(yīng)幀之間的距離算起。設(shè)n和m分別是T和R中任意選擇的幀號,d[T(n),R(m)]表示這兩幀特征矢量之間的距離。距離函數(shù)取決于實際采用的距離度量,在DTW算法中通常采用歐氏距離。
若N=M則可以直接計算,否則要考慮將T(n)和R(m)對齊。對齊可以采用線性擴(kuò)張的方法,如果N
若把測試模板的各個幀號n=1~N在一個二維直角坐標(biāo)系中的橫軸上標(biāo)出,把參考模板的各幀號m=1~M在縱軸上標(biāo)出,通過這些表示幀號的整數(shù)坐標(biāo)畫出一些縱橫線即可形成一個網(wǎng)絡(luò),網(wǎng)絡(luò)中的每一個交叉點(diǎn)(n,m)表示測試模式中某一幀的交匯點(diǎn)。DP算法可以歸結(jié)為尋找一條通過此網(wǎng)絡(luò)中若干格點(diǎn)的路徑,路徑通過的格點(diǎn)即為測試和參考模板中進(jìn)行計算的幀號。路徑不是隨意選擇的,首先任何一種語音的發(fā)音快慢都有可能變化,但是其各部分的先后次序不可能改變,因此所選的路徑必定是從左下角出發(fā),在右上角結(jié)束
為了描述這條路徑,假設(shè)路徑通過的所有格點(diǎn)依次為(n 1
,m 1
),……,(n i
,m j
),……,(n N
,m M
),其中(n 1
,m 1
)=(1,1),(n N
,m M
)=(N,M)。 路徑
可以用函數(shù)m = Oslash;(n )描述,其中n =i,i=1,2,……,N,?(1)=1,?(N)=M。為了使路徑不至于過傾斜,可以約束斜率在0.5~2的范圍內(nèi),如果路徑已經(jīng)通過了格點(diǎn)(n ,m ), [1]
那么下一個通過的格點(diǎn)(n ,m )只可能是下列三種情況之一:
(n ,m )=(n +1,m +2)
(n ,m )=(n +1,m +1)
(n ,m )=(n +1,m )
用r表示上述三個約束條件。求最佳 路徑
的問題可以歸結(jié)為滿足約束條件r時,求最佳路徑函數(shù)m =?(n ),使得沿路徑的積累距離達(dá)到最小值,即:
搜索該路徑的方法如下:搜索從(n ,m )點(diǎn)出發(fā),可以展開若干條滿足?的路徑,假設(shè)可計算每條路徑達(dá)到(n ,m )點(diǎn)時的總的積累距離,具有最小累積距離者即為最佳路徑。易于證明,限定范圍的任一格點(diǎn)(n ,m )只可能有一條搜索路徑通過。對于(ni,mi),其可達(dá)到該格點(diǎn)的前一個格點(diǎn)只可能是(n ,m )、(n ,m -1)和(n ,m -2),那么(n ,m )一定選擇這3個距離之路徑延伸而通過(n ,m ),這時此路徑的積累距離為:
D[(n ,m )]=d[T(n ),R(m )]+D[(n , m )]
其中的n = n -1 ,m -1由下式?jīng)Q定:
D[(n ,m )]=min{D[(n , m )],D[(n , m -1)],D[(n , m -2)]}
這樣可以從(n ,m )=(1,1)出發(fā)搜索(n ,m ),再搜索(n ,m ),……,對每一個(n ,m )都存儲相應(yīng)的前一格點(diǎn)(n ,m )及相應(yīng)的幀匹配距離d[n ,m ]。搜索到(n ,m )時,只保留一條最佳路徑。如果有必要的話,通過逐點(diǎn)向前尋找就可以求得整條路徑。這套DP算法便是DTW算法。
DTW算法可以直接按上面描述來實現(xiàn),即分配兩個N×M的矩陣,分別為積累距離矩陣D和幀匹配距離矩陣d,其中幀匹配距離矩陣d(i,j)的值為測試模板的第i幀與參考模板的第j幀間的距離。D(N,M)即為最佳匹配路徑所對應(yīng)的匹配距離
總結(jié)
以上是生活随笔為你收集整理的dtw算法 c语言实现,dtw算法 - WELEN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本字段和表单设计-UI组件系列
- 下一篇: 阿拉伯语排版设计_针对说阿拉伯语的用户的