摘 要:基于词网模型的连续语音识别系统在各方面得到了广泛应用,如语音拨号、语音指令、语音菜单、语音导航及语音电话簿等。本文在研究语音识别理论的基础上,设计并开发了基于词网模型的连续语音识别系统-MYASR。MYASR提供了丰富的功能模块,包括前端处理、特征提取、模型训练、词网构建、识别等,使开发一个基于词网模型的连续语音识别应用系统更加方便,同时也是语音识别研究的实验平台。MYASR所采用的XML描述文件,使系统具有良好的可读性和可扩展性。通过在TIMIT语料库上单音子连续语音识别的实验显示,MYASR具有很高的识别性能和实时性能。
关键词:语音识别;MYASR系统;XML语言
1.引言
在小词汇量的语音识别系统中,主要分为孤立词识别和基于词网模型的连续语音识别。前者通过词发音端点分割算法,把每个词的发音从整段语音中分割出来,然后再到模型集中去寻找最佳的匹配作为识别结果。XML同HTML一样,都来自SGML(标准通用标记语言)。SGML是一种在Web发明之前就早已存在的用标记来描述文档资料的通用语言。但SGML十分庞大且难于学习和使用。鉴于此,人们提出了XML 语言,它具有可扩展性、灵活性、自描述性、简明性的优点。
在MYASR系统中有多个功能模块,每个功能模块都有各自的参数,采用XML语言对这些参数进行描述更加直观,可读性更强。例如,MYASR中MFCC编码的XML描述如下:
<mfcc_params>
<type_mask> MFCC_0_D_A </type_mask>
<sample_rate> 16000 </sample_rate>
<win_size> 400 </win_size>
<win_shift> 160 </win_shift>
<fft_size> 512 </fft_size>
<low_freq> 200 </low_freq>
<high_freq> 7000 </high_freq>
<pre_enphasis> 0.97 </pre_enphasis>
<mel_num> 26 </mel_num>
<cep_num> 12 </cep_num>
<cep_lifter> 10 </cep_lifter>
</mfcc_params>
MYASR通过XML解析器将XML元素中的参数提取出来,然后再传递给各个功能模块。当需要增加参数时,只要在XML文件中适当位置增加一个元素(Element)即可,具有良好的可扩展性。
3.系统开发
MYASR系统的模块结构如下所示:
3.1前端处理
MYASR的前端处理包括以下功能模块:自动增益控制(AGC)、噪音消除、预加重处理。其相应的XML描述如下:
<preprocess_bat workdir="d:worktmp">
<params>
<frame_ts> 20 </frame_ts> //帧长
<agc>
<level> 0.5 </level>
<max_gain> 2.0 </max_gain> //最大增幅
<min_gain> 1.0 </min_gain> //最小增幅
<agc>
<pre_enphasis> 0.97 </pre_enphasis>//预加重系数
<denoise>1</denoise> //噪音消除
</params>
<transcrip> pretrans.scp </transcrip>
</preprocess_bat>
其中属性"workdir"表示当前的工作目录,元素<agc>表示自动增益控制参数,元素<pre_enphasis>表示预加重参数,元素<denoise>表示是否对语音进行噪音消除。元素<transcrip>表示批处理文件,此文件中描述了目标文件名及处理后的文件名,内容如下:
"speech1.wav" "speech1_dn.wav"
"speech2.wav" "speech2_dn.wav"
"speech3.wav" "speech3_dn.wav"
.........
3.2端点分割
在MYASR系统中,实现两种类型的端点分割:句子端点检测,词端点检测。采用的静音检测方法有【2】:基于短时能量、基于短时平均过零率、和基于GMM模型。其XML描述如下:
<endpoint>
<endpoint_method> SENT_CUT </endpoint_method>
<vad_method> GMM_VAD </vad_method>
<sil_interval> 500 </sil_interval> //单位为毫秒
</endpoint>
元素<endpoint_method>表示端点分割方法:设置SENT_CUT表示句子端点分割,设置WORD_CUT表示词端点分割。元素<vad_method>表示静音检测的方法:设置GMM_VAD 表示采用基于GMM模型,PW_VAD表示基于短时能量,COS_VAD表示基于短时平均过零率。<sil_interval>元素表示检测对象之间允许的停顿时间,超过停顿时间意味着出现新的句子或词。
3.3特征提取
MYASR系统中目前采用MFCC结合动态差分参数作为特征矢量。将语音文件转换为MFCC编码的XML描述文件如下所示:
<wav2mfcc workdir = "d:myworkdir">
<params_xml>mfccparams.xml</params_xml>
<transcrip> trans.scp </transcrip>
</wav2mfcc>
其中mfccparams.xml是MFC
C特征参数的描述文件,内容如下:
<mfcc_params>
<type_mask> MFCC_0_D_A </type_mask>//类型
<sample_rate> 16000 </sample_rate> //采样率
<win_size> 400 </win_size> //帧长
<win_shift> 160 </win_shift> //帧移
<fft_size> 512 </fft_size> //FFT的窗长
<low_freq> 200 </low_freq> //截止的最低频率
<high_freq> 7000 </high_freq> //截止的最高频率
<mel_num> 26 </mel_num> //MEL滤波器数
<cep_num> 12 </cep_num> //MFCC维数
<cep_lifter> 10 </cep_lifter> //参数提升系数
</mfcc_params>
其中<type_mask>元素表示特征矢量标志,有6种类型:
表3-1 MYASR中MFCC编码类型
标志 | 含义 |
MFCC | MFCC参数 |
MFCC_0 | MFCC参数加对数能量 |
MFCC_D | MFCC参数及其一阶差分 |
MFCC_0_D | MFCC参数加对数能量,及一阶差分 |
MFCC_D_A | MFCC参数及其一阶、二阶差分 |
MFCC_0_D_A | MFCC参数加对数能量,及一阶、二阶差分 |
<transcrip>元素中的trans.tsp文件描述了语音源文件及转换成MFCC的目标文件,内容如下:
"speech1.wav" "speech1.mfc"
"speech2.wav" "speech2.mfc"
"speech3.wav" "speech3.mfc"
.........
3.4模型训练
MYASR采用了连续概率密度的HMM模型,模型参数初始化采用了"K-均值分割"算法,参数重估采用"Baum-Welch"算法。其XML描述文件如下:
<hmm_train workdir="d:worktmpmytimit">
<label_scrip> phones.lst </label_scrip>
<featlep_scrip> trainmfcclabep.scp </featlep_scrip>
<hmm_params>
<state_num>3</ state_num > //HMM状态数
<mixture>4</mixture> //高斯分量个数
<veclen>39</veclen> //特征矢量维数
<cluster>GMM_EM</cluster> //聚类算法
<feat_flag>MFCC_0_D_A</feat_flag> //特征矢量标志
</hmm_params>
<model_file>modelhmmmodelEM4.xml</model_file> //输出文件
</ hmm _train>
其中,<label_scrip>元素中的文件phones.lst表示要训练的那些词或音子。
<featlep_scrip>元素中的文件trainmfcclabep.scp描述了特征矢量文件及其标注文件,内容如下:
"mfcspeech1.mfc" "labspeech1.lab"
"mfcspeech2.mfc" "labspeech2.lab"
"mfcspeech3.mfc" "labspeech3.lab"
.........
标注文件".lab"中注明了每个单元的发音起点和终点,MYASR将根据标注文件从特征文件中读取特征矢量进行HMM模型的训练。标注文件内容如下:
0 191 sil
191 285 sh
285 358 ix
358 415 hh
415 548 eh
548 646 jh
646 720 ih
720 790 d
790 920 ah
....
其中时间单位为毫秒。
<cluster>元素表示"K-均值分割"算法中对B参数进行重估所采用的算法,有两种选项:GMM_EM表示EM算法,K_MEANS表示"K-means"算法。实验结果显示,EM算法比"K-means"算法具有更好的性能。
<model_file>表示训练输出的HMM模型文件,内容如下:
<hmm_set>
<params>
<feat_mask>MFCC_0_D_A</feat_ mask >
<state_num>3</state_num>
<mixture>4</mixture>
<vec_len>39</vec_len>
</params>
<hmm >
<state>
<mixture> 1.906841e+001 1.900540e-001 ......</mixture> //均值
<var> 2.945649e+001 1.096035e+002......</var> //方差
<weight> 2.212352e-001 </weight> //权重
</state>
......
</hmm>
......
</hmm_ set >
3.5词网构建
3.5.1 词网模型的双层结构
MYASR中的词网模型分为两层:一层是描述层,主要用于描述词网的结构,包括上下文无关文法和有限状态图;另一层是模型层,这一层由HMM模型构成的搜索网络,是搜索算法的输入。首先由用户定义语法规则,然后转换成有限状态图,最后结合HMM模型集和发音字典将其转化成搜索算法可以处理的模型层搜索网络。
3.5.2 描述层到模型层的转换
在模型层搜索网络中,按节点是否有词输出分为两类:空节点和词节点。空节点中不含有HMM模型,而只是作为词网中的一个过度节点,如起始节点(#START),终止节点(#END),中转节点(#L)都是没有词输出的节点。而词节点则包含了构成这个词的HMM模型。
词网模型的有限状态图转换成模型层搜索网络的过程为:当遇到空节点时,不作处理;当遇到词结点时,在字典哈希表找到这个词,并保存word_id,word_id是这个词在字典哈希表的索引,当搜索结束后,回溯时就是根据这个word_id找到哈希表中对应的词;同时根据这个词的发音,到HMM哈希表中查找子词的HMM模型,然后在这个词结点中创建指向子词HMM模型的指针。转换后的模型层搜索网络如图3-4所示。
模型层搜索网络构建后,就可以用Token-Passing算法进行搜索。
4 总结
本文在研究语音识别理论的基础上,设计并开发了基于词网模型的连续语音识别系统-MYASR。MYASR提供了丰富的功能模块,使开发一个基于词网模型的连续语音识别应用系统更加方便,同时也是语音识别研究的实验平台。MYASR所采用的XML描述文件,使系统具有良好的可读性和可扩展性。通过在TIMIT语料库上单音子连续语音识别的实验显示,MYASR具有很高的识别性能和实时性能。当前系统只是在Windows平台上,为适应各种应用的需要,在后续的语音识别系统设计中,可考虑将系统移植到嵌入式平台。
参考文献:
Ney H , Haeb2Umbach R , Tran B H , et al .