使用HTK搭建大词汇量语音识别系统,采用的是timit语音库,由于timit语音库的文本语料全是小写,为了与HTKbook中的例子一致,我用python对所有单词和句子都转换成了大写。
一、建立任务语法,建立gram
由于timit语音库自带文件中没有HTK能直接使用的任务语法,故我将timit中的发音文件timitdic.txt使用python转换成了任务语法。Python脚本主要是对每一条发音文件按照“/”分割,然后在每个单词后面加“|”即可得到,当然也可以直接用后来生成的wlist文件在每个单词后面加“|”。最终语法格式如下:
$WD=A|ABBREVIATE|ABDOMEN|ABIDES|ABILITY|ABLE|ABLY|… (SEND-START<$WD>SEND-END)
二、建立发音字典,生成dict1,monophones1,dlog文件
1、这一步一定要小心翼翼,我因为一个双引号而没有把所有单词生成发音字典,找了一下午的错。我用python(我的文件是getsentence.py)脚本对timit语音库中所有的.txt文本的路径及内容进行抓取,其中在进行内容抓取的时候需要去除标点除了单引号和连接符号之外的所有符号(如” : ! ~ ? . )等,否则使用HDMan函数生成的字典不全。至此,得到一个抄本文件trainprompts, 共4620条,部分内容如下:
data/train/dr1/fcjf0/Untitled/sa1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR data/train/dr1/fcjf0/Untitled/sa2 DON'T ASK ME TO CARRY AN OILY RAG LIKE THAT data/train/dr1/fcjf0/Untitled/si1027 EVEN THEN IF SHE TOOK ONE STEP FORWARD HE COULD CATCH HER data/train/dr1/fcjf0/Untitled/si1657 OR BORROW SOME MONEY FROM SOMEONE AND GO HOME BY BUS data/train/dr1/fcjf0/Untitled/si648 A SAILBOAT MAY HAVE A BONE IN HER TEETH ONE MINUTE AND LIE
2、然后使用HTK自带脚本prompts2wlist,将上述trainprompts转换为wlist文件,从句子中得到排序好的单词列表,命令如下:
perl scripts/prompts2wlist data/trainprompts data/wlist
得到wlist的格式如下:
A ABBREVIATE ABIDES ABILITY ABLE ABLY ABOLISH
前面说了可以用wlist生成gram语法文件,加个“|”即可。
3、timit自带了发音字典,但是其格式不是我们想要的,它的格式如下:
a /ax/ abbreviate /ax b r iy1 v iy ey2 t/ abdomen /ae1 b d ax m ax n/ abides /ax b ay1 d z/ ability /ax b ih1 l ix t iy/ able /ey1 b el/ ably /ey1 b l iy/ abolish /ax b aa1 l ih sh/
使用python把单词转换成大写,然后稍作修改(替换掉“/”)之后得到我们想要的格式:
A ax sp ABBREVIATE ax b r iy1 v iy ey2 t sp ABDOMEN ae1 b d ax m ax n sp ABIDES ax b ay1 d z sp ABILITY ax b ih1 l ix t iy sp ABLE ey1 b el sp ABLY ey1 b l iy sp ABOLISH ax b aa1 l ih sh sp
然后执行命令:
HDMan -m -w data/wlist -n data/monophones0 -l dlog dict/dict1 data/timit
得到音素文件monophones0,日志文件dlog,发音字典文件dict1
其中monophones0是所有发音的集合共47个(生成46个,再加一个sil),其内容如下:
ax sp b r iy v ey t ay d z
dlog为生成字典dict1时,wlist中单词生成发音字典的产生的消息记录。
dict1就是wlist的发音字典,包含于timit中,格式与timit一致,如下:
A ax sp sp ABBREVIATE ax b r iy v iy ey t sp sp ABIDES ax b ay d z sp sp ABILITY ax b ih l ix t iy sp sp ABLE ey b el sp sp ABLY ey b l iy sp sp ABOLISH ax b aa l ih sh sp sp ABORIGINE ae b axr ih jh ix n iy sp sp ABORIGINES ae b axr ih jh ix n iy z sp sp
三、字级别标音, 生成文件trainwords.mlf
使用HTK自带脚本prompts2mlf将上述trainprompts文件转换成标注文件trainwords.mlf.
命令:
perl scripts/prompts2mlf labels/trainwords.mlf data/trainprompts
得到文件形式为:
#!MLF!# "data/train/dr1/fcjf0/Untitled/sa1.lab" SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR . "data/train/dr1/fcjf0/Untitled/sa2.lab" DON'T ASK ME TO CARRY AN OILY RAG LIKE THAT
四、音素级标音,生成文件:phones0.Mlf
先编辑需要使用到的脚本文件mkphones0.led,内容如下:
EX IS sil sil DE sp
使用命令:
HELd -l * -d dict/dict1 -i labels/phones0.mlf scripts/mkphones0.led labels/trainwords.mlf
得到音素级标音文件phones0.mlf,其格式如下:
#!MLF!# "*/sa1.lab" sil sh iy hh ae d y uh r d aa r k s
这一步很容易出错,必须保证前面几步完成正确,不能出现trainprompts中的单词在dict1中找不到。其中timit自带发音字典中有一些连接词,而在trainprompts中不是连接词,最好在timit中把连接词的各个组成单词在timit中搜一下看有没有,如果没有,就把音标上,当然标音得用timit中存在的音素,不能自创。
五、总结
折腾了一天,总算把这些错给解决了,主要问题有:(1)在提取的trainprompts中有双引号和单引号等;(2)timit发音字典有些连接词没有进行手工划分,导致生成的发音字典dict1没有完全包含 trainprompts中的单词。
明天继续。。。