- Kaldi語音識(shí)別實(shí)戰(zhàn)
- 陳果果等
- 2715字
- 2020-06-05 16:56:38
2.3 安裝
Kaldi不是一個(gè)終端用戶軟件,沒有安裝包。安裝Kaldi指的是編譯Kaldi代碼,以及準(zhǔn)備一些必要的工具和運(yùn)行環(huán)境。由于Kaldi的示例都是使用Shell腳本的,并且其I/O大量依賴管道,因此最佳的運(yùn)行環(huán)境是UNIX類系統(tǒng)。最常用的環(huán)境是Debian和Red Hat Linux,但是在Linux的其他發(fā)行版、Cygwin和macOS中也可以使用。此外,在Kaldi代碼中還提供了在Microsoft Windows下使用Visual Studio編譯Kaldi代碼的選項(xiàng),這部分內(nèi)容在本章中也會(huì)提及。
2.3.1 下載Kaldi代碼
早期的Kaldi代碼使用Sourceforge管理,從2015年5月起,遷移到GitHub上維護(hù),使用git clone下載源代碼。
2.3.2 安裝CUDA
Kaldi的GPU計(jì)算部分使用NVIDIA公司開發(fā)的CUDA框架,在NVIDIA官網(wǎng)上有不同版本的安裝包可以選擇,Kaldi通常支持最新的版本。在安裝過程中,要用root權(quán)限,每一步都使用默認(rèn)設(shè)置即可。安裝好之后查看CUDA的安裝位置:

這里安裝的是8.0版本,可以看到CUDA已經(jīng)生成了一個(gè)默認(rèn)安裝路徑,指向8.0版本。
2.3.3 安裝編譯依賴庫(kù)
在Linux和macOS環(huán)境下編譯Kaldi代碼依賴幾個(gè)系統(tǒng)開發(fā)庫(kù),進(jìn)入Kaldi文件夾可以查看依賴庫(kù)是否已經(jīng)被安裝:

這個(gè)腳本將檢查以下開發(fā)庫(kù)的安裝情況,讀者可以根據(jù)腳本輸出的提示安裝。
· 編譯工具,要求使用G++、Apple LLVM或Clang。目前,Kaldi對(duì)這幾個(gè)編譯工具的版本要求是G++ 4.8.3以上、Apple LLVM 3.3以上、Clang 5.0以上。
· zlib開發(fā)庫(kù),包括zlib-devel、zlib1g-dev和zlib-devel。
· 矩陣運(yùn)算開發(fā)庫(kù),默認(rèn)是IntelMKL,也可以用ATLAS或OpenBLAS代替。
· 編譯支持工具,包括libtool、automake、autoconf、patch、bzip2、gzip、wget、subversion。
· 腳本依賴工具,包括Python、gawk、Perl,這部分工具在編譯時(shí)不需要,但是在運(yùn)行樣例腳本時(shí)非常必要。
2.3.4 安裝第三方工具
第三方工具指的是無法在系統(tǒng)安裝包管理器中獲取的工具。Kaldi提供了安裝這些工具的腳本,包括以下幾種。
· OpenFst。Kaldi使用FST作為狀態(tài)圖的表現(xiàn)形式,其代碼依賴OpenFst中定義的FST結(jié)構(gòu)及一些基本操作,因此OpenFst對(duì)于Kaldi的編譯是不可或缺的,安裝方法如下:

· CUB。CUB是NVIDIA官方提供的CUDA核函數(shù)開發(fā)庫(kù),是目前Kaldi編譯的必選工具,安裝方法如下:

· Sclite。它是NIST SCTK打分工具的一部分,工具用于生成符合NIST評(píng)測(cè)規(guī)范的統(tǒng)計(jì)文件。如果只需要計(jì)算識(shí)別率,則這個(gè)工具不是必須的,Kaldi自身包括一個(gè)簡(jiǎn)單的計(jì)算WER的工具compute-wer。Sclite的安裝方式如下,在編譯的時(shí)候可以不安裝:

· Sph2pipe。這個(gè)工具是用來對(duì)SPH音頻格式進(jìn)行轉(zhuǎn)換的,使用LDC數(shù)據(jù)的示例都要用到這個(gè)工具。安裝方式如下,在編譯的時(shí)候可以不安裝:

· IRSTLM/SRILM/Kaldi_lm。這是三個(gè)不同的語言模型工具,不同的示例使用不同的語言模型工具。安裝方式如下,在編譯的時(shí)候可以不安裝:

其中,在安裝SRILM時(shí)有兩點(diǎn)需要注意。第一,SRILM用于商業(yè)用途不是免費(fèi)的,需要到SRILM網(wǎng)站上注冊(cè)、接受許可協(xié)議,才能下載源碼包,并需重命名為srilm.tgz,放到tools文件夾下。第二,SRILM的安裝依賴lbfgs庫(kù),這個(gè)庫(kù)的安裝方法是:

· OpenBLAS/MKL。Kaldi的最新版本已經(jīng)選用MKL作為默認(rèn)的矩陣運(yùn)算庫(kù)。如果需要手工安裝OpenBLAS或MKL,方法如下:

2.3.5 選擇其他的矩陣庫(kù)
除上述ATLAS、OpenBLAS和MKL外,Kaldi的矩陣運(yùn)算代碼還支持使用CLAPACK。LAPACK是一個(gè)用Fortran語言編寫的庫(kù),包含一些高階矩陣操作,如求逆、SVD等。CLAPACK是C版本的LAPACK實(shí)現(xiàn)。
2.3.6 編譯Kaldi代碼
首先要配置編譯環(huán)境,Kaldi使用configure命令來配置,關(guān)鍵配置如下:

如果編譯目的是在服務(wù)器上搭建訓(xùn)練環(huán)境,則推薦使用如下編譯方式:

如果只用CPU運(yùn)算,則需在配置時(shí)加入如下選項(xiàng):

如果為ARMv8交叉編譯,則使用如下編譯方式,前提是armv8-rpi3-linux-gnueabihf工具鏈?zhǔn)强捎玫模瑫r(shí)要求OpenFst和ATLAS使用armv8-rpi3-linux-gnueabihf工具鏈編譯并安裝到/opt/cross/armv8hf。

如果為ARM架構(gòu)的Android編譯,則需要加上--android-includes這個(gè)選項(xiàng),因?yàn)锳ndroid NDK提供的工具鏈可能沒有把C++的stdlib頭文件加入交叉編譯的路徑中。

運(yùn)行配置工具會(huì)在src文件夾下生成kaldi.mk文件,這個(gè)文件在編譯過程中會(huì)被各個(gè)子目錄的編譯文件引用。通常可以直接進(jìn)行編譯,也可以做如下幾項(xiàng)修改。
· Debug級(jí)別。默認(rèn)的級(jí)別是“-O1”,為了便于調(diào)試可執(zhí)行命令,可以加入“-O0-DKALDI_PARANOID”。如果為了優(yōu)化運(yùn)行速度,不做調(diào)試,則可以改用“-O2–DNDEBUG”或“-O3–DNDEBUG”。
· 浮點(diǎn)精度。如果懷疑代碼中的某些取整操作影響了結(jié)果,則可以把“-DKALDI_DOUBLEPRECISION=0”改成“-DKALDI_DOUBLEPRECISION=1”。
· 如果想忽略O(shè)penFst代碼中的有符號(hào)/無符號(hào)檢查造成的警告,則可以在CXXFLAGS中加入“-Wno-sign-compare”。
· 路徑修改。如果想改變使用的矩陣庫(kù),則可以修改這個(gè)文件。但是通常建議直接使用配置工具生成新的kaldi.mk文件。
然后,就可以開始編譯Kaldi代碼了。一次完整的Kaldi編譯可能需要幾十分鐘,可以使用多線程編譯選項(xiàng)加速,例如:

如果對(duì)Kaldi代碼做了修改,則可以使用如下選項(xiàng)來確定代碼能夠運(yùn)行:

如果使用Git升級(jí)了Kaldi代碼,再編譯的時(shí)候出錯(cuò),則通常有兩種情況。第一種情況是,Kaldi依賴的第三方工具版本發(fā)生了改變,如OpenFst,這種情況需要重新安裝OpenFst,然后重新運(yùn)行配置工具。第二種情況是,Kaldi自身的庫(kù)發(fā)生變化,比如增加或刪除了一個(gè)庫(kù),或者原有庫(kù)的接口更改了。這兩種情況都會(huì)造成原來編譯出來的庫(kù)文件失效,需要清理舊的庫(kù)文件重新編譯,以確保編譯通過:

Kaldi并沒有提供類似make install的方式把所有的編譯結(jié)果復(fù)制到同一個(gè)指定地點(diǎn)。編譯結(jié)束之后,生成的可執(zhí)行文件都存放在各自的代碼目錄下,如bin、featbin等,可以在環(huán)境變量PATH中增加這些目錄的路徑以方便調(diào)用Kaldi的工具。
2.3.7 配置并行環(huán)境
完成Kaldi代碼編譯后,就可以嘗試在單機(jī)上運(yùn)行訓(xùn)練示例了。單機(jī)版本的運(yùn)行可以利用多進(jìn)程完成并行運(yùn)算。如果希望進(jìn)一步利用多個(gè)Linux系統(tǒng)的機(jī)器并行運(yùn)算以提高速度,則可以參照本節(jié)內(nèi)容配置并行環(huán)境,建立一個(gè)Kaldi集群。
Kaldi的多機(jī)并行訓(xùn)練是基于數(shù)據(jù)并行的,如GMM訓(xùn)練的統(tǒng)計(jì)量計(jì)算、神經(jīng)網(wǎng)絡(luò)訓(xùn)練中一個(gè)小批次的參數(shù)更新等,即各個(gè)子任務(wù)的執(zhí)行是互不依賴的。但是在某些時(shí)間點(diǎn)上,需要對(duì)子任務(wù)的輸出進(jìn)行匯總,因此需要保證在不同節(jié)點(diǎn)上執(zhí)行各個(gè)子任務(wù)的進(jìn)程能夠訪問同一個(gè)目錄,并享有讀寫權(quán)限。所以,首要條件是建立網(wǎng)絡(luò)文件系統(tǒng)(NFS)。如果本身有使用網(wǎng)絡(luò)信息服務(wù)(NIS)管理的Linux機(jī)器,多個(gè)機(jī)器之間共享用戶配置,則可以直接配置NFS;否則,需要首先確保同一個(gè)用戶在不同的機(jī)器上使用相同的UID和GID。查詢方法如下:

配置NFS的方法可以根據(jù)系統(tǒng)版本的不同在網(wǎng)上找到很多教程,本書不再贅述。完成NFS的配置之后,在要加入集群的機(jī)器上設(shè)置相互之間的免密碼登錄,并確認(rèn)NFS的掛載點(diǎn)在所有機(jī)器上有相同的訪問權(quán)限。這樣,一個(gè)具有基本的任務(wù)分發(fā)功能的Kaldi集群就搭建完成了。用這個(gè)方法構(gòu)建的集群無法根據(jù)計(jì)算資源進(jìn)行任務(wù)分發(fā),適合小型集群和少量用戶的情形。
如果希望使用更多機(jī)器(如十臺(tái)以上)組成更大的Kaldi集群,或者希望同時(shí)服務(wù)多個(gè)用戶,實(shí)現(xiàn)任務(wù)排隊(duì)、根據(jù)計(jì)算資源進(jìn)行任務(wù)分發(fā)及一切高級(jí)的任務(wù)隊(duì)列管理功能,就需要在NFS的基礎(chǔ)上,使用高級(jí)的任務(wù)管理系統(tǒng)了。Kaldi支持的任務(wù)管理系統(tǒng)包括SGE(Sun Grid Engine)和SLURM(Simple Linux Utility for Resource Management)。用戶可以在集群的任意一個(gè)節(jié)點(diǎn)上向任務(wù)管理系統(tǒng)提交任務(wù),任務(wù)運(yùn)行的結(jié)果也可以在任意一個(gè)節(jié)點(diǎn)上獲取。JHU的CLSP計(jì)算中心有維護(hù)的比較好的SGE集群,所以Kaldi默認(rèn)使用SGE,可以查閱Kaldi文檔來了解如何配置以優(yōu)化并行訓(xùn)練的性能。對(duì)于自己搭建集群的讀者來說,推薦使用SLURM,相比SGE,這個(gè)工具維護(hù)的比較積極,有完整的文檔和配置教程可以參考。
- TD-SCDMA移動(dòng)通信技術(shù)
- 現(xiàn)代數(shù)據(jù)通信技術(shù)與應(yīng)用
- 電子線路CAD設(shè)計(jì)與仿真
- Android底層開發(fā)技術(shù)實(shí)戰(zhàn)詳解
- EAGLE電路原理圖與PCB設(shè)計(jì)方法及應(yīng)用
- 智慧城市:城市品質(zhì)新思維
- 微信小程序開發(fā)與運(yùn)營(yíng)
- 移動(dòng)通信技術(shù)與網(wǎng)絡(luò)優(yōu)化(第2版)
- 無線網(wǎng)絡(luò)優(yōu)化
- 區(qū)域智能電網(wǎng)的規(guī)劃方法
- 云存儲(chǔ)解析
- 5G標(biāo)準(zhǔn)之網(wǎng)絡(luò)架構(gòu):構(gòu)建萬物互聯(lián)的智能世界(5G新技術(shù)叢書)
- 光傳輸網(wǎng)絡(luò)技術(shù):SDH與DWDM(第2版)
- 3D顯示技術(shù)、標(biāo)準(zhǔn)與應(yīng)用
- 信號(hào)處理教程