其实,无论语音识别还是HTK对我来说都不算是入门的事了。
但是现在重新再走一遍,目标还是很明确的——打牢基础。重新回顾收获肯定多多,就像我前段时间把《C++ primer plus》再看一遍一样。把之前理解不透的,知识盲点清理了一下,感觉顺畅了很多,以后还会再次看看这些经典的书籍。
入门的目标就是能够把《HTK BOOK》中的拨号系统实现,各个中间文件的格式搞明白,用到哪个工具,基本掌握它的实现原理。这次可能还会对关键代码在visual studio下调试一遍。如何在visual studio调试HTK代码,会专门写一篇Blog.
首先,把我搜到的比较靠谱的参考资料提供百度网盘下载。HTK3.4.1版本已经很成熟了,2000年就已经完成了,到现在已经20年了。但是真正能为初学者提供比较靠谱的入门参考的其实不多,其中《HTK BOOK》当然是必读的资料,但因为是英文的,加上初学者对很多语音识别概念本来就比较模糊,加重了学习的难度。其中当时还在哈尔滨工业大学人工智能研究室的苏统华写的《应用 HTK 搭建语音拨号系统》以及脚本文件和中间文件是非常好的参考资料。顺着他的思路认真执行,对HTK工具有个较全面的了解。要深入的话,恐怕就非一朝一夕能到达的了,但这的确是把好梯子。
我是按照这个http://blog.sina.com.cn/s/blog_436992740102uw1j.html博客一步步在Windows下安装的,亲测可行。我下载了上面提到的资料,链接:https://pan.baidu.com/s/1QSnSoWz04b3pcACPhrMGuQ 提取码:z4k7 。
https://github.com/Alexir/CMUdict/blob/master/cmudict-0.7b 卡耐基.梅隆学校的网站上就有beep字典,它是语音识别系统的先验知识,对应每个单词的发音,用音子(phone)表示。
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
A._R. ax ax
A._R. ax ax r
A._R. ey ax
A._R. ey ax r
A._S._A._P. ey eh s ey p iy
A._T._F. ey t iy y eh f
AACHEN aa k ax n
AARDVARK aa d v aa k
AARDVARKS aa d v aa k s
AARHUS aa hh uw s
AB ae b
ABABA ae b ax b ax
ABACI ae b ax s ay
ABACK ax b ae k
ABACUS ae b ax k ax s
ABACUSES ae b ax k ax s ih z
ABAFT ax b aa f t
ABANDA ax b ae n d ax
ABANDAH ax b ae n d ax
ABANDAN ax b ae n d ax n
ABANDANDO ax b ae n d ow
ABANDED ax b ae n d ih d
ABANDEN ax b ae n d eh n
ABANDON ax b ae n d ax n
ABANDONADA ax b ae n d ax n ey d ax
ABANDOND ax b ae n d ax n d
ABANDONDED ax b ae n d ax n d ih d
ABANDONED ax b ae n d ax n d
ABANDONEE ax b ae n d ow n iy
ABANDONER ax b ae n d ax n ax
ABANDONER ax b ae n d ax n
上图就是语料的通用字典格式。
就是系统可能的单词组合。如果在更加复杂的语音识别系统中,就是语言模型该干的事。这里就是用一个wordnet来建模。
$digit = ONE | TWO | THREE | FOUR | FIVE |
SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = [ SUE ] LAW |
[ JULIAN ] TYLER |
[ DAVE ] WOOD |
[ PHIL ] LEE |
[ STEVE ] YOUNG;
( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )
有了这个目标语法,系统字典包含的词就已经给出了,可以通过手工编写系统词典(wlist),如果训练语料很多的话,需要借用脚本来构建wlist,就是系统中出现的已知词。接下来的命令就是要为wlist里的每一个词建立发音标记,并写入dict文件中,这就是发英词典。其中names文件是人名的发音字典,需要系统设计者提供,因为英文名字可能千奇百怪,在beep字典里可能没有收录,需要单独提供。
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
拨号系统中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
HDMan -m -w wlist -n monophones1 -l dlog dict beep names
同时,还生成monophones1,包含了发音字典中所有的单音子(phone)。它们的内容如下:
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
monophones1:
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