在整个语音识别系统的搭建中,参考了博客https://blog.csdn.net/qq_43150721/article/details/98646889,自己动手搭建时,遇到了博客中没提到的问题,故记录下。

一、准备工作

  1. TIMIT语音库
    本文使用TIMIT语音库对系统进行训练和测试,这里分享TIMIT语音库如下:
    链接:https://pan.baidu.com/s/1Im5wSu-njmI9ci7CtIzGew
    提取码:3inh
    下载后,将压缩包中TIMIT文件夹解压,我在电脑D盘新建文件夹D:HTKdataset_TIMIT并解压至此。
  2. 设置环境变量,连接VCVARS32
    每次打开cmd,一定要设置环境变量,执行以下两步:

path=%path%;D:Microsoft Visual StudioVS2019proVCAuxiliaryBuild

然后输入VCVARS32。

path=%path%;D:HTKhtkbin.win32

如果嫌每次设置环境变量麻烦,也可以一次性解决,操作如下:
进入控制面板->系统,点击高级系统设置:
使用HTK搭建英文大词汇量连续语音识别系统(一)
点击“环境变量"->在系统变量中选中”Path“,点击编辑,新建bin.win32和VS路径:
使用HTK搭建英文大词汇量连续语音识别系统(一)
至此环境变量设置完成,打开cmd,输入HInit检验一下,如图:
使用HTK搭建英文大词汇量连续语音识别系统(一)
3. 在D:HTK中创建新文件夹data1,用于存放使用HTK的各种工具生成的我们所需要的文件。

二、建立抄本文件trainprompts

用python创建抄本文件trainprompts,代码如下:

import os import re  # make English text clean def clean_en_text(text):     # keep English '-' ''' and space     comp = re.compile('[^A-Z^a-z^-^' ]')     return comp.sub('', text)  for root,dirs,files in os.walk(r"D:HTKdataset_TIMITTIMITTRAIN"):     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("D:HTKdataset_TIMITmake_trainprompts.txt",'a')                 a1.write(a[0]+txt.upper()+'n')                 a1.close() 

执行后会在D:HTKdataset_TIMIT中生成make_trainprompts.txt,去掉后缀修改名称即得到trainprompts文件。此文件内容为timit/train文件下所有wav的地址(注意最后文件名不带任何后缀)和文字内容,部分内容如下:

D:HTKdataset_TIMITTIMITTRAINDR1FCJF0SA1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR
D:HTKdataset_TIMITTIMITTRAINDR1FCJF0SA2 DON’T ASK ME TO CARRY AN OILY RAG LIKE THAT
D:HTKdataset_TIMITTIMITTRAINDR1FCJF0SI1027 EVEN THEN IF SHE TOOK ONE STEP FORWARD HE COULD CATCH HER

三、将trainprompts转换为wlist文件

在data文件夹中新建scripts文件夹,在HTK samples文件中搜索prompts2wlist,把这个文件拷贝到data1/scripts文件中,将trainprompts文件移至data1文件夹下,依次执行如下命令:

D: cd HTKdata1 perl scripts/prompts2wlist trainprompts wlist 

格式为perl+prompts2wlist工具地址+trainprompts地址+生成的wlist文件的地址。
这样在data1文件夹下生成wlist文件,部分内容如下:

'EM

A
ABBREVIATE
ABIDES
ABILITY
ABLE

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

TIMIT语音库自带的发音字典是TIMIT/DOC中的TIMITDIC.TXT,使用如下代码进行处理,得到TIMITDIC1.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("D:HTKdataset_TIMITTIMITDOCTIMITDIC.TXT", "D:HTKdataset_TIMITTIMITDOCTIMITDIC_1.txt") 

将TIMITDIC1.TXT中前面的说明删去,得到:
使用HTK搭建英文大词汇量连续语音识别系统(一)
再将前面4个单词的空格和换行去掉,如图:
使用HTK搭建英文大词汇量连续语音识别系统(一)
继续用代码将前面的单词转换为大写,执行:

import re def clean_en_text(text):     # keep English     comp = re.compile('[^A-Z^a-z^-^'^n^~ ]')     return comp.sub('', text)  a1=open("D:HTKdataset_TIMITTIMITDOCTIMITDIC_1.txt",'r+') b=[] txt1=a1.readlines() a1.close() for lines in txt1:     a=lines     b=a.split(' ',1)     c=b[0].upper()+' '+b[1].replace('n',' ')+'spn'     d=clean_en_text(c)     a2=open("D:HTKdataset_TIMITTIMITDOCTIMITDIC_2.txt",'a')     a2.write(d)     a2.close() 

得到TIMITDIC_2.txt文件,如图:(!注意,此代码不要运行第二遍,否则得到的TIMITDIC_2.txt文件内容顺序会出错
使用HTK搭建英文大词汇量连续语音识别系统(一)
!注意格式:大写单词+一个空格+小写发音+结尾为spn,从单词A开始按字母顺序排列
将TIMITDIC_2.txt文件名称去掉后缀改为timit,并放在data1文件夹下。
用记事本分别打开wlist和timit文件,在含有“’”符号的单词前添加‘’符号,即:

wlist中:'EM
timit中:'EM ax m sp

接下来对timit文件进行处理,执行以下步骤:

  1. 将位于“‘EM”单词前面的所有单词按照字母顺序插入到相应位置
    例如:将

BOURGEOISIE b uh r zh w aa z iy sp
插入到:
BOURGEOIS b uh r zh w aa sp和BOWL b ow l sp中
形成:
BOURGEOIS b uh r zh w aa sp
BOURGEOISIE b uh r zh w aa z iy sp
BOWL b ow l sp

  1. 搜索”~“符号,将多音词的词性连同符号 "~"一起删去,再放到相应的正确位置
    例如,原文本为:

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

在data1文件中新建dict文件夹存放语音字典,之后在cmd中执行以下命令:

D:HTKdata1>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”:
使用HTK搭建英文大词汇量连续语音识别系统(一)

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

使用prompts2mlf将trainprompts文件转换成标注文件trainwords.mlf
在HTK samples文件中搜索prompts2mlf,把这个文件拷贝到data1/scripts文件中,新建data1/labels文件夹,执行如下命令:

D:HTKdata1>perl scripts/prompts2mlf labels/trainwords.mlf trainprompts

在labels中生成trainwords.mlf,部分内容如下:
使用HTK搭建英文大词汇量连续语音识别系统(一)
用记事本打开该文件,在所有“'EM”前加上符号“”,即修改为“'EM”

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

在scripts文件夹中创建mkphones0.txt,内容为:

EX
IS sil sil
DE sp

!注意,这个文件最后一定要有一行换行,将后缀改为.led,生成mkphones0.led文件。
执行以下命令:

D:HTKdata1>HLEd -l * -d dict/dict1 -i labels/phones0.mlf scripts/mkphones0.led labels/trainwords.mlf

在labels文件夹中得到音素级标音文件phones0.mlf,部分内容如下:

#!MLF!#
“*/SA1.lab”
sil
sh
iy
hh
ae
d
y
uh

第一部分完。

  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论