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

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

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

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

這裏寫圖片描述
圖1 動態時間規整基本思想

這裏寫圖片描述
圖2 時間序列規整結果

  圖2對應的就是原始時間序列的規整結果。

  所以動態時間規整的思想就是:通過對兩個時間序列點之間的相似性進行比較(圖1黑線),對原始時間序列進行拉伸到相同時間長度(原始時間序列的長度很可能不一致),進而比較兩個時間序列的相似性。
  動態時間規整要解決的問題就是:找到一條最優的規整路徑W=ϖ1,ϖ2...ϖk ,其中wk=(i,j) ,即認爲時間序列1的第i個點和時間序列2的第j個點是相似的。所有相似點的距離之和作爲規整路徑距離,用規整路徑距離來衡量兩個時間序列的相似性。規整路徑距離越小,相似度越高。

2 動態規劃解DTW問題

  假設原始時間序列爲X,Y,它們的時間長度分別爲|X||Y| 。對於規整路徑W=ϖ1,ϖ2...ϖk ,有:
(1)max(|X|,|Y|)k|X|+|Y|
  k表示兩個序列最終被拉伸的長度。
  規整路徑必須從ϖ1=(1,1) 開始,到ϖk=(|X|,|Y|) 結束,以保證X和Y序列的每個座標點都出現一次。另外,規整路徑wk=(i,j) 中的i和j必須是單調遞增的,所謂單調遞增指的是:
(2)wk=(i,j),wk+1=(i,j)    iii+1,jjj+1
  所以如果路徑已經通過了格點(i,j),那麼路徑的下一個格點只能是(i+1,j),(i,j+1),(i+1,j+1)中的一種,如圖3中綠色剪頭所示。

這裏寫圖片描述
圖3 規整路徑示意

  所以對於路徑規整距離矩陣D(i,j) ,有:
(3)D(i,j)=Dist(i,j)+min{D(i1,j),D(i,j1),D(i1,j1)}
  其中,Dist(i,j) 表示X序列第i個點與Y序列第j個點之間的距離(兩個點的相似性)。D(i,j) 衡量的是X序列前i個點與Y序列前j個點的相似性。最終的規整路徑距離爲D(|X|,|Y|)D(|X|,|Y|) 的值越小,兩個原始時間序列的相似性越大。
  有了式子(3),我們就可以用動態規劃來對DTW問題進行求解。
  設定不一樣的採樣頻率對正弦函數進行採樣,得到兩個原始時間序列如圖4所示。其中時間序列1的前半段採樣頻率低於時間序列2前半段的採樣頻率,後半段高於時間序列2的採樣頻率。利用動態規劃的遞推公式(3)可以求得路徑規整矩陣D(i,j) 如圖5所示。由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|) 來衡量時間序列X和時間序列Y的相似性。所以,假設我們現有‘water’,’teacher’,’apple’的幾段音頻序列,要識別某一個音頻的發音到底是這三個單詞中的哪一個,就只需要將這個待識別音頻序列分別與三個單詞的音頻序列做規整,得到各自的規整路徑距離D(|X|,|Y|) (即附錄代碼中的變量Dist)。D(|X|,|Y|) 越小,說明兩者的相似度越高。這樣可以初步完成單詞語音音頻識別的任務。當然,實際上進行這樣操作的複雜度是很高的,實用性很差。

4 總結

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

5 代碼附錄

  代碼和示例音頻文件可以從這裏下載動態時間規整算法代碼+單詞音頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章