學習語音識別有些時間了。老闆要求咱們基於Kaldi搭一個語音識別系統,在設備上經過MIC講話,連着設備的PC的console上就能基本實時顯示出講話的內容。因爲咱們都是小白,剛開始能夠要求低些,就用傳統的GMM-HMM,能實現孤立詞識別就算達標了,後面隨着這方面能力的提升,再作更難一點的。任務下達後我根據以前對kaldi的簡單理解把模塊分紅了三部分:數據準備和MFCC、GMM-HMM、解碼網絡建立和解碼,由三我的每人負責一部分學習,掌握基本原理,搞清楚有哪些事情要作。在其餘兩個同窗先挑了模塊後就由我來負責解碼網絡構建和解碼部分了。算法
咱們三個學習了kaldi兩三個星期後感受下來kaldi不是很容易上手,主要緣由有四。一是咱們都是新手,語音識別領域的一些概念和套路還沒徹底搞清楚。二是kaldi的文檔偏少,不利於代碼的理解。三是kaldi是算法和工具的集合,語音識別的整個流程是靠不少複雜的shell和Perl腳本把這些工具串起來實現的,不易讀。四是kaldi是用C++實現的,而咱們先前主要是用C開發軟件(芯片公司的軟件工程師多數都是在底層用C開發軟件)。咱們克服了這些困難,理出了每一個模塊有哪些事情要作,也搞清楚了軟件實現分訓練和識別兩大部分,有些模塊在訓練和識別中都有,好比MFCC,而有些模塊只在訓練中有。訓練是給識別作準備的,訓練獲得聲學模型、字典和語言模型,並基於WFST將這三個合併成一個大的解碼網絡用於識別中。真正運行起來的語音識別系統只有識別部分的軟件在運行。shell
具體到我負責的解碼,主要有兩大部分組成,一是生成解碼網絡,二是基於解碼網絡解碼。這裏面的重中之重就是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的內容,給有須要的朋友看看。若是有錯誤,煩請指出,很是感謝!函數