接下来采用三音素模型进行改进。
一、绑定三音素
首先,制作一个脚本文件mktri.led,放在data/scripts文件夹中,内容为:
WB sp
WB sil
TC
最后有一行换行
执行命令:
HLEd -n labels/triphones1 -i labels/wintry.mlf scripts/mktri.led labels/aligned.mlf
得到triphones1和wintry.mlf两个文件。
这里要对wintry.mlf用python代码处理,将路径修改为“*/XXXX”。代码如下:
a1=open("D:\HTK\data/labels/wintry.txt",'r+')
b=[]
str='S'
txt1=a1.readlines()
a1.close()
for lines in txt1:
a=lines
c=a
if a.find(str)>=0:
b=a.split('S',1)
c='"*/S'+b[1]
#print(c)
a2=open("D:\HTK\data/labels/wintry_new.txt",'a')
a2.write(c)
a2.close()
把wintry_new.txt修改为wintry.mlf即可。
执行命令:
perl scripts/maketrihed monophones0 labels/triphones1
在data文件夹中找到mktri.hed文件,并放入scripts文件夹中。
执行命令:
HHEd -H hmms/hmm9/macros -H hmms/hmm9/hmmdefs -M hmms/hmm10 scripts/mktri.hed monophones0
重估两次:
HERest -A -D -T 1 -C configs/config -I labels/wintry.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm10/macros -H hmms/hmm10/hmmdefs -M hmms/hmm11 labels/triphones1
HERest -A -D -T 1 -C configs/config -I labels/wintry.mlf -t 250.0 150.0 1000.0 -s stats -S scps/train.scp -H hmms/hmm11/macros -H hmms/hmm11/hmmdefs -M hmms/hmm12 labels/triphones1
二、使用脚本生成fullist和tielist文件。
首先制作脚本文件global3.ded,内容如下:
RS cmu
MP sil sil sp
TC
最后有一行换行
然后,在dict3的基础上制作新发音字典dict4。去掉了以下内容:
SILEN sil
SEND-END [] sil
SEND-START [] sil
执行如下命令:
HDMan -b sp -n lists/fullist -g global3.ded -l floag dict/dict4-tri dict/dict4
可能会有报错。
**把dict4里面的“-- sp”这一行换到“A”的上面就好了。**之后在data/lists中生成fullist文件。
**然后对fullist文件进行处理。**用记事本打开fullist,在最后添加如下内容:
sil
ay
em
ow
ax
最后要有一行换行
三、生成tree.hed文件。
首先,在HTK samples文件夹中找到mkclscript.prl,将其复制到data/scripts文件夹中,再执行以下命令:
perl scripts/mkclscript.prl TB 350.0 monophones0>tree.hed
在data文件夹中找到生成的tree.hed,但这个文件还缺少一些内容,因为生成的tree.hed只有TB开头。
按照路径打开HTK\samples\RMHTK\libquests.hed文件,ctrl+a复制全部内容,粘贴在生成的tree.hed的前面,然后在开头、中间、结尾分别按如下形式添加:
(添加)RO 100 stats
(添加)TR 0
QS “R_NonBoundary” { + }
QS “R_Silence” { +sil }
QS “R_Stop” { +p,+pd,+b,+t,+td,+d,+dd,+k,+kd,+g }
………………….
QS “L_y” { y- }
QS “L_z” { z-* }
(添加)TR 2
TB 350.0 “ST_ax_2_” {(“ax”,"-ax+",“ax+","-ax”).state[2]}
TB 350.0 “ST_b_2_” {(“b”,"-b+",“b+","-b”).state[2]}
TB 350.0 “ST_r_2_” {(“r”,"-r+",“r+","-r”).state[2]}
……………………
TB 350.0 “ST_sil_4_” {(“sil”,"-sil+",“sil+","-sil”).state[4]}
TB 350.0 “ST_sp_4_” {(“sp”,"-sp+",“sp+","-sp”).state[4]}
(添加)TR 1
(添加)AU lists/fullist
(添加)CO lists/tiedlist
(添加)ST trees
新建hmms/hmm13,hmms/hmm14,hmms/hmm15,执行如下命令:
HHEd -H hmms/hmm12/macros -H hmms/hmm12/hmmdefs -M hmms/hmm13 tree.hed labels/triphones1>log
之后会在lists文件夹中生成了tiedlist文件。
重估两次:
HERest -C configs/config -I labels/wintry.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm13/macros -H hmms/hmm13/hmmdefs -M hmms/hmm14 lists/tiedlist
HERest -C configs/config -I labels/wintry.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm14/macros -H hmms/hmm14/hmmdefs -M hmms/hmm15 lists/tiedlist
接下来就可以做评估了。
重估的时候要用到新的配置文件,是在data/configs/config的基础上添加如下两行内容:
FORCECXTEXP = T
ALLOWXWRDEXP = F
得到新的配置文件config2。
最后要有一行换行。
最后,执行评估命令:
HVite -C configs/config2 -H hmms/hmm15/macros -H hmms/hmm15/hmmdefs -S scps/test.scp -l * -i results/recout_hmm15.mlf -w dict/wdnet -p 0.0 -s 5.0 dict/dict3 lists/tiedlist
耐心等待结果。结果存放在recout_hmm15.mlf中。
左图为识别结果,右图为语音原句。
使用如下命令来查看识别率:
HResults -I test/testwords.mlf lists/tiedlist results/recout_hmm15.mlf
可以看到采用三音素优化,效果还是蛮明显的。
接下来搭建语言模型进行改进。