1. 程式人生 > >動態時間規整演算法(Dynamic Time Warping, DTW)之初探單詞語音識別

動態時間規整演算法(Dynamic Time Warping, DTW)之初探單詞語音識別

 
  動態時間規整演算法(DTW)是最近接觸的一種提取時間序列模板方法。本文主要是一些自己的學習記錄,並適當地加入自己的理解。若有見解不一致之處,歡迎交流。

1 動態時間規整(DTW)基本思想

 
  先從單詞語音時間序列的規整問題引入DTW的基本思想。
  假設下圖兩個時間序列對應的是同一個單詞的發音(實則不是,只是為了便於理解)。黑色的線表示兩個時間序列的相似的點(用幅度差異刻畫時間序列點的相似性,幅度差異越小,相似性越高)。由於不同人語速上存在差異,某些人可能會把字母‘A’發得很長(延長髮音),某些人卻發得較短(短促發音),這樣同一個字母展現出來的時間序列上就存在著很大的差異,如圖中綠色圈出的時間波形所示。因此就需要對原始的兩個時間序列進行規整,即對時間序列進行延伸和縮短,提取兩個時間序列的相似性,從而對語音進行識別。
 

這裡寫圖片描述
圖1 動態時間規整基本思想 這裡寫圖片描述
圖2 時間序列規整結果
  圖2對應的就是原始時間序列的規整結果。
  所以動態時間規整的思想就是:通過對兩個時間序列點之間的相似性進行比較(圖1黑線),對原始時間序列進行拉伸到相同時間長度(原始時間序列的長度很可能不一致),進而比較兩個時間序列的相似性。
  動態時間規整要解決的問題就是:找到一條最優的規整路徑W=ϖ1,ϖ2...ϖkW = {\varpi _1},{\varpi _2}...{\varpi _k},其中wk=(i,j){w_k} = (i,j),即認為時間序列1的第i個點和時間序列2的第j個點是相似的。所有相似點的距離之和作為規整路徑距離,用規整路徑距離來衡量兩個時間序列的相似性。規整路徑距離越小,相似度越高。

2 動態規劃解DTW問題

 
  假設原始時間序列為X,Y,它們的時間長度分別為X\left| X \right|Y\left| Y \right|。對於規整路徑W=ϖ1,ϖ2...ϖkW = {\varpi _1},{\varpi _2}...{\varpi _k},有:
(1)max(X,Y)kX+Y\max (\left| X \right|,\left| Y \right|) \le k \le \left| X \right| + \left| Y \right|\tag{1}

X+Y(1)
  k表示兩個序列最終被拉伸的長度。
  規整路徑必須從ϖ1=(1,1){\varpi _1} = (1,1)開始,到ϖk=(X,Y){\varpi _k} = (\left| X \right|,\left| Y \right|)結束,以保證X和Y序列的每個座標點都出現一次。另外,規整路徑wk=(i,j){w_k} = (i,j)中的i和j必須是單調遞增的,所謂單調遞增指的是:
(2)wk=(i,j),wk+1=(i,j)iii+1,jjj+1{w_k} = (i,j),{w_{k + 1}} = (i',j'){\rm{      }}i \le i' \le i + 1,j \le j' \le j + 1\tag{2}
  所以如果路徑已經通過了格點(i,j),那麼路徑的下一個格點只能是(i+1,j),(i,j+1),(i+1,j+1)中的一種,如圖3中綠色剪頭所示。

這裡寫圖片描述
圖3 規整路徑示意
  所以對於路徑規整距離矩陣D(i,j)D(i,j),有:(3)D(i,j)=Dist(i,j)+min{D(i1,j),D(i,j1),D(i1,j1)}D(i,j) = Dist(i,j) + \min \{ D(i - 1,j),D(i,j - 1),D(i - 1,j - 1)\} \tag{3}
  其中,Dist(i,j)Dist(i,j)表示X序列第i個點與Y序列第j個點之間的距離(兩個點的相似性)。D(i,j)D(i,j)衡量的是X序列前i個點與Y序列前j個點的相似性。最終的規整路徑距離為D(X,Y)D(\left| X \right|,\left| Y \right|)D(X,Y)D(\left| X \right|,\left| Y \right|)的值越小,兩個原始時間序列的相似性越大。
  有了式子(3),我們就可以用動態規劃來對DTW問題進行求解。
  設定不一樣的取樣頻率對正弦函式進行取樣,得到兩個原始時間序列如圖4所示。其中時間序列1的前半段取樣頻率低於時間序列2前半段的取樣頻率,後半段高於時間序列2的取樣頻率。利用動態規劃的遞推公式(3)可以求得路徑規整矩陣D(i,j)D(i,j)如圖5所示。由D(i,j)D(i,j)可得規整路徑如圖6所示。規整路徑規定了時間序列X與時間序列Y的時間對齊方式。由此可以得到如圖7所示的規整時間序列。可見,在DTW的作用下,完成了兩個時間序列的規整目標。
  這邊程式碼借鑑於動態時間規整借鑑程式碼,在此多謝博主!!
  這裡寫圖片描述
圖4 取樣頻率不同而生成的兩個原始時間序列
這裡寫圖片描述
圖5 規整距離矩陣
這裡寫圖片描述
圖6 規整路徑
這裡寫圖片描述
圖7 DTW規整後的時間序列
  圖7所示的規整序列基本達到了時間序列的對齊目的。可是,如果有兩個時間序列的幅值不同,將會產生什麼樣的規整結果?圖9是對圖8進行規整得到的規整時間序列。由此可知,最終的效果並不理想。為了使得DTW能夠提取原始序列的時間特徵而忽略幅值對序列規整的影響,我在原有程式碼的基礎上加入了zscore對原始資料進行標準化。最終的結果如圖10所示。
 這裡寫圖片描述
圖8 具有不同幅值的兩個原始時間序列
這裡寫圖片描述
圖9 不同幅值時間序列的規整結果
這裡寫圖片描述
圖10 加入zscore標準化處理後的規整結果

3 一個簡單的單詞語音音訊識別例項

●語音時間序列規整

   這邊我利用自己錄製的幾段單詞mp3檔案來探討動態時間規整演算法對語音時間序列的對齊。圖11所示為兩段‘water’這個單詞的語音時間序列。由於語速和發音時刻的差異,兩個原始序列之間存在差異,但明顯可以看出兩者之間有很大的相似性。利用第2小節闡述的DTW演算法,最終的語音規整結果如圖12所示,基本達到了目的。當然這邊做的非常粗糙,比如語音裡面的很多毛刺,低頻訊號完全可以用濾波的方式先消掉,然後再交由DTW進行處理。

這裡寫圖片描述
圖11 兩段’water’音訊的原始時間序列
 這裡寫圖片描述
圖12 語音時間序列規整

●單詞語音音訊識別

   如何利用DTW演算法來做簡單的語音音訊識別?第2小節已經提及,DTW做序列規整時利用規整路徑距離D(X,Y)D(\left| X \right|,\left| Y \right|)來衡量時間序列X和時間序列Y的相似性。所以,假設我們現有‘water’,’teacher’,’apple’的幾段音訊序列,要識別某一個音訊的發音到底是這三個單詞中的哪一個,就只需要將這個待識別音訊序列分別與三個單詞的音訊序列做規整,得到各自的規整路徑距離D(X,Y)D(\left| X \right|,\left| Y \right|)(即附錄程式碼中的變數Dist)。D(X,Y)D(\left| X \right|,\left| Y \right|)越小,說明兩者的相似度越高。這樣可以初步完成單詞語音音訊識別的任務。當然,實際上進行這樣操作的複雜度是很高的,實用性很差。

4 總結

 
  ① 動態時間規整演算法(DTW)是一種時間序列對齊方法。它通過尋找一條規整路徑來使得規整距離最小。規整路徑距離D(X,Y)D(\left| X \right|,\left| Y \right|)表徵了兩個時間序列的相似性:D(X,Y)D(\left| X \right|,\left| Y \right|)越小,相似度越高。
  ② 可以利用DTW演算法來做單詞音訊的識別。

5 程式碼附錄