接着上一篇做。
六、提取特征参数,生成.mfc文件
编写配置文件wav_config,内容如下:
SOURCEFORMAT=NIST
TARGETKIND=MFCC_0_D_A
TARGETRATE=100000.0
SAVECOMPRESSED=T
USEHAMMING=T
WINDOWSIZE=250000.0
SAVEWITHCRC=T
PREEMCOEF=0.97
NUMCHANS=26
CEPLIFTER=22
NUMCEPS=12
!!!!仍然记得要在最后有一行换行
再将配置文件放在data/configs文件中。
使用python编写生成.mfc文件的路径文件codetrain.scp
代码如下:
import os
for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TRAIN"):
for file in files:
if file.endswith('.WAV'):
root_txt=os.path.join(root,file) #文本路径
root_txt1=os.path.join(root)
a=file.split('.',1)
#print(root_txt+' '+root_txt1+'\\'+a[0]+'.MFC\n')
a1=open("E:\dataset_TIMIT\codetrain.txt",'a')
a1.write(root_txt+' '+root_txt1+'\\'+a[0]+'.MFC\n')
a1.close()
得到codetrain.txt,之后将后缀名改为scp,在data文件中新建scps文件夹,并将codetrain.scp放在scps文件夹中。
codetrain.scp中的部分内容如下:
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1.WAV E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA2.WAV E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA2.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1027.WAV E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1027.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1657.WAV E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1657.MFC
执行命令:
HCopy -T 1 -C configs/wav_config -S scps/codetrain.scp
之后,就会在train文件中wav文件所在位置产生相应的mfc特征文件。
七、定义模型,生成文件:hmms/hmm0/protov,hmms/hmm0/vFloors
先定义一个原始的HMM模型文件proto,放在data文件,内容如下:
> ~o <VecSize> 39 <MFCC_0_D_A>
~h "proto"
<BeginHMM>
<NumStates> 5
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 3
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 4
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 5
0.0 1.0 0.0 0.0 0.0
0.0 0.6 0.4 0.0 0.0
0.0 0.0 0.6 0.4 0.0
0.0 0.0 0.0 0.7 0.3
0.0 0.0 0.0 0.0 0.0
<EndHMM>
!!!!最后有一行换行
然后编写新的配置文件config,放在data/configs文件中,内容如下:
#SOURCEFORMAT=NIST
TARGETKIND=MFCC_0_D_A
TARGETRATE=100000.0
SAVECOMPRESSED=T
USEHAMMING=T
WINDOWSIZE=250000.0
SAVEWITHCRC=T
PREEMCOEF=0.97
NUMCHANS=26
CEPLIFTER=22
NUMCEPS=12
ENORMALISE=F
!!!!最后有一行换行
再使用python编写mfc位置文件train.scp
代码如下:
import os
for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TRAIN"):
for file in files:
if file.endswith('.MFC'):
root_txt=os.path.join(root,file) #文本路径
#a=file.split('.',1)
#print(root_txt+'\ '+os.path.join(root)+a[0]+'.mfc')
a1=open("E:\dataset_TIMIT\scp_xunlian.txt",'a')
a1.write(root_txt+'\n')
a1.close()
将生成的scp_xunlian.txt文件名称修改为train.scp,放在data/scps文件夹中。
train.scp中的部分内容如下:
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA2.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1027.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1657.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI648.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SX127.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SX217.MFC
E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SX307.MFC
在data文件中新建hmms文件,并在hmms文件中再新建一个hmm0文件夹。
执行以下命令:
HCompV -C configs/config -f 0.01 -m -S scps/train.scp -M hmms/hmm0 proto
之后,在hmms/hmm0中生成新的proto文件和一个vFloors文件。
新建一个macros.txt文件,内容是把vFloors文件复制过来,在开头加两行内容:
~o
39 <MFCC_0_D_A>
!!!!最后有一行换行
再把文件后缀去掉,得到全局宏文件macros。
这步要制作hmmdefs文件。我这里给出了一种比较笨但可行的方法,大家可以先了解一下,知道这步要干啥,然后用自己的方法执行这步。。
新建一个hmmdefs.txt文件,作以下步骤:
- 复制hmm0文件中的proto文件内容
- 打开monophones0文件,由于里面共有47个音素,所以把刚刚拷贝的内容粘贴47次,然后把每一段中的~h “proto”里的proto替换成这47个音素(可以用记事本的替换功能实现)
- 将hmmdefs.txt文件的后缀删去
这里给出一个示例:
~h "ax"
<BEGINHMM>
<NUMSTATES> 5
<STATE> 2
<MEAN> 39
-1.012254e+01 -7.264227e+00 -5.370607e+00 -9.712223e+00 -8.047406e+00 -5.681802e+00 -5.715535e+00 -8.866675e-01 -3.691200e+00 -1.679092e+00 -2.372118e+00 -1.992837e+00 5.435896e+01 3.500741e-03 3.751603e-03 -3.257724e-04 8.666575e-04 4.723777e-03 -5.870705e-04 2.242970e-04 -5.077751e-03 -4.136840e-03 -6.560303e-04 -4.315044e-03 -2.692410e-03 3.635510e-03 -9.592961e-05 -2.103102e-04 1.351059e-04 -1.660344e-05 -3.384981e-04 -2.177452e-04 -1.438189e-04 1.636954e-04 2.628736e-04 5.670929e-06 2.228742e-04 2.034476e-04 -1.622332e-05
<VARIANCE> 39
1.019788e+02 5.942492e+01 7.969104e+01 8.208924e+01 7.801925e+01 7.487221e+01 7.644019e+01 6.621938e+01 6.555125e+01 4.695238e+01 4.796210e+01 3.524434e+01 1.175212e+02 4.562052e+00 3.524029e+00 3.336635e+00 4.190800e+00 4.308127e+00 4.198910e+00 4.401061e+00 4.303517e+00 3.945029e+00 3.243077e+00 2.985245e+00 2.440660e+00 5.602145e+00 6.298037e-01 5.834211e-01 5.080931e-01 6.770242e-01 7.052048e-01 7.098501e-01 7.490554e-01 7.594700e-01 6.945509e-01 5.957313e-01 5.417513e-01 4.463944e-01 8.994046e-01
<GCONST> 1.383838e+02
<STATE> 3
<MEAN> 39
-1.012254e+01 -7.264227e+00 -5.370607e+00 -9.712223e+00 -8.047406e+00 -5.681802e+00 -5.715535e+00 -8.866675e-01 -3.691200e+00 -1.679092e+00 -2.372118e+00 -1.992837e+00 5.435896e+01 3.500741e-03 3.751603e-03 -3.257724e-04 8.666575e-04 4.723777e-03 -5.870705e-04 2.242970e-04 -5.077751e-03 -4.136840e-03 -6.560303e-04 -4.315044e-03 -2.692410e-03 3.635510e-03 -9.592961e-05 -2.103102e-04 1.351059e-04 -1.660344e-05 -3.384981e-04 -2.177452e-04 -1.438189e-04 1.636954e-04 2.628736e-04 5.670929e-06 2.228742e-04 2.034476e-04 -1.622332e-05
<VARIANCE> 39
1.019788e+02 5.942492e+01 7.969104e+01 8.208924e+01 7.801925e+01 7.487221e+01 7.644019e+01 6.621938e+01 6.555125e+01 4.695238e+01 4.796210e+01 3.524434e+01 1.175212e+02 4.562052e+00 3.524029e+00 3.336635e+00 4.190800e+00 4.308127e+00 4.198910e+00 4.401061e+00 4.303517e+00 3.945029e+00 3.243077e+00 2.985245e+00 2.440660e+00 5.602145e+00 6.298037e-01 5.834211e-01 5.080931e-01 6.770242e-01 7.052048e-01 7.098501e-01 7.490554e-01 7.594700e-01 6.945509e-01 5.957313e-01 5.417513e-01 4.463944e-01 8.994046e-01
<GCONST> 1.383838e+02
<STATE> 4
<MEAN> 39
-1.012254e+01 -7.264227e+00 -5.370607e+00 -9.712223e+00 -8.047406e+00 -5.681802e+00 -5.715535e+00 -8.866675e-01 -3.691200e+00 -1.679092e+00 -2.372118e+00 -1.992837e+00 5.435896e+01 3.500741e-03 3.751603e-03 -3.257724e-04 8.666575e-04 4.723777e-03 -5.870705e-04 2.242970e-04 -5.077751e-03 -4.136840e-03 -6.560303e-04 -4.315044e-03 -2.692410e-03 3.635510e-03 -9.592961e-05 -2.103102e-04 1.351059e-04 -1.660344e-05 -3.384981e-04 -2.177452e-04 -1.438189e-04 1.636954e-04 2.628736e-04 5.670929e-06 2.228742e-04 2.034476e-04 -1.622332e-05
<VARIANCE> 39
1.019788e+02 5.942492e+01 7.969104e+01 8.208924e+01 7.801925e+01 7.487221e+01 7.644019e+01 6.621938e+01 6.555125e+01 4.695238e+01 4.796210e+01 3.524434e+01 1.175212e+02 4.562052e+00 3.524029e+00 3.336635e+00 4.190800e+00 4.308127e+00 4.198910e+00 4.401061e+00 4.303517e+00 3.945029e+00 3.243077e+00 2.985245e+00 2.440660e+00 5.602145e+00 6.298037e-01 5.834211e-01 5.080931e-01 6.770242e-01 7.052048e-01 7.098501e-01 7.490554e-01 7.594700e-01 6.945509e-01 5.957313e-01 5.417513e-01 4.463944e-01 8.994046e-01
<GCONST> 1.383838e+02
<TRANSP> 5
0.000000e+00 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 6.000000e-01 4.000000e-01 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 6.000000e-01 4.000000e-01 0.000000e+00
0.000000e+00 0.000000e+00 0.000000e+00 7.000000e-01 3.000000e-01
0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
<ENDHMM>
这步主要就是修改~h "proto"里的proto内容,类似于这样的共有47个。
之后,复制monophones0,去掉里面的“sp”音素,得到新的音素文件monophones1。
在hmms文件夹中新建hmm1文件夹,之后执行以下命令:
HERest -A -D -T 1 -C configs/config -I labels/phones0.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm0/macros -H hmms/hmm0/hmmdefs -M hmms/hmm1 monophones1
修改-H和-M两项的参数,分别得到如下两个命令:
HERest -A -D -T 1 -C configs/config -I labels/phones0.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm1/macros -H hmms/hmm1/hmmdefs -M hmms/hmm2 monophones1
HERest -A -D -T 1 -C configs/config -I labels/phones0.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm2/macros -H hmms/hmm2/hmmdefs -M hmms/hmm3 monophones1
最终结果有两个文件hmmsdef和macros放在hmm3下。
八、绑定静音
首先复制hmm3中的两个文件到新建的hmm4中。打开hmm4中的hmmdefs文件,复制“sil”的那一部分内容,往下粘贴一个,再修改为sp,相当于借用“sil”的模型增添了一个“sp”模型。
然后在data/scripts文件夹中新建sil.txt文件,内容如下:
AT 2 4 0.2 {sil.transP}
AT 4 2 0.2 {sil.transP}
AT 1 3 0.3 {sp.transP}
TI silst {sil.state[3],sp.state[2]}
!!!!最后有一行换行
之后将该文件的后缀名改为hed
执行以下命令:
HHEd –A –D –T 1 –H hmms/hmm4/macros –H hmms/hmm4/hmmdefs –M hmms/hmm5 scripts/sil.hed monophones0
执行画面如下:
再使用HERest命令进行两次重估。
在hmms文件夹中新建hmm6和hmm7,修改-H和-M两项的参数,分别得到如下两个命令:
HERest -A -D -T 1 -C configs/config -I labels/phones0.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm5/macros -H hmms/hmm5/hmmdefs -M hmms/hmm6 monophones0
HERest -A -D -T 1 -C configs/config -I labels/phones0.mlf -t 250.0 150.0 1000.0 -S scps/train.scp -H hmms/hmm6/macros -H hmms/hmm6/hmmdefs -M hmms/hmm7 monophones0
最终结果有两个文件hmmsdef和macros放在hmm7下。
九、重新校正训练数据
首先,制作新发音字典dict2。复制data/dict/dict1内所有内容,粘贴在dict/dict2.txt文件中,并按照字母顺序添加“SILEN sil”一项,之后将后缀名删去。
发张图比较清晰明了:
然后,处理labels/trainwords.mlf文件。需要把里面的所有路径改为“*/XXXX”格式,所以我写了一个python代码来处理这一步。将原trainwords.mlf备份,然后复制一份得到trainwords.txt。python代码如下:
a1=open("d:/data/labels/trainwords.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('*\S'+b[1])
a2=open("d:/data/labels/trainwords_new.txt",'a')
a2.write(c)
a2.close()
得到trainwords_new.txt文件,然后修改文件名为trainwords.mlf。
新得到的trainwords.mlf文件长这样:
接着,执行如下命令:
HVite -A -D -l * -o SWT -b SILEN -C configs/config -H hmms/hmm7/macros -H hmms/hmm7/hmmdefs -i labels/aligned.mlf -m -t 250.0 150.0 1000.0 -y lab -a -I labels/trainwords.mlf -S scps/train.scp dict/dict2 monophones0
其中dict2是SILEN sil加入发音字典dict1后的新发音字典,aligned.mlf是将要生成的新的音素级标音文件。
然后使用HERest重估两次,放在hmm9中,其中,用aligned.mlf代替phones0.mlf,命令如下:
HERest –A –D –T 1 –C configs/config –I labels/aligned.mlf –t 250.0 150.0 1000.0 –S scps/train.scp –H hmms/hmm7/macros –H hmms/hmm7/hmmdefs –M hmms/hmm8 monophones0
HERest –A –D –T 1 –C configs/config –I labels/aligned.mlf –t 250.0 150.0 1000.0 –S scps/train.scp –H hmms/hmm8/macros –H hmms/hmm8/hmmdefs –M hmms/hmm9 monophones0
————————————————————————————————————————————
分割线,到这里可以进行识别率的测试了。
建立gram,生成词网络文件wdnet
可以利用前面生成的wlist文件进行建立。
将wlist复制一份,并将后缀改为txt,然后使用如下代码进行处理:
def delblankline(infile, outfile):
infopen = open(infile, 'r',encoding="utf-8")
outfopen = open(outfile, 'w',encoding="utf-8")
db = infopen.read()
outfopen.write(db.replace('\n','|'))
infopen.close()
outfopen.close()
delblankline("wlist.txt", "gram.txt")
生成gram.txt文件,打开后在开头加上“$WD=”,在结尾加上;(SEND-START<$WD>SEND-END)【不要忘记这个分号】,最终得到gram文件如下:
$WD='EM|–|A|ABBREVIATE|ABIDES|ABILITY|ABLE|ABLY|ABOLISH|ABORIGINE|ABORIGINES|ABOUT|ABOVE|ABRUPTLY|ABSENT|ABSOLUTION|ABSORPTION|ABSURD|ABSURDLY|ACADEMIC|ACCELEROMETER|ACCELEROMETERS|ACCEPT|…|ZONES|ZOO|ZOOLOGIST|ZOOS;(SEND-START<$WD>SEND-END)
!!!!最后有一行换行
把gram.txt复制到data文件中,并去掉后缀,执行以下命令:
HParse gram wdnet
生成词网络文件wdnet。
生成test集的mfc特征文件,并生成mfc路径文件test.scp
首先使用python编写生成.mfc文件的路径文件codetest.scp,代码如下:
import os
for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TEST"):
for file in files:
if file.endswith('.WAV'):
root_txt=os.path.join(root,file) #文本路径
root_txt1=os.path.join(root)
a=file.split('.',1)
#print(root_txt+' '+root_txt1+'\\'+a[0]+'.MFC\n')
a1=open("E:\dataset_TIMIT\mask_test.txt",'a')
a1.write(root_txt+' '+root_txt1+'\\'+a[0]+'.MFC\n')
a1.close()
得到mask_test.txt,修改文件名为codetest.scp,并放置在data/scps文件中。
codetest.scp的部分内容如下:
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA1.WAV E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA1.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA2.WAV E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA2.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI1573.WAV E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI1573.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI2203.WAV E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI2203.MFC
执行如下命令:
HCopy -T 1 -C configs/wav_config -S scps/codetest.scp
之后,就会在test文件中wav文件所在位置产生相应的mfc特征文件。
接着再使用python编写mfc位置文件test.scp
代码如下:
import os
for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TEST"):
for file in files:
if file.endswith('.MFC'):
root_txt=os.path.join(root,file) #文本路径
#a=file.split('.',1)
#print(root_txt+'\ '+os.path.join(root)+a[0]+'.mfc')
a1=open("E:\dataset_TIMIT\scp_test.txt",'a')
a1.write(root_txt+'\n')
a1.close()
将生成的scp_test.txt文件名称修改为test.scp,放在data/scps文件夹中。
test.scp的部分内容如下:
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA1.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA2.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI1573.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI2203.MFC
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI943.MFC
接着制作新发音字典dict3。需要对dict2进行复制,增加如下两行内容:
SEND-END [] sil
SEND-START [] sil
保存为dic3,来张图更为清晰明了:
然后制作抄本文件testprompts。使用代码如下:
import os
import re
# make English text clean
def clean_en_text(text):
# keep English space '-' ''' and space
comp = re.compile('[^A-Z^a-z^\-^\' ]')
return comp.sub('', text)
for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TEST"):
for file in files:
if file.endswith('.TXT'):
root_txt=os.path.join(root,file) #文本路径
a=root_txt.split('.',1)
abs_path = os.path.join(root,file)
with open(abs_path) as f:
txt=clean_en_text(f.read()) #文本内容
#print(root_txt+txt.upper())
a1=open("E:\dataset_TIMIT\mask_testprompts.txt",'a')
a1.write(a[0]+txt.upper()+'\n')
a1.close()
将mask_testprompts.txt复制到data文件夹中,并改名为testprompts,testprompts部分内容如下:
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SA2 DON’T ASK ME TO CARRY AN OILY RAG LIKE THAT
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI1573 HIS CAPTAIN WAS THIN AND HAGGARD AND HIS BEAUTIFUL BOOTS WERE WORN AND SHABBY
E:\dataset_TIMIT\TIMIT\TEST\DR1\FAKS0\SI2203 THE REASONS FOR THIS DIVE SEEMED FOOLISH NOW
接着在data文件夹中新建test文件夹,执行以下命令:
perl scripts/prompts2mlf test/testwords.mlf testprompts
在test文件夹中生成testwords.mlf文件。这里同样要对testwords.mlf进行处理,需要把里面的所有路径改为“*/XXXX”格式,将原testwords.mlf备份,然后复制一份得到testwords.txt。python代码如下:
a1=open("d:/data/test/testwords.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('*\S'+b[1])
a2=open("d:/data/test/testwords_new.txt",'a')
a2.write(c)
a2.close()
得到testwords_new.txt文件,之后修改文件名为testwords.mlf。得到的testwords.mlf的部分内容如下:
#!MLF!#
“/SA1.lab"
SHE
HAD
YOUR
DARK
SUIT
IN
GREASY
WASH
WATER
ALL
YEAR
.
"/SA2.lab”
DON’T
ASK
ME
TO
CARRY
AN
OILY
RAG
LIKE
THAT
.
然后就可以使用HVite命令进行测试了,这里我把wdnet文件放在了dict文件夹中。
HVite –H hmms/hmm9/macros –H hmms/hmm9/hmmdefs –S scps/test.scp -l * -i results/recout_hmm9.mlf –w dict/wdnet –p 0.0 –s 5.0 dict/dict3 monophones0
生成结果所需要的时间很长,需要耐心等待,我这边用时是50分钟左右。
生成的recout_hmm9.mlf部分内容如下:
#!MLF!#
“/SA1.rec"
5800000 8300000 SHE -1968.475952
8300000 10700000 HAD -2025.882935
10700000 11800000 YA -1008.792542
11800000 15100000 DARK -2907.694092
15100000 18100000 SOON -2483.627441
18100000 19800000 IN -1490.738647
19800000 24200000 GREASY -3858.067871
24200000 28200000 WASH -3090.037354
28200000 32400000 WATER -3355.964844
32400000 34600000 ALL -1809.887085
34600000 38100000 YOUR -2591.494873
.
"/SA2.rec”
7800000 10000000 BONE -1911.280884
10000000 13000000 ASK -2396.651123
13000000 15200000 NEED -2128.028809
15200000 19700000 CARRY -3604.123779
19700000 20800000 IN -1108.004761
20800000 24700000 OILY -3079.425293
24700000 28000000 RAG -2645.752441
28000000 30700000 LIKE -2353.326416
30700000 33400000 THAT -2100.544922
.
对比一下原句子,左图为识别结果,右图为原句内容:
可以看到句子中的大部分词识别得较好,但句子本身并没有识别成功。
再执行以下命令:
HResults -I test/testwords.mlf monophones0 results/recout_hmm9.mlf
得到如下结果图:
太惨了,句子的正确率为0,词的准确率为负值。。
到这里第二个教程结束。下一个教程将创建绑定状态的三音素模型,以做进一步的优化。