語音識別--kaldi環境搭建(基於Ubuntu系統)

王延凱的部落格發表於2020-01-29


最近開始接觸語音識別,又在師兄那裡瞭解到kaldi這個模型,於是就想著去試驗一下,找找感覺。好了,廢話不多說。幹就完了!!!期間遇到了不少問題,於是就將內容記錄了下來。

1.準備一個ubuntu環境

方式很多,這裡我列出了四種,其中本人推薦使用方式3

方式1:我使用的是vm 創 建 的 虛 擬 機 \color{#FF3030}{建立的虛擬機器} ,當然大家也可以使用VitureBox建立,本質都一樣,沒啥差別。經過測試,在虛擬機器中建立就很容易出現虛擬網路停止服務的問題,不光如此,在編譯成功之後也是會出現很多問題呀。
方式2:如果你是win10系統的話,也可以使用 w i n 10 自 帶 的 u b u n t u 子 系 統 \color{#FF3030}{win10自帶的ubuntu子系統} win10ubuntu功能,需要在應用商店下載ubuntu即可。但是考慮到後續的可持續性,還是建議使用方法3.
方式3:裝一個 u b u n t u 的 雙 系 統 \color{#FF3030}{ubuntu的雙系統} ubuntu來進行實驗,步驟還是一樣的,但是這裡環境搭建的過程我還是採用的之前的截圖。對於後邊的例子驗證部分,我將會採用雙系統的內容操作。這裡我沒有展示雙系統的搭建過程,網上有很多教程,大家可以自行搜尋。
方式4 將 電 腦 的 w i n 系 列 系 統 改 為 u b u n t u 系 統 \color{#FF3030}{將電腦的win系列系統改為ubuntu系統} winubuntu,而不是雙系統共存。

2.下載前的準備

2.1 安裝必要的依賴庫

 sudo apt-get install git wget make

其執行結果如下:
在這裡插入圖片描述

2.2 官網下載kaldi

首先放出官網的下載文件:參考網址
在這裡插入圖片描述
也可直接使用如下下載命令:

git clone https://github.com/kaldi-asr/kaldi.git kaldi-trunk --origin golden

以下就是下載結果:
在這裡插入圖片描述
結果顯示失敗,老是不成功或者網路連結失敗,所以我就在別的地方下載了下來,然後將檔案上傳到虛擬機器。就不非得在一棵樹上吊死了。如果大家也遇到了下載困難的問題,可以下載我儲存在百度雲盤的內容:

好了下載完成後將資料夾改名字

mv kaldi-trunk kaldi
ls

在這裡插入圖片描述

3.原始檔編譯及依賴安裝

3.1 編譯MKL

在編譯之前首先介紹一下MKL是幹啥的吧:
MKL全稱是Intel Math Kernel Library也稱作英特爾數學核心函式庫,用於提供經過高度優化和大量執行緒化處理的數學例程,面向效能要求極高的科學、工程及金融等領域的應用。MKL是一款商用函式庫,提供C、Fortran、Fortran 95的支援,但是僅支援Intel自家旗下的CPU。

cd kaldi/tools/extras/
ls
./check_dependencies.sh 

執行之後就會檢視到這裡邊進行編譯需要安裝的依賴,此處是我的返回結果,不同的機器其結果或許不同,單操作方法一致。

在這裡插入圖片描述
這裡它已經給出了下載的語句,就是上邊紅框標識的部分,我們就需要執行以下命令進行一下安裝。

sudo apt-get install zlib1g-dev automake autoconf sox gfortran libtool subversion
#再次檢視一下依賴是否都安裝好了
./check_dependencies.sh

其結果如下,還需要我們自己編譯一個Intel MKL的檔案
在這裡插入圖片描述
上圖中紅框部分給出了編譯安裝的語句,執行以下語句以安裝

sudo apt-get update
#在執行下一步之前先檢測一下upadte是否可以進行,如果出現類似於錯誤4.1,也好直接解決了!
sudo ./install_mkl.sh
#注意這裡一定加sudo獲取最高許可權啊,我就是因為沒加sudo,重複了此步驟兩次,血的教訓啊,如果不加,後邊編譯的時候會提示某些檔案許可權不夠,而終止編譯

這是其編譯過程:
在這裡插入圖片描述
如果此處出現格式錯誤,可見4.2解決方案。
這裡檔案編譯比較大,需要152M,所以下載過程和編譯過程或許就挺長時間的。
在這裡插入圖片描述
執行中間需要設定一下,輸入N,此過程是在虛擬機器的編譯過程中出現的,後來我又重新嘗試的ubuntu16.04的雙系統中我並沒有看到這個選項。
在這裡插入圖片描述
在這裡插入圖片描述,此過程一樣是在虛擬機器的編譯過程中出現的
中間還需要下載572M大小的檔案去升級,如下所示:
在這裡插入圖片描述
執行成功之後會出現如下圖所示,顯示安裝mkl成功
在這裡插入圖片描述

再次檢查還需要啥以來,雙系統也沒有出現這個問題,這個問題僅在ubuntu的虛擬機器中出現
在這裡插入圖片描述
不知道為啥這個之前安裝了的,又給解除安裝了,好吧這裡再重新來一下吧
在這裡插入圖片描述
最後再來檢查一下,出現這個結果說明都已經編譯好了。
在這裡插入圖片描述

3.2編譯Tools

首先說明一下,該tools資料夾下都是kaldi所要依賴的包,其中也就主要包括以下幾個內容:

  1. OpenFST (Weighted Finite State Transducer library):是用來構造有限狀態自動機的庫。我們知道隱馬爾可夫模型就可以看作一個有限狀態自動機的,這也是編譯過程需要的一個比較重要的一個包。
  2. ATLAS:這是一個在C++下的線性代數運算庫。在機器學習中是經常需要進行矩陣運算的。
  3. IRSTLM:這是一個統計語言模型的工具包
  4. sph2pipe:這是賓夕法尼亞大學 Linguistic Data Consortium(LDC)開發的一款處理sphere_formatted數字音訊檔案的軟體,它可以將LDC的sph格式的檔案轉換成其他格式。

以下就是其編譯的過程計結果:

cd ..
sudo make -j 2
#解釋一下,這裡的2,表示的是處理器的數目,因為我此次編譯使用的是一個比較老的機器,只有兩個處理器
#具體的數目大家可以根據自己電腦而定

其結果如下所示:
在這裡插入圖片描述
在這裡插入圖片描述
編譯結果如下所示:
在這裡插入圖片描述
注:此過程也需要十幾分鍾,具體多長時間根據電腦處理器的編譯速度。
因為在編譯過程中會向tools資料夾下下載以下四個檔案,於是,但是下載過程或許不會順暢,於是我就把我下載完的檔案整理到了百度 網盤。這樣對於後邊的也比較方便。
連結:https://pan.baidu.com/s/1tYZiTWfnxUnJ1eT0cLQC4w
提取碼:w3vy
裡邊檔案是這四個,如下所示:
在這裡插入圖片描述

3.3 編譯src

這裡邊啊儲存的是Kaldi的一些原始碼,還有一些語音識別演算法的演算法編譯,也是整個kaldi的核心部分。

cd ..
cd src
cat INSTALL
#用於檢視需要執行的步驟,一下就是執行這句後的結果
./configure --shared
make depend -j 8
make -j 8
#這裡8的意思與上邊的意思一致,當你的數目大於本機器的處理器數目時,
#它會使用預設的一個處理器進行編譯及運算。

執行cat INSTALL命令檢視安裝的步驟及流程
在這裡插入圖片描述
我們可以看到,這裡其實是已經給了接下來的操作步驟的
那我們就按照這個流程來走。
在這裡插入圖片描述

make depend -j 8
#可以根據自己的電腦適當修改處理器數目

在這裡插入圖片描述
正確結果:
在這裡插入圖片描述

make -j 2
#可以適當修改處理器數目

漫長的等待,我編譯了兩個多小時,將近三個小時。注,這個需要消耗的時間也與處理器的個數和處理器的能力相關,因為我的電腦有點渣,所以消耗時間比較長,其中出現錯誤詳見4.6和4.7
注,在使用雙系統編譯的過程中並沒有出現4.6,4.7的錯誤
在這裡插入圖片描述

4.出現問題

注:如果你使用的是雙系統進行編譯安裝的kaldi環境,或許此章節的問題你不會出現,因此可以選擇性忽略,以下問題可能會在虛擬機器的編譯過程中出現。哈哈~~咯

4.1 Err:AppStream cache update completed, but some metadata was ignored due to errors.

在執行sudo apt-get update的時候出現錯誤,如下所示:
在這裡插入圖片描述
解決辦法:

sudo rm /var/lib/dpkg/lock

4.2 sh指令碼檔案格式錯誤及解決方案

形式1:
在這裡插入圖片描述
形式2:
在這裡插入圖片描述
形式3:
在這裡插入圖片描述
解決方案:參考地址

4.3 Err:Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)

錯誤形式:
在這裡插入圖片描述
解決方案:
在這裡插入圖片描述
參考網址:參考網址地址連結

4.4 解決虛擬機器訪問谷歌的問題

錯誤描述:

+ apt-key --keyring /usr/share/keyrings/intel-sw-products.gpg add -

在這裡插入圖片描述
在這裡插入圖片描述
在檔案的下載過程中需要一些檔案支援,這就需要技術支援。
解決方案:點進去試試
在這裡插入圖片描述

4.5 DNS解析錯誤

在這裡插入圖片描述
參考方案,不知道奏不奏效

4.6

再執行make depend -j 8的時候可能會出現問題如下所示
在這裡插入圖片描述
其實這個的解決方案和4.2一致,解決此問題,我們只需要再重新編輯一下以下檔案即可
在這裡插入圖片描述

4.7 編譯出錯尋找錯誤

在這裡插入圖片描述
說明這裡在執行make命令的時候出錯了,我們可以去找出裡邊的錯誤,看看對應資料夾下的Makefile檔案,並且檢視裡邊的make命令,是否存在執行.sh檔案的內容,如果存在,就再去按照錯誤4.2去修改。

4.8 version.h報錯

編譯時報錯說版本資訊出錯,網上也找不到任何同樣的錯誤,其內容如下:
在這裡插入圖片描述
我的解決辦法就是將這兩個地方對應行的程式碼註釋掉,我實在找不到其它好的方法。

5.測試例子

說明:後來進行了驗證,發現還是有錯誤,於是就又把上邊的步驟在我的雙系統ununtu上進行了測試。

5.1 測試例子yesno

該例子內的訓練樣本都是.wav格式的音訊檔案,是一個老男人連續不斷的說yes或者no,每個wav檔案說八次,其中檔名字是由0和1組成的8位數字序列,

0代表的是no
1代表說的yes

這個簡單的例子沒有單獨的標註檔案,而是直接採用的這個方法來對檔案進行命名的。
接下來就是這個例子的測試環節了:

cd ..
ls
cd egs/yesno/s5
ls
./run.sh

這是執行run.sh檔案後的執行結果,它首先會連線kaldi官網下載yesno例子的wav檔案,然後再對其進行訓練和識別:
在這裡插入圖片描述
其運算中間過程如下所示;
在這裡插入圖片描述
最後很快就會出現其對於yesno的識別結果:
在這裡插入圖片描述
我們在最後的結果中可以看到顯示WER 0.00,表示其識別結果還是 非常準確的。那麼或許我們又會疑問,WER代表的是什麼意思呢?
WER(Word Error Rate)代表的是字錯誤率,是衡量語音識別系統的準確程度的標準。其計算公式為
W E R = ( I + D + S ) N WER=\frac{(I+D+S)}{N} WER=N(I+D+S)
其中各字母含義如下所示:

I 代表被插入的單詞個數
D 代表被刪除的單詞個數
S 代表被替換的單詞個數
N 代表總共的單詞個數

簡單的理解就是把識別過程中出現的多認的、少認的、認錯的單詞數加起來,除以總共測試的單詞總數。按照我們的識別要求來說的話,這個數越小越好。

6.總結

對於這個kaldi環境的搭建確實走了不少彎路,從一開始的使用vm虛擬機器搭建,再到win10子系統,然後再到雙系統的安裝,其中在雙系統的安裝過程也遇到不少挫折,一度以為要失去windows上的全部學習資料,變得恐慌不已,好在後來找到了方法恢復了win10系統,後來也是不停的找原因。
多方查閱資料才得知,原來是和自己的膝上型電腦的品牌有關,因為我的膝上型電腦品牌為戰神,顯示卡為GTX960M,在自己的膝上型電腦中安裝雙系統很多次都未能成功,到最後反倒學會了給別人裝雙系統。說起來也算是“因禍得福”。哈哈~~
寒假回到家後,正值肺炎疫情無法走親訪友,坐在屋裡也只能在默默的為武漢人民祈福,為全國人民祈福,索性不如將家中的老電腦拿來重新搞個雙系統,沒想到竟然一次成功。趁著這股熱乎勁,就將這篇部落格完善了一下,並發表了出來。希望對於自己後面的探索有些幫助。加油~,奧裡給!!!

7.參考部落格

感謝一下部落格對於此篇部落格的幫助,沒有這些部落格給予的幫助,我相信我到現在也很難搭建成功kaldi環境。

1.Kaldi的下載安裝與編譯
2.例項yesno和timit的應用
3.Kaldi 安裝與簡介

相關文章