kaldi新手入門及語音識別的流程(標貝科技)
歡迎體驗標貝語音開放平台
地址:https://ai.data-baker.com/#/?source=qaz123
(注:填寫邀請碼hi25d7,每日免費調用量還可以翻倍)
一、kaldi
-
kaldi簡介
Kaldi是當前最流行的開源的語音識別工具包,旨在提供靈活且可擴展的組件,包括多種語音信號處理,語音識別,聲紋識別和深度神經網絡。Kaldi的代碼主要用C++編寫,在此之上使用bash 和python腳本做了一些工具。 -
kaldi安裝和編譯
kaldi由它的開發團隊在github進行維護,以下介紹安裝目前最新的kaldi的步驟。
(1)配置gcc版本
當前版本的kaldi需要本地服務器編譯器gcc版本為5.4.0及以上。可以通過 gcc -v 命令查看編譯器版本。
(2)獲取當前版本kaldi
可以通過拷貝,或者直接從github下載兩種方式獲取,這里介紹后者。
使用 git clone https://github.com/kaldi-asr/kaldi.git 命令下載kaldi到本地服務器。
然后介紹kaldi的編譯方式。進入kaldi文件夾,按照INSTALL中的說明進行編譯。在INSTALL中,如下圖,有兩種編譯kaldi的方式,這里介紹第一種。
按照文件提示,先到tools/目錄下面按照INSTALL中的說明編譯,完成之后到src/目錄下按照INSTALL中的說明編譯即可。
首先,進入tools/目錄編譯,按照INSTALL的提示,按順序執行命令,在執行extras/check_dependencies.sh 命令時,可能會出現以下提示,這里可以不用理會,直接進行下一步。
執行 make 命令編譯時,可能會出現如下錯誤,按照提示,在Makefile里頭的 WGET 命令中添加該提示語句即可。
再次編譯,耐心等待,直到編譯完成。
以上,tools/目錄下編譯完成,接下來進入src/目錄進行編譯。同樣,按照INSTALL中的提示順序執行命令,耐心等待直到編譯完成。
至此kaldi完成編譯。
二、kaldi語音識別
1.語音識別簡介
與機器進行語音交流,讓機器明白你說什么,這是人們長期以來夢寐以求的事情。語音識別技術就是讓機器通過識別和理解過程把語音信號轉變為相應的文本或命令的高級技術。
語音識別技術經歷了長期的發展,從傳統的基於隱馬爾科夫模型和高斯混合模型的方法(GMM-HMM),到深度學習發展之后神經網絡替代了GMM的DNN-HMM方法,再到現在的一些端到端的方法。目前,語音識別技術已經在諸多領域取得了一定的成果。
我們以傳統的語音識別方法來介紹語音識別的流程:所謂語音識別,就是將一段語音信號轉換成相對應的文本信息,系統主要包含特征提取、聲學模型,語言模型以及字典與解碼四大部分,為了更有效地提取特征往往還需要對所采集到的聲音信號進行濾波、分幀等音頻數據預處理工作,將需要分析的音頻信號從原始信號中合適地提取出來;特征提取工作將聲音信號從時域轉換到頻域,為聲學模型提供合適的特征向量;聲學模型中再根據聲學特性計算每一個特征向量在每一個狀態上的得分;而語言模型則根據語言學相關的理論,計算該聲音信號對應可能詞組序列的概率;最后根據已有的字典,對詞組序列進行解碼,得到最后可能的文本表示。
我們舉一個簡單的例子(只是形象表述,不是真實數據和過程):
- 語音信號:pcm、wav文件等(我是機器人)
- 特征提取:提取特征向量[1 2 3 4 56 0 ...]
- 聲學模型:[1 2 3 4 56 0]-> w o s i j i q i r n
- 字典:窩:w o;我:w o;是:s i;機:j i;器:q i;人:r n;級:j i;忍:r n;
- 語言模型:我:0.0786, 是:0.0546,我是:0.0898,機器:0.0967,機器人:0.6785;
- 輸出文字:我是機器人;
2.kaldi語音識別
kaldi當中的中文語音識別的例子是egs/aishell,可以直接運行目錄下s5/當中的run.sh來訓練一個中文語音識別的聲學模型,腳本會先下載數據,對數據進行整理,然后開始訓練。以下我們將基於s5/這個例子,介紹如何用自己的數據訓練一個語音識別聲學模型。
進入到egs/aishell/s5目錄下,首先需要改cmd.sh的配置,默認是queue.pl基於集群計算的,我們是用本地單個服務器來跑,所以改為run.sh:
以下介紹准備訓練需要的特定格式數據的流程。
(1)准備發音字典(lexicon.txt),做lang和lang_test
發音字典是語言的字或者詞和音素之間的對應關系,例如:
發音字典可以是別人提供的,或者是自己按照語言的發音規則設計的,發音字典很重要,當我們從頭開始訓練一門新的語言的聲學模型,以下run.sh當中的腳本能夠根據發音字典生成語言模型相關的文件夾lang和解碼過程相關的文件夾lang_test,這對於后面的迭代訓練是必要的。如果不是做一門新的語言,可以從別人那里直接拷貝lang和lang_test,這樣以下這些步驟都是可以省略。
(2)數據准備
我們需要將訓練數據規范成kaldi規定的格式,划分train/test/dev集,每個集下面都需要四個文件,目錄層級如下:
wav.scp:音頻ID+音頻絕對路徑
utt2spk:音頻ID+說話人ID
spk2utt:說話人ID+此人所有音頻ID(生成utt2spk后,在utt2spk目錄下,執行 ../../utils/utt2spk_to_spk2utt.pl utt2spk > spk2utt 生成)
text:音頻ID+分好詞的文本(采用 jieba分詞)。jieba有默認的詞典,一般簡體中文默認詞典就可以了,但是可能會有粵語、繁體等情況出現,這個時候需要自己做詞典了。我們已經有了lang文件夾,lang當中有一個詞表words.txt,我們可以用它來做一個jiaba詞典,執行命令: awk -F '\t' '{print $1 "3 n"}' words.txt > usrDict 就可以得到jieba分詞需要的詞典了,然后用分詞腳本,加載這個詞典,對text進行分詞。
以上數據准備完畢,接下來介紹訓練的流程。
(1)提取聲學特征(mfcc+pitch),計算倒譜均值方差歸一化系數(cmvn)。
(2)訓練單音子聲學模型mono。單音子GMM-HMM模型訓練完成后,使用測試集進行解碼來測試識別率,雖然可能識別率較低,但這已經是一個可以用來進行語音識別的可用模型了。然后用單音子模型對訓練數據做對齊。
(3)訓練三音子聲學模型tri1,三音子模型的訓練和單音子訓練一樣,訓練之后用生成的模型對訓練數據重新進行對齊,作為后續系統的基礎。
(3)tri2也是三音子聲學模型訓練,多次訓練三音子模型的原因:比如目標是訓練一個10000狀態的三音子系統,最簡單的辦法是,用單音子系統產生的對齊直接訓練一個10000狀態的三音子系統;但通常更為穩妥的做法是先以單音子為基礎,訓練一個5000狀態的三音子模型,再用5000狀態的模型重新對訓練數據進行對齊,其對其質量必然比單音子系統的對齊質量高,然后用這個新對齊再去訓練一個10000狀態的三音子系統,從而達到更好的模型精度。
(4)從tri3a開始,使用了有監督特征變換技術(線性判別分析LAD和最大似然線性變換MLLT)訓練三音子聲學模型;tri4a訓練跟說話人相關的聲學模型,tri5a構建了一個更大的說話人自適應系統進行訓練,並根據最終的模型對訓練數據再次對齊。
以上完成了基於GMM-HMM聲學模型的訓練,得到了單音子的聲學模型和多個三音子的聲學模型,並且根據聲學模型得到了訓練數據的對齊。接下來,將基於以上的對齊結果,訓練基於DNN-HMM的聲學模型,這步訓練需要使用GPU,需要先指定GPU。
訓練完成之后,同樣使用測試集進行解碼來測試識別率。使用下面的命令來查看所有模型的識別率。
所有模型和對齊的結果存儲在exp/目錄下:
至此,完成了基於kaldi的聲學模型訓練的所有步驟,並且得到了進行語音識別的聲學模型,可以結合語言模型、字典和解碼進行語音識別。
歡迎體驗標貝語音開放平台
地址:https://ai.data-baker.com/#/?source=qaz123
(注:填寫邀請碼hi25d7,每日免費調用量還可以翻倍)