1. 程式人生 > >Connectionist Temporal Classification(CTC)、音識別模型小型綜述和一個簡易的語音識別模型的tensorflow實現

Connectionist Temporal Classification(CTC)、音識別模型小型綜述和一個簡易的語音識別模型的tensorflow實現

CTC是一種端到端的語音識別技術,他避免了需要字或者音素級別的標註,只需要句子級別的標註就可以進行訓練,感覺非常巧妙,也很符合神經網路浪潮人們的習慣。特別是LSTM+CTC相較於之前的DNN+HMM,LSTM能夠更好的捕捉輸入中的重要的點(LSTM隨著狀態數目增加引數呈線性增加,而HMM會平方增加),CTC打破了隱馬爾科夫的假設,把整個模型從靜態分類變成了序列分類。

語音識別的評價指標

在語音識別中,在資料集 S S

上評價模型 h h 的好壞一般用標籤錯誤率(Label Error Rate): L E R ( h
, S ) = 1 S
( x , z ) S
E D ( h ( x ) , z ) z LER(h,S)=\frac{1}{|S|}\sum_{(x,z)\in S}\frac{ED(h(x),z)}{|z|}
E D ( p , q ) ED(p,q) 表示 p p q q 兩個序列的編輯距離。

語音識別模型

在語音識別中,提取語音訊號的MFCC特徵 x x ,經過神經網路或者GMM處理後經過一個softmax層得到一個每個音素的後驗概率 y y y y 的類別有 L + 1 |L|+1 種, L L 是可能出現的字元,加1為建個符。定義 B B 為簡單的壓縮變換,把路徑 π \pi (路徑就是一種音素出現的路線)中相鄰相同的音素合併,空音素去掉,再特徵 x x 下定序列 l l 出現的條件概率為:

p ( l x ) = π = B 1 ( l ) p ( π x ) p(l|x)=\sum_{\pi=\in B^{-1}(l)}p(\pi|x)

前向後向演算法(Forward-Backward Algorithm)

定義符號 l p : q l_{p:q} 表示符號序列KaTeX parse error: Expected '}', got 'EOF' at end of input: …..l_{q-1},l_{q},容易得知,要想使得路徑 B ( π ) B(\pi') 滿足一定的 l l π \pi 路線上的狀態跳轉需要滿組 l l' 的先後順序,不同的符號之間可以插入blank。

定義前向變數 α ( t , u ) \alpha(t,u) α t ( t , u ) = π N T , B ( π 1 : t ) = 1 1 : u t = 1 t y π t t \alpha_t(t,u)=\sum_{\pi\in N^T,B(\pi_{1:t})=1_{1:u}}\prod_{t'=1}^ty_{\pi_{t'}}^{t'}

α ( t , s ) \alpha(t,s) 可以遞推的用 α ( t 1 , s ) α ( t 1 , s 1 ) \alpha(t-1,s),\alpha(t-1,s-1) 計算。

為了方便起見,我們在 l l 相鄰標籤之間插入了空白(blank),在開始和末尾也加入了空白,這樣我們用 l l' 表示這個新的標記, l l' 的長度就為 2 l + 1 2|l|+1 。在計算 l l' 字首的概率中,我們允許空白和非空白標籤之間轉移,那麼我麼有動態規劃的初始條件:

α ( 1 , 1 ) = y b 1 \alpha(1,1)=y_b^1

α ( 1 , 2 ) = y l 1 1 \alpha(1,2)=y_{l_1}^1

α ( 1 , u ) = 0 , u > 2 \alpha(1,u)=0,u>2

α ( t , 0 ) = 0 \alpha(t,0)=0

α ( t , u ) = 0 , u < U 2 ( T t ) 1 \alpha(t,u)=0,u<U'-2(T-t)-1

U U' 表示序列 2 l 1 : u + 1 2|l_{1:u}|+1

遞迴算式:

KaTeX parse error: Double subscript at position 19: …pha(t,u)=y_{t'}_̲{l'_u}^t\sum_{i…

KaTeX parse error: Expected group after '\right' at end of input: …nd{array}\right

簡單地說就是現在如果狀態是blank,那麼上一個狀態有可能是blank或者是上一個字元,如果現在的狀態是字元,那他上一個狀態可能是相同的字元,可能是blank,也可能是上一個非blank字元,但如果現在的字元與上一個非空字元相同,那意味著現在的狀態不能直接從上一個非空字元跳過來,必須隔一個blank,所以只能從blank和相同的字元跳過來。

相似的定義後向變數 β ( t , u ) \beta(t,u) α t ( t , s ) = π N T , B ( π t : T ) = 1 u : U t = t + 1 T y π t