1. 程式人生 > >HTK搭建大詞彙量連續語音識別系統(一)

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中的單詞。

      明天繼續。。。