官方搭建指南傳送門:Kaldi for Dummies tutorial
本系統的搭建意義:使用自己錄製的語料庫搭建一個簡單的ASR系統,整個系統一共包含0到9共十個英文數字,系統搭建完成後可進行簡單的孤立詞識別(僅限數字0到9)。系統雖小,但五臟俱全,是入門理解如何利用kaldi搭建語音系統的好例子。
因爲官方教程已經說的很詳細了,所以這裏只講一些作爲新手去實踐這個tutorial時需要額外注意的地方。
一,預前準備:- SRILM的安裝:SRILM是一個語言模型工具包,沒有它你就無法生成自己的語言模型,也就無法搭建自己的ASR系統(因爲語言模型,聲學模型,詞典是傳統的ASR系統的必要組成部分,缺一不可)這個安裝很重要,很多新手容易敗在這一關。而官方搭建指南里只用瞭如下一段話概述安裝流程,並且放在了快要工程定稿的部分:
SRILM installation You also need to install language modelling toolkit that is used in my example - SRI Language Modeling Toolkit (SRILM). Task For detailed installation instructions go to kaldi-trunk/tools/install_srilm.sh (read all comments inside).
如果你是選擇用./install_srilm.sh文件來執行srilm的相關安裝操作,你的終端最終會反饋給你這些信息:
Installation of SRILM finished successfully,
Please source the tools/env.sh in your path.sh to enable it
如果你忽略後面那句”Installation of SRILM finished successfully,Please source the tools/env.sh in your
path.sh to enable it",你的工程很有可能就無法再進行下去,在新工程裏搭建語言模型時依然會報出“SRILM工具箱可能沒有安裝”的提示,就算你運行env.sh來添加環境路徑也無濟於事。
當然了,因爲我也是新手,存在很多知識漏洞和不足的地方,如果有哪位大佬能教我怎麼把官方給的方法work起來,我將非常感謝!!
綜上所述,我最終沒有選擇使用install_srilm.sh來安裝srilm。簡單介紹下我後來採取的安裝小偏方:
1,在安裝SRILM前先安裝tcl。tcl是可嵌入式腳本語言,用於腳本編程和測試。首先下載tcl8.6.6-src.tar.gz (自行網上搜尋下載),解壓到kaldi/tools文件夾下,然後分三步:
cd kaldi/tools/tcl/unix
./configure
make
sudo make install
make test
2,打開srilm/Makefile文件,在第7行加入SRILM=&(PWD),用於指定工具的路徑。如果是64位的操作系統,還需要進入srilm/common目錄中,修改Makefile.machine.i686-m64文件,在第54行左右找到:
TCL_INCLUDE =
TCL_LIBRARY =
NO_TCL = 1
將其修改爲: TCL_INCLUDE =
TCL_LIBRARY =
NO_TCL = X
再找到倒數第5行:
GAWK = /usr/bin/awk
修改爲:GAWK = /usr/bin/gawk
make World
3,在終端添加環境變量,這個跟自己的安裝路徑有關(直接在終端交互窗口輸入,需要根據自己實際的文件名和路徑按以前格式修改命令):
export PATH=/home/{user}/kaldi-trunk/tools/srilm-1.7.1/bin/:/home/{user}/kaldi-trunk/tools/srilm-1.7.1/bin:$PATH
然後在該目錄下進行測試:
make test
如果終端顯示很多類似stderr output IDENTICAL的字樣,就說明測試成功了。二,數據準備:
按照官方指引一步步進行音頻數據,聲學數據,語言數據的準備。其中 wav.scp / utt2spk /test等爲映射文件,在一般的工程裏由腳本文件或者其他編程方法(如python / bash / matlab / c++等)自動生成,但考慮到我們這裏自建的ASR系統很小,可直接新建空文本文檔,再按照官方指南中指定的格式手動組織編寫。
有個特別需要注意的地方,就是編寫wav.scp / utt2spk /test等映像文件完成後記得按字母大小寫順序排序。如果是用gedit的插件排序方式,需要注意其排序後會在文件底部自動添加空行,如不刪除空行會報error: Bad line,所以每次在gedit裏排序後記得刪除底部空行。 否則會因爲映射文件爲亂序文件進而導致mono training環節出現報error。
映射文件的編寫需要格外細心,比如不要將文件名text寫成test,注意數據集和訓練集的映射路徑上的細微不同等,否則會出現各種奇奇怪怪的錯誤(如找不到用於指向提取好的特徵的feats.scp文件)。不過一般查log文件也能解決。
三,工程定稿:
參官網指南。
四,運行腳本:
編寫cmd.sh / path.sh / run.sh文件。關於腳本的編寫細節請參考官網指南,需要注意的是run.sh編寫完畢後記得賦予其可執行權限:
chmod 777 run.sh
運行run.sh,通過wer錯誤率結果衡量系統性能:
從圖中可以看出,一共解碼了11次,每次錯誤率爲7.41%。27個單詞中包含兩個識別錯誤:一個刪除錯誤,一個替換錯誤。這裏之所以錯誤率相對較低,是因爲該語料(包含訓練和測試集)只採集了我一個人的聲音文件,所以在未進行說話人自適應情況下依然能夠達到不錯的錯誤率。下面是按照標準流程採集了10個人的音頻文件進行系統的訓練和搭建的評測結果。
mono (單音素) 解碼:
三音素(tri)解碼:
這裏碰到一件比較弔詭的事,就是我的單音素訓練解碼後的錯誤率比三音素訓練解碼後的錯誤率還要低。按照我的理解,就算是孤立詞的識別,每個孤立詞應該也能拆分爲好幾個音素,那麼這幾個音素之間就會存在協同發音效應,也就是說即使在孤立詞識別裏,考慮了上下音素關聯的三音素模型理論上還是要比單音素模型要好。而這裏的結果恰好相反,如果有大佬能夠解答我這個疑問,感激不盡。