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