上一專題GMM-HMM聲學模型中講述了其理論知識,這一章利用理論搭建一套GMM-HMM系統,來識別連續0123456789的英文語音。
本系統是單音素,未涉及后面三音子的訓練以及決策樹的內容。
在GMM專題和HMM專題中分別講述了其訓練都是EM算法,那么融合形成GMM-HMM模型后會如何訓練?是應用一個EM算法還是分別應用EM算法呢?
1 Viterbi解碼
在HMM專題中,HMM解碼有兩種方法,分別為Viterbi算法和近似算法,本系統采用Viterbi算法進行解碼。
針對一句語料進行解碼,提取該句語料特征:68*12,其中,68表示幀數,12表示MFCC特征。
預先訓練了HMM對由孤立數字組成的數據的觀察概率,這就是初始模型,將用來解碼(識別、預測、測試)。
即給定模型λ=(A,B,Π)和觀測序列O={o1,o2,...oT},求給定觀測序列條件下,最可能出現的對應的狀態序列。
Viterbi解碼作為識別結果(預測結果),可以在此基礎上進行優化訓練模型。
系統文件:
src/
步驟一:傳入音頻數據
輸入:GMM參數、狀態轉移參數、音頻數據、單詞標簽
輸出:chart
步驟二:前段信號處理(計算mfcc,gmm_probs等)
mainObj.init_utt():
計算每幀MFCC特征:
計算每幀gmm_probs:
步驟三:Viterbi解碼
隨機數字串的識別網絡:
串接HMM
隨機數字串的解碼網絡:
第一幀可從任意一個數字的HMM的開始狀態開始,對比所有路徑,選擇概率最大的那條路徑作為解碼結果。
Viterbi算法流程:
算法實現:
輸出chart:
步驟四:Viterbi回溯
實際上chart圖最后一幀即為最大似然概率對應的弧號,可以基於此回溯得到完成的弧號序列,弧號與狀態之間存在映射關。
回溯結果:
對於輸入一段語音,解碼結果為:
Nine Two Nine Four Five Two Five Eight Nine Two
(解碼實際上是獲得最可能的狀態系列,狀態可以組成音素,音素可以組成單詞)
2 GMM訓練
Viterbi-EM訓練
上述Viterbi解碼是為GMM-HMM訓練做准備的,提供了對齊的數據。
在HMM專題中,HMM訓練有兩種方法,分別為Viterbi訓練和Baum-Welch訓練。
Viterbi學習算法是一種硬對齊,所謂硬對齊就是只有0或者1的歸屬,即一幀只歸宿於某個狀態,而Baum-Welch學習算法是一種軟對齊,即一幀以一定概率歸宿於某個狀態。
模型的訓練即給定觀測序列O={o1,o2,...oT}和初始模型,調整模型λ=(A,B,Π)的參數,使該模型下觀測序列的條件概率P(O|λ)最大。
(不能無中生有的訓練一個λ=(A,B,Π),要有一個壞的初始模型為基礎來調整參數。GMM參數訓練必須依托於HMM,隨着HMM的E步更新而更新)
Viterbi-EM訓練全過程:
首先初始化對齊,平均分配幀給狀態,可以得到初始GMM-HMM模型,利用初始模型和初始參數進行Viterbi解碼,得到新的對齊。對齊后進行hard count。這里hard count 是HMM訓練的E步,也是GMM訓練的基礎,GMM訓練的數據就是count后得到的。
count后HMM可以進行M步得到轉移概率,這就是模型中的A參數。GMM則在count基礎上進行E步計算后驗概率,再進行M步得到新的均值和方差參數,這是模型中的B參數。
至於Π,就是[1,0,0,0...],一開始在狀態一的概率是100%。
在語音識別應用中由於HMM是從左到右的模型,第一個必然是狀態一,即P(q0=1)=1。所以沒有pi這個參數了。
注釋:
沒有考慮HMM中所有可能的路徑來計算每個幀處每個弧的后驗計數,而是使用維特比解碼來找到HMM中的單個最可能路徑。
步驟一:傳入數據
輸入:初始GMM參數、Viterbi解碼的最優狀態序列、音頻數據、迭代次數
輸出:新GMM參數
步驟二:HMM的E步:hard count
gmmStates.updata():
步驟三:GMM的EM步
add_gmm_count:
根據count獲得多少幀對應一個狀態,而這個狀態對應着一個GMM,以這些幀的數據重新計算GMM參數。
步驟四:更新GMM參數
gmmStates.reestimate():
GMM新參數與初始參數對比:
3 前向后向算法訓練
基於Viterbi-EM算法來估計模型對於計算語料中幀對應狀態的弧號存在計算復雜度指數級增加的問題,為解決上述問題,可以用前向后向算法來估計模型中參數。
Baum-Welch學習算法也叫前向后向算法,是一種軟對齊,即一幀以一定概率歸宿於某個狀態。
Baum-Welch訓練全過程:
首先初始化對齊,平均分配幀給狀態,可以得到初始GMM-HMM模型(也可以任意初始化所有參數),利用初始模型和初始參數進行Baum-Welch算法。
Baum-Welch算法考慮所有的路徑,對於某個狀態,將所有時刻的狀態占用概率相加,可以認為是一個軟次數,即進行soft count,估計狀態占用概率(期望),即EM算法的E步。
基於估計的狀態占用概率,重新估計參數 λ (最大化),即EM算法的M步。
至於Π,就是[1,0,0,0...],一開始在狀態一的概率是100%。在語音識別應用中由於HMM是從左到右的模型,第一個必然是狀態一,即P(q0=1)=1。所以沒有pi這個參數了。
注釋:
我們的詞匯由十二個單詞(一到九,零,OH和靜默)組成,總共包含34個音素。每個音素使用3個HMM狀態(不包括nal狀態),總共有102個狀態。這些狀態中的每一個都有我們需要向其分配概率的兩個輸出弧,以及我們需要進行估計的GMM/高斯曲線。為簡單起見,我們將忽略轉移概率(將它們全部設置為1)。實際上,轉移概率對性能的影響很小。
步驟一:傳入數據
輸入:初始GMM參數、狀態轉移參數(fsm圖)、音頻數據、迭代次數
輸出:更新后GMM參數
步驟二:前向后向算法計算后驗概率
forward_backward():
算法實現:
步驟三:GMM的EM步(與上同)
gmmStates.update()
步驟四:更新GMM參數(與上同)
gmmStates.reestimate()
最終將前向概率與后向概率以及gmm模型的權重寫入值chart圖中,其中gmm權重在代碼中表示為后驗概率,最后后驗概率表示如下圖所示。
從上圖可知,gmm權重大部分為0,這樣大大減少了模型計算量且便於參數計算。
4 GMM-HMM模型測試
這是前向后向算法進行五次迭代訓練出來的GMM-HMM模型。其中N是num總數,C是corr准確數,S是sub替換錯誤,D是Del是刪除錯誤,I是INS插入錯誤。
模型識別率為68%。
5 總結
如果不是針對數字,而是所有普通詞匯,可能達到十幾萬個詞,解碼過程將非常復雜,識別結果組合太多,識別結果不會太理想。因此需要引入語言模型來約束識別結果。讓“今天天氣很好”的概率高於“今天天汽很好”的概率,得到聲學模型概率高,又符合表達的句子。
——————
淺談則止,細致入微AI大道理
掃描下方“AI大道理”,選擇“關注”公眾號
歡迎加入!
▼
下期預告
▼
AI大語音(十)——語言模型
▼
往期精彩回顧
▼
AI大語音(一)——語音識別基礎
AI大語音(二)——語音預處理
AI大語音(三)——傅里葉變換家族
AI大語音(四)——MFCC特征提取
AI大語音(五)——隱馬爾科夫模型(HMM)
AI大語音(六)——混合高斯模型(GMM)
AI大語音(七)——基於GMM的0-9語音識別系統
AI大語音(八)——GMM-HMM聲學模型





































