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