前言
本文参考自HTK BOOK,完成数字序列的连续语音识别系统搭建,数字按照中文发音,如果HTK安装存在问题,或者HTK工具、脚本存在缺失,不在本文范围内;step by step! 详细步骤! 话不多说,开始!
步骤
-
建立目标语法文件:digit.gram, 内容如下:
$digit= ( one | two | three | four | five | six | seven | eight | nine | zero ); (SENT-START <$digit > SENT-END)
-
由语法文件生成词网络 :
执行命令HParse digit.gram digit.net 生成 digit.net 词网络,digit.net的内容大致如下:VERSION=1.0 N=15 L=33 I=0 W=SENT-END I=1 W=zero I=2 W=!NULL I=3 W=nine I=4 W=eight I=5 W=seven ... J=23 S=2 E=8 J=24 S=12 E=8 J=25 S=2 E=9 J=26 S=12 E=9 J=27 S=2 E=10 J=28 S=12 E=10 J=29 S=2 E=11 J=30 S=12 E=11 J=31 S=14 E=12 J=32 S=0 E=13
-
生成词典:dict
在HTK BOOK中,是使用HDMan -m -w wlist -n monophones0 -l dlog dict beep names生成词典和monophones,beep和names这两个发音词典需要用户下载、编辑,然后HDMan 将wlist中的词依次标上发音,beep词典htk book中给出了链接下载,这里可能会报order的问题,词典必须先排序。
在本文中,并未采用该词典,而是直接手动编辑,本文采用的是中文发音(虽然符号是英文的one,two…你也可以用中文‘一’,‘二’…,但不能用阿拉伯数字12345…,会出错),不会采用beep发音词典,以下是手动编辑的dict:SENT-END sil SENT-START sil eight b a five u four s I nine j y ow one i seven q i six l y ow three s a nT two er zero l i ng
monophone.0,训练词典中的音素列表,手动编辑如下:
l i ng er s a nT I u y ow q b j sil
如果你有大量词汇,建议还是用HDMan来生成
-
录音:
采用HTK自带的工具录音(仅windows),命令HSGen -l -n 200 digit.net dict > testprompts,生成testprompts,该文件是按照语法网络随机生成的sentence,然后按照testprompts的内容录音,testprompts文件内容大概如下:1. SENT-START one eight two SENT-END 2. SENT-START six three one two SENT-END ... n-1. SENT-START eight five three eight six nine five eight seven eight one SENT-END n. SENT-START five SENT-END
HTK的HSLab工具,执行HSLab noname,弹出界面如下,点击rec,说话,然后点击stop,最后save:
-
建立词级别标注文件
HTKTutorial目录下提供的prompts2mlf脚本,根据testprompts生成标注文件digit.mlf(需要根据你wav保存的文件名做适当编辑),mlf文件大致如下:#!MLF!# "*/noname_s1.lab" one eight two . "*/noname_s2.lab" six three one two . ......
-
建立音素级别标注文件
HLEd 工具完成音素级别标注,命令HLEd -l * -d dict -i phones0.mlf mkphones0.led digit.mlf,其中mkphones0.led文件内容编辑如下,具体含义可查看htk book:EX IS sil sil DE sp
生成的phones0.mlf文件如下:
#!MLF!# "*/noname_s1.lab" sil i b a er sil . "*/noname_s2.lab" sil l y ow s a nT i er sil . ......
-
wav编码
编码即音频特征提取,本文跟htk book保持一致,采用mfcc特征
命令:HCopy -T 1 -C mfcc.cfg -S wav.scp
其中mfcc.cfg内容如下:# Coding parameters TARGETKIND = MFCC_0_D_A TARGETRATE = 100000.0 SAVECOMPRESSED = T SAVEWITHCRC = T WINDOWSIZE = 250000.0 USEHAMMING = T PREEMCOEF = 0.97 NUMCHANS = 26 CEPLIFTER = 22 NUMCEPS = 12 ENORMALISE = F
wav.scp文件内容大致如下,根据你自己的路径和文件名来编辑,linux系统也一样:
E:\htk_demo\noname_s1.wav E:\htk_demo\noname_s1.mfc E:\htk_demo\noname_s2.wav E:\htk_demo\noname_s2.mfc E:\htk_demo\noname_s4.wav E:\htk_demo\noname_s4.mfc E:\htk_demo\noname_s5.wav E:\htk_demo\noname_s5.mfc E:\htk_demo\noname_s6.wav E:\htk_demo\noname_s6.mfc ...
执行完后,会生成与wav文件对应的mfcc特征文件
-
建立Flat Start Monophones (单高斯)
大部分情况下,我们很难事先去做音素级别的标注,所以采用Flat Start 的方式初始化。
命令HCompV -C mfcc.cfg -f 0.01 -m -S wav.scp -M hmm0 proto, 记得手动创建hmm0文件夹,同时需要先定义HMM模型,proto文件如下:~o <VecSize> 39 <MFCC_0_D_A> ~h "proto" <BeginHMM> <NumStates> 5 <State> 2 <Mean> 39 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0