语音识别之HTK入门(九)——绑定静音中间状态

前面几篇都是关于Baum—Welch算法及其在HTK中的实现。重点介绍了 HERest命令是如何通过B-W算法来更新模型参数的。总体感觉,我对模型“学习”的流程大体清楚了,但是若了解更多的细节还得花更多时间、精力分析。但是,作为一个入门系列,如果在这里继续纠缠,可能后面的步骤就得虎头蛇尾了,那样得不偿失。

现在回顾下前面的步骤,尤其是如何处理【标注文本】的。标注后,我们拿到的文件格式是这样的。

S0001 DIAL EIGHT FIVE 
S0002 DIAL ZERO ZERO EIGHT SIX OH ONE ZERO NINE THREE FIVE EIGHT FIVE THREE THREE NINE ZERO 
S0003 DIAL ZERO SIX ZERO EIGHT THREE ZERO EIGHT SEVEN SEVEN THREE FIVE ONE TWO TWO FOUR NINE SIX 
S0004 CALL DAVE WOOD 
S0005 CALL STEVE YOUNG 
S0006 DIAL NINE OH THREE NINE ONE ZERO ONE NINE NINE OH THREE THREE FOUR TWO FOUR SEVEN FOUR ZERO ZERO SIX ONE ZERO ONE FOUR ZERO NINE TWO 
S0007 DIAL NINE FOUR TWO NINE OH 
S0008 DIAL SEVEN EIGHT SIX ONE EIGHT ZERO NINE ZERO SIX SIX SIX ONE ONE THREE 
S0009 PHONE DAVE WOOD 
S0010 CALL TYLER 

每一行的第一个标记表明对应哪一个音频文件,其后面是音频的文本内容。

通过这个文本构建一个系统的词典,命名为“wlist”,它的内容和形式如下:

CALL
DAVE
DIAL
EIGHT
FIVE
FOUR
JULIAN
LAW
LEE
NINE
OH
ONE
PHIL
PHONE
SENT-END
SENT-START
SEVEN
SIX
STEVE
SUE
THREE
TWO
TYLER
WOOD
YOUNG
ZERO

是按照字典的顺序排好序的。现在就是要为这个wlist中出现的所有单词构建一个对应的【发音标记】,也是我们后面建模声学模型的基础。需要借助语言学知识,字典专家编纂的【通用的带发音的字典】,供查找,然后生成一个叫【dict】的系统发音词典。这是当前系统能认识所有【单词—声音】映射对,超过这个范围的单词和声音,都无法识别,或被误识别。

【dict】的内容如下:

CALL            k ao l sp
DAVE            d ey v sp
DIAL            d ay ax l sp
EIGHT           ey t sp
FIVE            f ay v sp
FOUR            f ao sp
FOUR            f ao r sp
JULIAN          jh uw l ia n sp
JULIAN          jh uw l y ax n sp
LAW             l ao sp
LEE             l iy sp
NINE            n ay n sp
OH              ow sp
ONE             w ah n sp
PHIL            f ih l sp
PHONE           f ow n sp
SENT-END        sil
SENT-START      sil
SEVEN           s eh v n sp
SIX             s ih k s sp
STEVE           s t iy v sp
SUE             s uw sp
SUE             s y uw sp
THREE           th r iy sp
TWO             t uw sp
TYLER           t ay l ax sp
WOOD            w uh d sp
YOUNG           y ah ng sp
ZERO            z ia r ow sp

每个【发音标记】后面自动添加一个【短静音】(sp) ,下面会专门讲到它。

为了得到【dict】,也即系统的【发音词典】,我们需要接受外部知识,比如通用发音字典和地点、人名发音字典。本系统中,我们利用了卡耐基.梅隆学校提供的发音字典,叫【beep】的通用发音字典和自定义的人名发音字典【names】。现在为了展示下这两个字典的内容形式,我把它们俩放一起,方便看。

################
#
#  beep
#
################
A			ah
A			ax
A			ey
A-BOMB			ey b oh m
A-BOMBS			ey b oh m z
A-LEVEL			ey l eh v l
A-LEVELS		ey l eh v l z
A._B._C.		ey b ih s iy
A._B._C.		ey b iy s iy
A._B._C.S		ey b ih s iy z
A._B._C.S		ey b iy s iy z
A._C.			ey s iy
A._D.			ey d iy
A._G._M.		ey jh ih eh m
A._M.			ey eh m
A._M.S			ey eh m z
A._N._C.		ey y eh n s iy
A._R.			ah ax
A._R.			ah ax r

################
#
#  names
#
################

DAVE 		    d ey v 
JULIAN	        jh uw l y ax n 
JULIAN	        jh uw l ia n 
LAW			    l ao 
LEE			    l iy 
PHIL		    f ih l 
SENT-END 	    [] sil
SENT-START 	    [] sil
STEVE		    s t iy v 
SUE			    s uw 
SUE			    s y uw 
TYLER		    t ay l ax 
WOOD 		    w uh d 
YOUNG		    y ah ng

在本系列的第一篇博客里就说了这些过程。现在只不过是再重复一遍。通过命令HDMan,生成上面提到的【dict】,附带生成了一个叫【monophones1】的所有【发音音子】(phone)的集合。

HDMan -m -w wlist -n monophones1 -l dlog dict beep names

 看一下monophone1的内容:

k
ao
l
sp
d
ey
v
ay
ax
t
f
r
jh
uw
ia
n
y
iy
ow
w
ah
ih
sil
s
eh
th
uh
ng
z

这个集合就是我们这个语音识别系统的HMMSet里挂载的所有模型。模型训练时就为这里的每一个标记提供一个HMM模型及其参数。 

在步骤四利用HLed工具生成音素级文本MLF时,引入脚本mkphones0.led,里面包含三个命令:

# 将trainwords.mlf里的单词通过dict发音字典展开
HLEd -l * -d .\dict\dict1 -i .\labels\phones0.mlf mkphones0.led .\labels\trainwords.mlf
# 展开过程中,还有些处理。EX表明展开,IS(Insert Silence) sil sil,在句子首尾分别添加sil
# 第三行 DE(delete)sp,表明将单词后面的sp(short pause)删除。因为在dict中,每个单词后面
# 自动添加了sp标记
EX
IS sil sil
DE sp

现在重新为【标注文本】加入sp,并且重新训练模型。

sp模型可以看着一个特殊的sil模型,它一共有三个状态,包括输入、输出、和一个中间状态。而中间状态的参数与sil的第三状态共享。首先在hmmdefs文件中添加一个新模型 sp:

~h "sp"
<BEGINHMM>
<NUMSTATES> 3
<STATE> 2
<MEAN> 39
 -1.991884e+00 -4.779473e-02 2.959524e+00 2.209569e+00 2.078711e+00 …… <39>
<VARIANCE> 39
 5.752654e+00 5.706510e+00 9.791233e+00 1.276710e+01 1.414057e+01 …… <39>
<GCONST> 7.787554e+01
<TRANSP> 3
 0.000000e+00 1.000000e+00 0.000000e+00 
 0.000000e+00 9.399074e-01 6.009259e-02 
 0.000000e+00 0.000000e+00 8.703525e-01 
<ENDHMM>

然后在在monophones0中添加sp,运行命令:

HHEd  -H  .\hmms\hmm4\macros  -H  .\hmms\hmm4\hmmdefs  -M  .\hmms\hmm5
sil.hed .\lists\monophones1

sil.hed内容如下:

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]}

AT指令为后面花括号里的转移矩阵添加联结,TI指令表示状态绑定,生成一个新的silst宏(macro)。在这篇博客提到Marco的概念,它有多个种类,这个silst就是~s类型,表明它是一个“state”。

silence models

 有了前一步的基础,再运行一次生成音素级的【标注文本】命令HLEd生成phones1.mlf,在每个单词的后面都添加上了sp。

HLEd -l * -d dict -i phones1.mlf mkphones1.led trainwords.mlf

而mkphones1.led,也是在mkphones0.led的基础上把它的最后一行删掉。也就是指通过dict展开单词,并在句子的首尾分别加上sil,而不用DE sp指令。

完成了sp模型的添加后,需要重新学习模型参数。执行HERest命令,像这篇博客一样训练参数。

HERest -C config -I phones1.mlf -t 250.0 150.0 1000.0 -S train.scp
-H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -M .\hmms\hmm8 monophones1

不过得把依赖的文件改成我修正过的,phones1.mlf和monophones1,最后将模型的结果保存在hmm8目录下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值