HTK的全稱是”Hidden Markov Model Toolkit”,是英國劍橋大學工程學院開發(fā)的隱馬爾可夫模型(后面簡稱為隱馬模型)工具包,可以方便有效的建立及操作隱馬模型。隱馬模型在許多人工智能領(lǐng)域都有著成功的應(yīng)用,比如語音識別,當前國際上主流的語音識別系統(tǒng)仍是基于隱馬模型建立的。HTK的開發(fā)也主要是針對語音識別的應(yīng)用及研究。
HTK是一個開源工具包,可以在http://htk.eng.cam.ac.uk/進行免費下載,工具包中包含許許多多的模塊及工具,都是用純C代碼寫成的,基本都以H開頭。其中也有非常詳細的文檔可供參考。
建立語音訓練數(shù)據(jù)
首先我們需要錄音以采集足夠的語音數(shù)據(jù),對于“打開、關(guān)閉、開始、停止”這四個命令都需要錄一些相應(yīng)的語音樣本,同時也需要對錄下的語音做一些簡單的標注。錄音和標注可以采用HTK工具包中的HSLab來完成。
比如在命令行下運行“HSLab打開.sig”,然后點擊“Rec”健開始錄音,點擊“Stop”鍵錄音結(jié)束。這時就會在當前目錄下生成一個名為“打開_0.sig”文件,再進行一次錄音則生成“打開_1.sig”,以此類推。默認的錄音采樣率為16kHz,我們采用默認的設(shè)置就可以了。
錄音后需要對語音進行簡單的標注,標注也是用HSLab工具,運行后按“Mark”鍵,選擇需要標注的區(qū)域,按“Labelas”,輸入標注的符號,然后回車確定即可。在本問的例子中,每個語音樣本都是孤立的命令詞,我們只需要標注出3個部分:起始靜音部分(標記為sil),命令詞語音部分(標記為命令詞,如“打開”),結(jié)束靜音部分(標記為sil)。標注完成,點擊“Save”鍵保存,會生成一個后綴為“l(fā)ab”的文件。
特征提取
語音識別系統(tǒng)并不直接在語音信號上進行識別,而是先要進行特征提取,包括分幀,加窗,求取頻譜及倒譜,這樣確保提取出的特征更加緊湊并盡可能多的保留語音內(nèi)容的信息。
HTK中負責提取特征的是HCopy工具,它將wav格式的語音文件轉(zhuǎn)化為包含若干特征
矢量的特征文件。具體命令如下:
HCopy –A –D –C hcopy.conf -S hcopy.scp
其中hcopy.conf是一個配置文件,用于對特征提取過程中的參數(shù)進行配置,如下所示:
hcopy.scp為待處理語音源文件與特征目標文件對的列表,格式如下:
隱馬模型結(jié)構(gòu)定義
在本文的例子中,有五個需要建模的聲音單元:“打開”,“關(guān)閉”,“開始”,“停止”,“sil”。對于每一個聲音單元都將采用一個對應(yīng)的隱馬模型來建模。需要確定的隱馬模型結(jié)構(gòu)參數(shù)包括:
1.狀態(tài)個數(shù)
2.每個狀態(tài)的輸出函數(shù)形式
3.狀態(tài)間的跳轉(zhuǎn)關(guān)系
在本例中我們采用最常用的結(jié)構(gòu)配置,如下所示:
模型包括4個有輸出的狀態(tài){S2,S3,S4,S5},第一個和最后一個狀態(tài){S1,S6}不產(chǎn)生輸出,只是為了操作方便。每個狀態(tài)的輸出函數(shù)b采 用對角方差陣的混合高斯分布函數(shù)來描述。
隱馬模型訓練
1. 模型初始化
在訓練開始必須對模型參數(shù)進行初始化,初始化是會影響訓練的收斂速度與準確性。HTK提供了兩種初始化工具:HInit和HCompv.
(1) 采用HInit初始化
HInit -A -D -T 1 -S trainlist.txt -M model/hmm0 \
-H model/proto/hmmfile -l label -L label_dir nameofhmm
其中,nameofhmm是隱馬模型的名稱,如“開始”、“關(guān)閉”;hmmfile是一個描述隱馬模型原型的文件,如拓撲結(jié)構(gòu),轉(zhuǎn)移關(guān)系,特征維數(shù)等;model/hmm0為初始化生成的初始模型文件。
(2) 采用HCompv初始化
HCompv -A -D -T 1 -S trainlist.txt -M model/hmm0flat \
-H model/proto/hmmfile -f 0.01 nameofhmm
2. 參數(shù)重估
模型參數(shù)的估計采用HRest工具,調(diào)用該工具完成一輪參數(shù)的重新估計,具體命令行如下:
HRest -A -D -T 1 -S trainlist.txt -M model/hmmi -H vFloors \
-H model/hmmi-1/hmmfile -l label -L label.dir nameofhmm
其中,trainlist.txt文件包含所有用于訓練的mfcc特征文件列表,label_dir是存放標注文件(.lab)的目錄,vFloors是由HCompv生成的最小方差值的文件。
整個訓練過程需要迭代多次,通常5-10輪次,每次迭代時,HRest程序可輸出數(shù)據(jù)的似然值。
識別任務(wù)語法及詞典定義
對于任意一個識別任務(wù)我們要定義該識別任務(wù)的語法,并生成待識別的網(wǎng)絡(luò),識別網(wǎng)絡(luò)即包括所有可能識別的詞或句子。在HTK中,支持用戶寫一個類似EBNF語法范式的文本文件,HParse工具可以自動對該文本文件進行解析,生成相應(yīng)的識別網(wǎng)絡(luò)文件。
對于本文中的例子,描述其語法的文本文件“gram.txt”如下:
其中,花括號表示允許0至多次出現(xiàn),方括號表示0或1次出現(xiàn)。
然后可通過HParse生成識別網(wǎng)絡(luò)文件“net.slf”
HParse -A -D -T 1 gram.txt net.slf
生成的識別網(wǎng)絡(luò)如下圖所示:
除了建立識別語法文件,還需要建立詞典,詞典是為了將最終識別的結(jié)果與隱馬模型描述的單元名稱建立對應(yīng)關(guān)系,由于在本例中我們是直接以詞為單元來建立模型,所以這里的詞典就非常簡單,詞典“dict.txt”如下所示:
識別及測試
模型訓練完成后就可以進行識別和測試了:
1. 首先錄入待識別的語音,如“input.sig”,利用HCopy將其轉(zhuǎn)換為MFCC特征矢量文件input.mfcc(與訓練時提取特征過程相同)。
2. 識別是通過Viterbi算法在特征矢量上進行計算,與各個單詞的隱馬模型進行匹配。這一步是通過工具HVite進行的,具體命令行如下:
HVite -A -D -T 1 -H hmmdef.mmf -i reco.mlf -w net.slf \
dict.txt hmmlist.txt input.mfcc
其中“reco.mlf”為輸出識別結(jié)果的文件,其識別結(jié)果形式如下所示:
識別及測試
模型訓練完成后就可以進行識別和測試了:
1. 首先錄入待識別的語音,如“input.sig”,利用HCopy將其轉(zhuǎn)換為MFCC特征矢量文件input.mfcc(與訓練時提取特征過程相同)。
2. 識別是通過Viterbi算法在特征矢量上進行計算,與各個單詞的隱馬模型進行匹配。這一步是通過工具HVite進行的,具體命令行如下:
HVite -A -D -T 1 -H hmmdef.mmf -i reco.mlf -w net.slf \
dict.txt hmmlist.txt input.mfcc
其中“reco.mlf”為輸出識別結(jié)果的文件,其識別結(jié)果形式如下所示:
3. 當然HTK也支持采用一種更自然的方式進行識別測試,即直接錄音進行識別,具體命令行如下:
HVite -A -D -T 1 -C directin.conf -g -H hmmsdef.mmf \
-w net.slf dict.txt hmmlist.txt
運行該命令后,命令行會出現(xiàn)“READY[1]>”,此時便可進行聲音錄入,按任意鍵結(jié)束錄音,程序會進行識別并將結(jié)果顯示在屏幕上, 然后出現(xiàn)“READY[2]>”進行下一次錄音及識別。
由于在這種識別方式里由程序自動進行特征提取,配置文件direction.conf中需包含錄音音頻格式及特征提取過程所需的各類參數(shù),一個具體示例如下: