基於WFST的語音識別解碼器

學習語音識別有些時間了。老闆要求我們基於Kaldi搭一個語音識別系統,在設備上通過MIC講話,連着設備的PC的console上就能基本實時顯示出講話的內容。由於我們都是小白,剛開始可以要求低些,就用傳統的GMM-HMM,能實現孤立詞識別就算達標了,後面隨着這方面能力的提高,再做更難一點的。任務下達後我根據之前對kaldi的簡單理解把模塊分成了三部分:數據準備和MFCC、GMM-HMM、解碼網絡創建和解碼,由三個人每人負責一部分學習,掌握基本原理,搞清楚有哪些事情要做。在其他兩個同學先挑了模塊後就由我來負責解碼網絡構建和解碼部分了。

 

我們三個學習了kaldi兩三個星期後感覺下來kaldi不是很容易上手,主要原因有四。一是我們都是新手,語音識別領域的一些概念和套路還沒完全搞清楚。二是kaldi的文檔偏少,不利於代碼的理解。三是kaldi是算法和工具的集合,語音識別的整個流程是靠很多複雜的shell和Perl腳本把這些工具串起來實現的,不易讀。四是kaldi是用C++實現的,而我們先前主要是用C開發軟件(芯片公司的軟件工程師多數都是在底層用C開發軟件)。我們克服了這些困難,理出了每個模塊有哪些事情要做,也搞清楚了軟件實現分訓練和識別兩大部分,有些模塊在訓練和識別中都有,比如MFCC,而有些模塊只在訓練中有。訓練是給識別做準備的,訓練得到聲學模型、字典和語言模型,並基於WFST將這三個合併成一個大的解碼網絡用於識別中。真正運行起來的語音識別系統只有識別部分的軟件在運行。

 

具體到我負責的解碼,主要有兩大部分組成,一是生成解碼網絡,二是基於解碼網絡解碼。這裏面的重中之重就是WFST(加權的有限狀態轉換器)。WFST屬於半環代數理論。我是學控制出身,讀本科時學了高數、矩陣、概率論等,讀研究生時對矩陣進行了更深入的學習(控制學科對矩陣的要求較高),其他數學分支都沒學過,半環代數理論顯然是新東西。由於相關基礎沒有,學習起來不是很輕鬆,網上也說這學科對學數學和計算機理論的人學起來輕鬆些。現階段我們只是搭語音識別系統,不需要深入研究算法,再加上時間也不允許(老闆給我們定下了dealline),就僅僅瞭解了WFST的基本原理,後面就通過具體的例子來熟悉腳本和代碼流程。Kaldi裏有兩種類型的解碼器:offline 和 online。yesno就是最簡單的offline解碼器的例子,通過運行這個例子基本搞清楚了相關腳本和函數的意思。因爲我們要搭的是在線實時系統,offline的參考性不大,也就沒太關注,轉而去看kaldi裏的online decoder了。kaldi裏的online decoder有兩個版本:online(老版本) 和online2(新版本)。官網推薦用online2(基於例子RM(resource management)),並且聲稱要逐漸把老版本online廢棄掉。但是現在RM的語料庫無法從網絡上下載到,所以例子RM就無法運行,只能去用老版本的online了。還好好多使用者說還是老版本的online好用,總算給我吃了一顆定心丸。看了相關的博客,都是基於kaldi裏的唯一的中文識別的例子thchs30來做在線解碼的。根據博客的指導,先下語料庫,做各種訓練得到解碼網絡等。再下載portaudio,使能從PC的MIC上採集到語音數據。最後改寫腳本運行,這樣一個在線解碼的例子就跑起來了,PC的console上實時顯示出了說的文字。在代碼里加些log跟蹤一下,也就搞清楚了在線解碼時軟件實現的機制和各種調用過程。

 

就這樣解碼相關的除了算法外其他的基本都搞清楚了。按照慣例,要做PPT給組內同學講,讓大家共同提高。我就根據自己的理解做了語音識別解碼器相關的內容(一些圖片還是借用了各種文檔和博客裏的,再此表示感謝,就不一一列出了)。下面就是我做的PPT的內容,給有需要的朋友看看。如果有錯誤,煩請指出,非常感謝!

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