HTK搭建大词汇量连续语音识别系统(一)

使用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)


 

二、建立发音字典,生成dict1monophones1dlog文件

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语法文件,加个“|”即可。

3timit自带了发音字典,但是其格式不是我们想要的,它的格式如下:

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中有双引号和单引号等;(2timit发音字典有些连接词没有进行手工划分,导致生成的发音字典dict1没有完全包含 trainprompts中的单词。

      明天继续。。。

 

你可能感兴趣的:(语音识别,htk,连续语音,timit,大词汇量)