基於HTK的連續語音識別系統搭建學習筆記(二)

[step 5]數據的特徵提取

這裏所用特徵爲MFCC。工具HCopy可以實現提取特徵的工作。

創建文件夾:config

創建文件:config1(要設置的參數)

創建位置:config

創建內容:


創建文件:codetr.scp(制定訓練輸入和輸出列表)

創建位置:根目錄下

執行:

HCopy -T 1 -C .\config\config1 -S codetr.scp

執行結果,HCopy 對codetr.scp文件左側的語音數據按 config 的配置提取特徵並存入codetr.scp文件右側特徵文件中。

對於測試數據如法炮製:

HCopy -T 1 -C .\config\config1 -S codete.scp

創建文件:codete.scp

創建位置:根目錄

注 :由於附帶的壓縮包已經包括了特徵文件(在.\data\*\feature 下),本步驟不用執行。

2.創建單音素HMM模型

涉及創建一系列單高斯單音素HMM的過程。

[step 6]一致初始化創建單音素模型

定義一個原始模型proto

創建文件夾:hmms/hmm0

創建文件:proto

創建位置:根目錄

創建內容:


創建文件:train.scp(特徵文件列表)

執行:

HCompV -C .\config\config1 -f 0.01 -m -S train.scp -M .\hmms\hmm0 proto

注:要把config1中的wav註釋掉

注:也可以省掉-C參數,只要train.scp裏是特徵文件列表,並且特徵是MFCC_0_D_A

生成文件:proto vFloors(截至宏)

生成位置:hmms/hmm0

手動製作:主宏文件(Master Macro File)hmmdefs(是由自己的proto生成)和與vFloors相關的macros(是由自己的vFloors生成),具體制作過程見HTK book。

注:HCompV工具的詳細使用參考HTK BOOK P257

由於暫時不用sp模型,刪去monophones1中的sp,構成monophone0文件,保存在lists文件夾下。

重新估計參數:

創建文件夾:hmms/hmm1

執行:

HERest -C .\config\config1 -I .\labels\phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm0\macros -H .\hmms\hmm0\hmmdefs -M .\hmms\hmm1 .\lists\monophones0

同上,重複估計兩次:

創建文件夾:hmms/hmm2 hmms/hmm3

HERest -C .\config\config1 -I .\labels\phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm1\macros -H .\hmms\\hmm1\hmmdefs -M .\hmms\hmm2 .\lists\monophones0

HERest -C .\config\config1 -I .\labels\phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm2\macros -H .\hmms\hmm2\hmmdefs -M .\hmms\hmm3 .\lists\monophones0

注:HERest工具的詳細解釋可以參考HTK BOOK P268

[step 7]修補啞音素模型

對sil模型加入回溯鏈,對sp綁定到sil的中間狀態上。具體的,啞音素模型按下面兩步執行。首先,修改hmm3\hmmdef,複製sil的中間狀態爲sp模型的唯一狀態,另存到hmms\hmm4目錄下。

sp模型內容:


創建文件夾:hmms/hmm5

利用 HHEd 加入回溯轉移概率:

創建文件:sil.hed(指明sp綁定到sil中間狀態

創建位置:根目錄

文件內容:


執行:

HHEd -H .\hmms\hmm4\macros -H .\hmms\hmm4\hmmdefs -M .\hmms\hmm5 sil.hed .\lists\monophones1 

注:HHEd工具的詳細解釋可以參看HTK BOOK P272

修改mkphones0.led,去掉最後一行,存爲 mkphones1.led,利用 HLEd 工具得到包含sp的音素級真值文本: 

執行:

HLEd -l * -d .\dict\dict1 -i .\labels\phones1.mlf mkphones1.led .\labels\trainwords.mlf 

重估兩次:

執行:

HERest -C .\config\config1 -I .\labels\phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm5\macros -H .\hmms\hmm5\hmmdefs -M .\hmms\hmm6 .\lists\monophones1 
 
HERest -C .\config\config1 -I .\labels\phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm6\macros -H .\hmms\hmm6\hmmdefs -M .\hmms\hmm7 .\lists\monophones1 

我們先看看這時的識別率如何,執行如下命令:

創建文件夾:results

執行:

HVite -H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -S test.scp -l * -i .\results\recout_step7.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict1 .\lists\monophones1

HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7.mlf

識別結果:


通過分析識別輸出文件recout_step7.mlf ,發現在每一句上都加上了SENT-START 和SENT-END 。這是與標註真
值文本無法完全吻合的原因,一個解決辦法是在運行HResults 時加入-e 選項來忽略掉
SENT-START 和SENT-END ,

如下執行: 
HResults -e ??? SENT-START -e ??? SENT-END -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7.mlf 


上面的方案可以解決問題,但不是很完美。應該在獲得的識別結果中(recount_step7.mlf)
不產生SENT-START 和SENT-END 纔好。分析dict1 字典發現,對應SENT-START 和
SENT-END 的相關信息如下: 
SENT-END        sil 
SENT-START      sil 
應該加入[] 以表示他們並不輸出任何東西。把 dict1 字典另存爲 dict2 並替換上面兩行成
如下形式: 
SENT-END        [] sil 
SENT-START      [] sil 
重新運行問題解決。相應的,HResults 的參數可以省掉-e 了: 

執行:
HVite -H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -S test.scp -l * -i .\results\recout_step7_2.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict2 .\lists\monophones1 
 
HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7_2.mlf 

如下結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章