做者:桂。html
時間:2017-05-31 16:17:29python
連接:http://www.cnblogs.com/xingshansi/p/6924911.html 算法
前言dom
動態時間規整(Dynamic Time Warping,DTW)是孤立詞識別的早期技術,梳理一下,主要包括:tornado
1)孤立詞識別操做步驟;測試
2)DTW原理;spa
內容基本就是兩個博文的整合,最後一併給出連接。3d
1、孤立詞識別操做步驟code
基本原理:htm
基本操做是預加劇、分幀,端點檢測技術又叫有話幀檢測(Voice activity detection, VAD)技術。特徵提取參考以前的博文。例如:
檢測語音→特徵提取。
多說一句,倒譜就是將乘性關係變爲加性關係:xy→logx+logy,一般的譜分析咱們都是採用頻譜,或者小波這樣與頻譜的區別只是不一樣量度,這些都是解決加性噪聲的濾波問題,倒譜是一種爲了濾除乘性噪聲的譜方法,簡單的說就是對功率譜求log,再反傅里葉變換,公式如 。
特徵提取以後就是特徵的模板匹配,也就是DTW算法。
2、DTW算法思路
A-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(in),R(im))表示T中第in幀特徵與R中im幀特徵之間的歐幾里得距離。直接匹配是假設測試模板和參考模板長度相等,即in=im;線性時間規整技術假設說話速度是按不一樣說話單元的發音長度等比例分佈的,即。這兩種假設其實都不符合實際語音的發音狀況,咱們須要一種更加符合實際狀況的非線性時間規整技術,也就是DTW算法。三種匹配模式的對比:
B-DTW思路
首先仍是介紹下DTW的思想:假設如今有一個標準的參考模板R,是一個M維的向量,即R={R(1),R(2),……,R(m),……,R(M)},每一個份量能夠是一個數或者是一個更小的向量。如今有一個才測試的模板T,是一個N維向量,即T={T(1),T(2),……,T(n),……,T(N)}一樣每一個份量能夠是一個數或者是一個更小的向量,注意M不必定等於N,可是每一個份量的維數應該相同。
因爲M不必定等於N,如今要計算R和T的類似度,就不能用之前的歐式距離等相似的度量方法了。那用什麼方法呢?DTW就是爲了解決這個問題而產生的。
首先咱們應該知道R中的一個份量R(m)和T中的一個份量T(n)的維數是相同的,它們之間能夠計算類似度(即距離)。在運用DTW前,咱們要首先計算R的每個份量和T中的每個份量之間的距離,造成一個M*N的矩陣。(爲了方便,行數用將標準模板的維數M,列數爲待測模板的維數N)。
而後下面的步驟該怎麼計算呢?用個例子來看看。
這個例子中假設標準模板R爲字母ABCDEF(6個),測試模板T爲1234(4個)。R和T中各元素之間的距離已經給出。以下:
既然是模板匹配,因此各份量的前後匹配順序已經肯定了,雖然不是一一對應的。如今題目的目的是要計算出測試模板T和標準模板R之間的距離。由於2個模板的長度不一樣,因此其對應匹配的關係有不少種,咱們須要找出其中距離最短的那條匹配路徑。現假設題目知足以下的約束:當從一個方格((i-1,j-1)或者(i-1,j)或者(i,j-1))中到下一個方格(i,j),若是是橫着或者豎着的話其距離爲d(i,j),若是是斜着對角線過來的則是2d(i,j).其約束條件以下圖像所示:
其中g(i,j)表示2個模板都從起始份量逐次匹配,已經到了M中的i份量和T中的j份量,而且匹配到此步是2個模板之間的距離。而且都是在前一次匹配的結果上加d(i,j)或者2d(i,j),而後取最小值。
因此咱們將全部的匹配步驟標註後以下:
怎麼得來的呢?好比說g(1,1)=4, 固然前提都假設是g(0,0)=0,就是說g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.
g(2,2)=9是同樣的道理。首先若是從g(1,2)來算的話是g(2,2)=g(1,2)+d(2,2)=5+4=9,由於是豎着上去的。
若是從g(2,1)來算的話是g(2,2)=g(2,1)+d(2,2)=7+4=11,由於是橫着往右走的。
若是從g(1,1)來算的話,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.由於是斜着過去的。
綜上所述,取最小值爲9. 全部g(2,2)=9.
固然在這以前要計算出g(1,1),g(2,1),g(1,2).所以計算g(I,j)也是有必定順序的。
其基本順序能夠體如今以下:
計算了第一排,其中每個紅色的箭頭表示最小值來源的那個方向。當計算了第二排後的結果以下:
最後都算完了的結果以下:
到此爲止,咱們已經獲得了答案,即2個模板直接的距離爲26. 咱們還能夠經過回溯找到最短距離的路徑,經過箭頭方向反推回去。以下所示:
到這裏,估計你們動手算一下就會明白了,其實這個就是動態規劃的思路:
主要code:
from numpy import array, zeros, argmin, inf, equal, ndim from scipy.spatial.distance import cdist def dtw(x, y, dist): """ Computes Dynamic Time Warping (DTW) of two sequences. :param array x: N1*M array :param array y: N2*M array :param func dist: distance used as cost measure Returns the minimum distance, the cost matrix, the accumulated cost matrix, and the wrap path. """ assert len(x) assert len(y) r, c = len(x), len(y) D0 = zeros((r + 1, c + 1)) D0[0, 1:] = inf D0[1:, 0] = inf D1 = D0[1:, 1:] # view for i in range(r): for j in range(c): D1[i, j] = dist(x[i], y[j]) C = D1.copy() for i in range(r): for j in range(c): D1[i, j] += min(D0[i, j], D0[i, j+1], D0[i+1, j]) if len(x)==1: path = zeros(len(y)), range(len(y)) elif len(y) == 1: path = range(len(x)), zeros(len(x)) else: path = _traceback(D0) return D1[-1, -1] / sum(D1.shape), C, D1, path def _traceback(D): i, j = array(D.shape) - 2 p, q = [i], [j] while ((i > 0) or (j > 0)): tb = argmin((D[i, j], D[i, j+1], D[i+1, j])) if (tb == 0): i -= 1 j -= 1 elif (tb == 1): i -= 1 else: # (tb == 2): j -= 1 p.insert(0, i) q.insert(0, j) return array(p), array(q)
放在音頻裏就是:模板/測試樣本的STFT取幅度後,每一幀存在一個sum(dist)的距離dij,i爲模板的第i幀,j表示測試樣本的第j幀,這樣就得出了路徑,從而計算最短路徑,完成識別:
3、其餘
其實DTW是模板匹配的通常思路,這是理論層面。孤立詞識別是它的一個應用,對於尺寸不一樣的匹配問題,DTW都應該有必定效果,好比數字識別.首先創建模板:
而後是測試樣本:
測試樣本有大有小,直接模板匹配是不合適的。實際應用中數字可能形狀存在差別、且有傾斜,須要把字符切割出來,而不考慮白框。這裏只是梳理思路,僅考慮最理想的狀況。
例如利用DTW:將圖片二值化im2bw→拉成向量img(:)→將測試數據利用DTW,分別與模板匹配,找出最短距離的最小值,便是對應的數字。
參考