[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
如下結果: