基于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 

如下结果:

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