第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > HTK搭建大词汇量连续语音识别系统(一)

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

时间:2024-07-20 03:22:41

相关推荐

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

使用HTK搭建大词汇量语音识别系统,这里使用的是timit语音库。

本人python小白,只学了两三天,代码写的有点菜。。希望多多包涵

一、建立抄本文件trainprompts

所使用的python版本是3.6

trainprompts文件内容为timit/train文件下所有wav的地址(注意最后文件名不带任何后缀)和文字内容,部分内容如下:

E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR

E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA2 DON’T ASK ME TO CARRY AN OILY RAG LIKE THAT

E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1027 EVEN THEN IF SHE TOOK ONE STEP FORWARD HE COULD CATCH HER

E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1657 OR BORROW SOME MONEY FROM SOMEONE AND GO HOME BY BUS

代码如下:

import osimport re# make English text cleandef clean_en_text(text):# keep English '-' ''' and spacecomp = pile('[^A-Z^a-z^\-^\' ]')return comp.sub('', text)for root,dirs,files in os.walk(r"E:\dataset_TIMIT\TIMIT\TRAIN"):for file in files:if file.endswith('.TXT'):root_txt=os.path.join(root,file)#文本路径 a=root_txt.split('.',1)abs_path = os.path.join(root,file)with open(abs_path) as f:txt=clean_en_text(f.read()) #文本内容#print(root_txt+txt.upper())a1=open("E:\dataset_TIMIT\mask_trainprompts.txt",'a')a1.write(a[0]+txt.upper()+'\n')a1.close()

得到mask_trainprompts.txt,再将文件名改为不带后缀的trainprompts即可。

二、用perl工具trainprompts转换为wlist文件

perl好像要另外安装,这里默认已经安装好相关工具。

重点提示一下,如果你在建立过程中将cmd关闭了,那么打开cmd以后一定要首先执行如下两步:

path=%path%;D:\Visual Studio \Professional\VC\Auxiliary\Build

然后输入VCVARS32。

path=%path%;D:\HTK\htk\bin.win32

之后输入HInit检验一下。整个过程如下所示:

之后,建议新建一个文件夹data,这个文件夹将用于存放使用HTK的各种工具生成的我们所需要的文件。

在HTK samples文件中搜索prompts2wlist,把这个文件拷贝到data/scripts文件中,然后将trainprompts文件放入data文件,执行如下命令:

perl scripts/prompts2wlist trainprompts wlist

格式为perl+prompts2wlist工具地址+trainprompts地址+生成的wlist文件的地址。

这样就得到了wlist文件,部分内容如下:

'EM

A

ABBREVIATE

ABIDES

ABILITY

ABLE

ABLY

ABOLISH

ABORIGINE

ABORIGINES

三、处理TIMIT自带的发音字典

TIMIT语音库自带的发音字典是TIMIT/DOC中的TIMITDIC.TXT。

复制一份,然后将文件中前面的说明删去,使用以下代码进行处理:

def delblankline(infile, outfile):infopen = open(infile, 'r',encoding="utf-8")outfopen = open(outfile, 'w',encoding="utf-8")db = infopen.read()outfopen.write(db.replace(';','\n'))infopen.close()outfopen.close()delblankline("TIMITDIC.TXT", "TIMITDIC_1.txt")

获得中间文件TIMITDIC_1.txt文件,打开之后发现是这样的:

把前面四个单词前的空格和换行去掉,继续用代码处理:

import redef clean_en_text(text):# keep Englishcomp = pile('[^A-Z^a-z^\-^\'^\n^\~ ]')return comp.sub('', text)a1=open("E:\dataset_TIMIT\TIMITDIC_1.txt",'r+')b=[]txt1=a1.readlines()a1.close()for lines in txt1:a=linesb=a.split(' ',1)c=b[0].upper()+' '+b[1].replace('\n',' ')+'sp\n'd=clean_en_text(c)a2=open("E:\dataset_TIMIT\TIMITDIC_2.txt",'a')a2.write(d)a2.close()

得到如下的TIMITDIC_2.txt文件,如图:

!!!!注意格式:大写单词+一个空格+小写发音+结尾为sp\n

将TIMITDIC_2.txt文件名称改为timit,并放在data文件。

再用记事本分别打开wlist和timit文件,在含有“’”符号的单词前添加’\'符号,即:

wlist中:\'EM

timit中:\'EM ax m sp

然后对timit文件进行处理,执行以下步骤:

将位于“\‘EM”单词前面的所有单词按照字母顺序插入到相应位置搜索“~”符号,将多音词的词性连同“~”符号一起删去,再放到相应的正确位置

示例:

原文本为:

LIVED l ih v d sp

LIVELY l ay v l iy sp

LIVES l ih v z sp

LIVESTOCK l ay v s t aa k sp

LIVE~ADJ l ay v sp

LIVE~V l ih v sp

修改为:

LIVE l ay v sp

LIVE l ih v sp

LIVED l ih v d sp

LIVELY l ay v l iy sp

LIVES l ih v z sp

LIVESTOCK l ay v s t aa k sp

在data文件中新建dict文件夹,之后在cmd中执行以下命令:

HDMan -m -w wlist -n monophones0 -l dlog dict/dict1 timit

得到音素文件monophones0,日志文件dlog和发音字典文件dict1

用记事本打开音素文件monophones0,增添一个新的音素sil

部分内容如下:

ax

m

sp

b

zh

em

sil

共47个音素

dlog为生成字典dict1时,wlist中单词生成发音字典的产生的消息记录。

dict1就是wlist的发音字典,包含于timit中,格式与timit一致,如下:

这里我自己增添了一行“-- sp”:

四、字级别标音, 生成文件trainwords.mlf

使用HTK自带脚本prompts2mlf将trainprompts文件转换成标注文件trainwords.mlf

在HTK samples文件中搜索prompts2mlf,把这个文件拷贝到data/scripts文件中,执行如下命令:

perl scripts/prompts2mlf labels/trainwords.mlf trainprompts

trainwords.mlf文件部分内容如下:

#!MLF!#

“E:\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1.lab”

SHE

HAD

YOUR

DARK

SUIT

IN

GREASY

WASH

WATER

ALL

YEAR

.

再用记事本打开该文件,在所有“'EM”前加上符号“\”,即修改为“\'EM”

这步很重要,不然下面第五步可能会报错以下信息:

ERROR [+1232] NumParts: Cannot find word EM

DOWN

ON

THE

FARM

.

“E:dataset_TIMITTIMITTRAINDR2MKAJ0SI2044.lab”

WET

ALSO

WERE

THE

MARINE in dictionary

FATAL ERROR - Terminating program HLEd

五、音素级标音,生成文件:phones0.mlf

先编辑需要使用到的脚本文件mkphones0.led,内容如下:

EX

IS sil sil

DE sp

!!!!注意,这个文件最后一定要有一行换行

然后把它放在scripts文件中。

执行以下命令:

HLEd -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

uw

t

ih

n

第一个教程结束。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。