HTK学习2:工具使用

选自:http://www.cnblogs.com/mingzhao810/archive/2012/08/03/2617674.html

这个是重点,呵呵,本部分会讨论到如下内容:

1. 建立语音材料库,确定识别基本元,比如一个单词 yes no ok等,或者 声母 b p m f 韵母 d t n l 等,确定基本元后,标记好识别基本元。

2. 对语音材料库中的声音文件提取MFCC声纹特征

3.为每一个基本元建立一个HMM模型。

4.利用MFCC声纹特征对每一个HMM模型进行训练,使模型参数与其描述的识别基本元对应。

5.定义输入语音的语法规则等,从发音对应到文字。

6. 识别。

下面用一个具体的例子用以演示:一个识别YES和NO的小型语音识别系统.

首先进入到命令行下,开始\运行\cmd 回车

好的,开始采集语音材料,这里我们采集YES和NO两个单词。在命令行下输入:

HSLab  yes.sig 回车

一个用于录音的对话框就会出现。如图:

http://www.zhaomingming.cn/HTK语音识别/HGrap_HSLap.jpg

下面我们开始录音。录音环境自己控制哈。

1.录制声音。点击rec按钮,说:“yes",然后点击stop按钮。你会看到界面上出现一个语音波形,一条语音样本就录制完成了,你可以点击play播放听一下。

2.给声音做标记。本条语音一共需要做3个标记:yes语音段的标记和其前后各一个的静音段标记。注意:做标记的语音段不能重复。点击mark,用鼠标选取“yes"前面的一段静音后,再点击Labelas,用键盘输入"sil" 表示 silence 静音的意思,然后 回车。这样我们就给本条语音的静音段做了一个标记。在点击mark,选取“yes“的发音段,然后点击Labelas按钮,用键盘输入“yes”,回车。这样我们就给本语句的yes做了标记,依照此方法,完成yes后面那个sil语音段的标记。完成这3个标记后,点击save按钮,回车。将我们的其标记文件保存。保存目录为HSLab.exe的运行目录。别找不到文件了哈。

3.重命名语音文件和语音标记文件。语音文件后缀为*.sig,标记文件后缀为*.lab。因为HGraf:HSLab只能自动给出0,1的文件名序号,我们又需要至少10条的语音材料,所以就需要录制一条语音,重命名一条。我们将yes_0.sig重命名为yes_00.sig,将yes_0.lab重命名为yes_00.lab.至此,我们完成了一个语音材料的录制。

4.点击new按钮,会发现new按钮旁边的set[0]变为set[1]了。然后依照1,2,3步,新建下一条语音材料,这时HSLab自动保存的文件名为,yes_1.sig,yes_1.lab,将其命名为yes_01.sig和yes_01.lab即可。

5.再执行9次第4步,得到yes_02,yes_03...yes_10的语音材料和标记文件。

6.依照1,2,3,4,5步的方法,完成no的语音材料和标记文件的制作,得到no_00.sig,no_00.lab...no_10.sig,no_10.lab.

7.这样我们就完成了本yes和no语音识别系统的语音库的建立。然后将所有的*.lab文件放入到laber_dir文件夹中。

以方便后面训练操作。

8.有了语音库,我们就来实现特征提取。使用命令Hcopy来完成。首先需要完成两个配置文件的编写: 特征矢量参数的analysis.conf文件和源文件和目的文件的位置列表文件targetlist.txt。

analysis.conf文件制作:

用记事本新建一个文件,输入下面内容:

SOURCEFORMAT = HTK               #指定输入语音文件的搁置
       TARGETKIND = MFCC_0_D_A       #定义提取神马样的特征参数,这里定义的是12个MFCC系数,1个nullMFCC系数c0,13个一阶MFCC系数,13个二阶MFCC系数。一共39个。MFCC的有关材料 百度既可。
      WINDOWSIZE = 250000.0            #定义帧长
      TARGETRATE = 100000.0             #定义取帧时的滑动长度

NUMCEPS = 12                            #定义取到的MFCC首系数的个数。上边的12就来源于此。
      USEHAMMING = T                        #定义取帧时用到的窗函数。这里定义使用汉宁窗。
      PREEMCOEF = 0.97                      #定义预加重系数,
      NUMCHANS = 26                         #定义美尔频谱的频道数量
      CEPLIFTER = 22                          #定义倒谱所用到的滤波器组内滤波器个数。

将此文件保存为analysis.conf即可。

然后制作targetlist.txt文件。

用记事本新建一个文件,输入下面内容:

yes_00.sig yes_00.mfcc
       yes_01.sig yes_01.mfcc
       yes_02.sig yes_02.mfcc
       yes_03.sig yes_03.mfcc
       yes_04.sig yes_04.mfcc
       yes_05.sig yes_05.mfcc
       yes_06.sig yes_06.mfcc
       yes_07.sig yes_07.mfcc
       yes_08.sig yes_08.mfcc
       yes_09.sig yes_09.mfcc
       yes_10.sig yes_10.mfcc

no_00.sig no_00.mfcc
       no_01.sig no_01.mfcc
       no_02.sig no_02.mfcc
       no_03.sig no_03.mfcc
       no_04.sig no_04.mfcc
       no_05.sig no_05.mfcc
       no_06.sig no_06.mfcc
       no_07.sig no_07.mfcc
       no_08.sig no_08.mfcc
       no_09.sig no_09.mfcc
       no_10.sig no_10.mfcc

保存为targetlist.txt即可。这里指定了语音文件以及其输出文件*.mfcc的名字。

完成上面两个文件后,运行如下命令:

Hcopy -A -D -C  analysis.conf -S targetlist.txt

回车,如果没有错误的话,在当前文件夹(HSLab和Hcopy运行的文件夹)下,应该有*.mfcc文件出现。此步骤不容易出错,一般都会成功。

9.得到了特征参数,就该对每一个标记过的识别基元分别建立HMM模型,我们在1至6步中,共标记了3个识别基本元,分别是:sil,yes,no。那么我们需要建立3个HMM模型,这里还是要用到文本编辑器。

下面我们建立sil的HMM模型,打开记事本,输入以下内容:(#号后面是我加入的注释,使用的时候最好去掉)

~o <VecSize> 39 <MFCC_0_D_A>  #定义输入特征参数的维书
~h "sil"              # 定义模型名字,这里是给识别基本元sil定义的,所以需要“”内为sil
<BeginHMM>      #开始HMM参数的设置,
<NumStates> 6  #定义隐含状态数
<State> 2         #状态1为空,我们从状态2开始定义
<Mean> 39        #连续HMM中的均值向量的定义
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 
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 
<Variance> 39   #连续HMM中的方差向量的定义
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 3
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 4
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 5
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<TransP> 6                     #转移概率矩阵的定义。
0.0 0.5 0.5 0.0 0.0 0.0 
0.0 0.4 0.3 0.3 0.0 0.0 
0.0 0.0 0.4 0.3 0.3 0.0 
0.0 0.0 0.0 0.4 0.3 0.3 
0.0 0.0 0.0 0.0 0.5 0.5 
0.0 0.0 0.0 0.0 0.0 0.0
<EndHMM>

保存为hmm_no即可。注意,这里没有后缀。有人可能有疑问,HMM不是应该有个 状态转移矩阵A,观测概率矩阵B么?怎么这里不见观测概率矩阵B呢? 答:有状态转移矩阵的是离散HMM(DHMM),这里用的是连续型HMM(CHMM),连续性HMM的参数为:1.状态转移矩阵A,和高斯分布里用到的均值和方差,这里上面的HMM模型中都有定义。具体可查阅:www.zhaomingming.cn,里面论文《语音识别系统中特征提取和声学建模的研究》里有关于HMM的详细资料,可供查阅。

好了,观察状态转移矩阵,a11=0,a12=0.5,a13=0.5,a1x=0(x = 4,5,6),这说明由状态1到自身的转移概率为0,到状态2的转移概率为0.5,到状态3的转移概率为0.5,到状态4,5,6的状态转移概率为0。其他行数据以此类推,由此我们便知道此HMM模型的拓扑结构,当然你也可以修改拓扑结构来试图改善识别系统性能。

然后,以此方法建立yes和no的HMM模型,我们保持拓扑结构无变化。新建一个文本文件,输入如下内容:

~o <VecSize> 39 <MFCC_0_D_A>
~h "no"
<BeginHMM>
<NumStates> 6
<State> 2
<Mean> 39     #连续型HMM中的均值向量的定义
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 
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 
<Variance> 39  #连续型HMM中的方差向量的定义
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 3
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 4
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 5
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<TransP> 6                 #转移概率矩阵的定义。
0.0 0.5 0.5 0.0 0.0 0.0 
0.0 0.4 0.3 0.3 0.0 0.0 
0.0 0.0 0.4 0.3 0.3 0.0 
0.0 0.0 0.0 0.4 0.3 0.3 
0.0 0.0 0.0 0.0 0.5 0.5 
0.0 0.0 0.0 0.0 0.0 0.0
<EndHMM>

保存为hmm_no,注意无后缀。新建文本文件,输入如下内容:

~o <VecSize> 39 <MFCC_0_D_A>
~h "yes"
<BeginHMM>
<NumStates> 6
<State> 2
<Mean> 39     #连续型HMM中的均值向量的定义
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 
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 
<Variance> 39  #连续型HMM中的方差向量的定义
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 3
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 4
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 5
<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 
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 
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<TransP> 6                 #转移概率矩阵的定义。
0.0 0.5 0.5 0.0 0.0 0.0 
0.0 0.4 0.3 0.3 0.0 0.0 
0.0 0.0 0.4 0.3 0.3 0.0 
0.0 0.0 0.0 0.4 0.3 0.3 
0.0 0.0 0.0 0.0 0.5 0.5 
0.0 0.0 0.0 0.0 0.0 0.0
<EndHMM>

保存为hmm_yes,同样无后缀。

关于HMM定义的更多知识,你可以参考htkbook.pdf英文资料,里面介绍的非常详细。

9.对模型初始化。本步是难点,因为我在实验中总是出错,苦恼了几个小时才解决的问题。使用到命令为Hinit和HCompv,使用到文件为:trainlist.txt(第8步中生成的mfcc文件列表),HMM定义文件(hmm_sil,hmm_yes,hmm_no),标签文件夹label_dir(第7步中制作),我们先准备trainlist.txt文件,将如下内容保存为trainlist.txt即可。

yes_00.mfcc
yes_01.mfcc
yes_02.mfcc
yes_03.mfcc
yes_04.mfcc

yes_06.mfcc
yes_07.mfcc
yes_08.mfcc
yes_09.mfcc
yes_10.mfcc

no_00.mfcc
no_01.mfcc
no_02.mfcc
no_03.mfcc
no_04.mfcc
no_05.mfcc

no_07.mfcc
no_08.mfcc
no_09.mfcc

你可能会发现,我的列表中文件不全,没有yes_05.mfcc,没有no_06.mfcc,这是因为加上这两个文件后,在初始化的过程中会报错,我就把它去掉了,读者可以全都写上,然后有报错的时候再去掉,然后重新生成mfcc文件即可。我在刚开始的时候,不知道是错在这里了,经过几个小时摸索才知道可以这样的,问题应该出在做标记的时候,可能有重合之类的错误了,另外所用MFCC文件不能太少,太少也会报错。另外要准备一个文件夹hmm0,在当前目录下新建一个即可。trainlist.txt保存在当前文件夹下,然后运行如下命令:

HInit -A -D -T 1 -S trainlist.txt -M hmm0 -H hmm_yes -l yes -L label_dir yes 回车
    HInit -A -D -T 1 -S trainlist.txt -M hmm0 -H hmm_no  -l no  -L label_dir no  回车
    HInit -A -D -T 1 -S trainlist.txt -M hmm0 -H hmm_sil   -l sil   -L label_dir sil 回车

实现分别对三个模型hmm_yes,hmm_no,hmm_sil进行初始化。初始化成功后,初始化了的三个模型便被保存在了hmm0文件夹中。

这里几个参数比较难懂,需要解释一下:

-A -D -T 1 等参数,是显示命令本身,显示设定变量等功能,读者可以在命令行直接输入HInit回车,便可看到清晰的解释,-M 后跟一个文件夹,这个文件夹用来存放初始化后的hmm文件,也就是输出文件夹,这里我们采用hmm0文件夹;-H后跟hmm模型文件,比如hmm_yes;-l后是制定此HMM模型对应的标签,这里hmm_yes对应的当然是yes了,还记得嘛,我们很辛苦做的标签呢,当然如果你错写成no了,就会按照no标签所指定的语音参数来初始化hmm_yes了,很影响训练;-L 后写上lab标签文件所在文件夹,我们已经把所有lab文件存在了label_dir文件夹下,所以这里我们写上label_dir;最后一个参数是

其实到这里,初始化已经完成了,由于后面需要文件vFloors来对HMM进行训练,所以还要使用Hcompv来进行一次训练,以得到此文件,建立文件夹hmm0flat,运行如下命令即可:

Hcompv -A -D -T 1 -S trainlist.txt -M hmm0flat -H hmm_yes -f 0.01 yes

运行后在hmm0flat文件夹中有vFloors文件。复制到当前文件夹中。

10.初始化成功后,就可以进行训练了,想到训练完成后,就离识别不远了,开心呀,新建hmm1,hmm2,hmm3三个文件夹,分别保存三次训练的结果。

a.训练模型hmm_yes,运行如下命令:

HRest -A -D -T 1 -S trainlist.txt -M hmm1 -H vFloors -H hmm0\hmm_yes -l yes -L label_dir yes 回车,实现对模型yes的第一次迭代优化,使用如下命令进行第二次:

HRest -A -D -T 1 -S trainlist.txt -M hmm2 -H vFloors -H hmm1\hmm_yes -l yes -L label_dir yes 回车,实

现对模型yes的第二次迭代优化,使用如下命令进行第三次:

HRest -A -D -T 1 -S trainlist.txt -M hmm3 -H vFloors -H hmm2\hmm_yes -l yes -L label_dir yes 回车。

我们就完成了对模型hmm_yes的训练,并保存在了hmm3文件夹中。

b.训练模型hmm_no,运行如下命令:

HRest -A -D -T 1 -S trainlist.txt -M hmm1 -H vFloors -H hmm0\hmm_no -l no -L label_dir no 回车,实现对模型no的第一次迭代优化,使用如下命令进行第二次:

HRest -A -D -T 1 -S trainlist.txt -M hmm2 -H vFloors -H hmm1\hmm_no -l no -L label_dir no 回车,实

现对模型no的第二次迭代优化,使用如下命令进行第三次:

HRest -A -D -T 1 -S trainlist.txt -M hmm3 -H vFloors -H hmm2\hmm_no -l no -L label_dir no 回车。

我们就完成了对模型hmm_no的训练,并保存在了hmm3文件夹中。

c.训练模型hmm_sil,运行如下命令:

HRest -A -D -T 1 -S trainlist.txt -M hmm1 -H vFloors -H hmm0\hmm_sil -l sil -L label_dir sil 回车,实现对模型sil的第一次迭代优化,使用如下命令进行第二次:

HRest -A -D -T 1 -S trainlist.txt -M hmm2 -H vFloors -H hmm1\hmm_sil -l sil -L label_dir sil 回车,实

现对模型sil的第二次迭代优化,使用如下命令进行第三次:

HRest -A -D -T 1 -S trainlist.txt -M hmm3 -H vFloors -H hmm2\hmm_sil -l sil -L label_dir sil 回车。

我们就完成了对模型hmm_sil的训练,并保存在了hmm3文件夹中。

训练完成。

11.现在离识别只差一步了,嘿嘿,继续跟着我做。建立句法文件gram.txt,文件内容如下:

$WORD = YES | NO;

( { START_SIL } [ $WORD ] { END_SIL } )

将上面内容保存为gram.txt即可,因我们只识别一个单词,yes 或者 no 这里就定义了一个单词加上前后两个静音。

建立词典文件,输入以下内容:

YES       [yes]  yes 
    NO        [no]   no 
    START_SIL [sil]  sil 
    END_SIL   [sil]  sil

保存为 dict.txt文件即可。这里将句法中的YES,输出为[yes],定义对应模型为yes。NO的输出设置为no,对应模型设置为no,把句法中的START_SIL和END_SIL设置为相同的参数,如文件中。此文件复制过去后,可能有看不到的不标准字符,需要你把复制过去的空格去掉再输入一次。这样后面才不会报错。

然后用如下命令将句法文件gram.txt编译成网络:

HParse -A -D -T 1 gram.txt net.slf

用如下命令查字典文件中的错误:

HSGen -A -D -n 10 -s net.slf dict.txt

12.识别。准备文件hmmlist.txt,其内容为:

yes

no

sil

保存起来。

建立文件input.mfcc(使用1至8步生成一个待识别的MFCC文件),或者可以直接使用yes_xx.mfcc来做试验。使用命令:

HVite -A -D -T 1 -H hmm3\hmm_yes -H hmm3\hmm_no -H hmm3\hmm_sil -I reco.mlf -w net.slf dict.txt hmmlist.txt input.mfcc

然后记事本打开reco.mlf,便可看到识别结果。如果提示错误,没有reco.mlf文件,不仿自己先用记事本创建一个空的reco.mlf文件。

这里,我们的HMM模型一共有3个,所以分别写在-H后面的办法来使用,如果有更多的HMM模型,我们就不能这样写了,采用如下的命令格式:

HVite -A -D -T 1 -C directin.conf -g -H hmmsdef.mmf -w net.slf dict.txt hmmlist.txt input.mfcc

这里采用的是用一个后缀为mmf的主宏文件,它是由所有HMM模型文件写在一起的文件,比如,本文的3个模型就可以用如下方法来写一个主宏文件:

~o
<STREAMINFO> 1 39
<VECSIZE> 39<NULLD><MFCC_D_A_0><DIAGC>
~h "yes"
<BEGINHMM>
<NUMSTATES> 6
<STATE> 2
<MEAN> 39
 -5.560295e+000 2.467809e+000 7.543131e+000 1.205044e+000 -4.135031e+000 -6.866978e+000 -5.575079e+000 -7.244508e+000 -1.268335e+000 -1.334227e+001 -7.667554e-001 -8.828279e+000 6.305791e+001 7.854634e-001 2.438530e-001 3.313011e+000 -3.466940e-001 -2.613595e+000 -8.357538e-001 -2.488270e+000 -1.450052e+000 -8.162269e-001 -3.785841e-001 1.109608e+000 5.292199e-001 1.529532e+000 -3.840135e-001 -8.552541e-001 -2.642866e-001 -3.238665e-001 -5.276523e-001 -2.526920e-001 7.280868e-001 6.604324e-001 8.749401e-003 7.164187e-001 9.475101e-001 2.887047e-001 1.034154e-001
<VARIANCE> 39
 1.916909e+000 1.275584e+000 1.570780e+001 1.017245e+001 1.858337e+001 9.255550e+000 1.450472e+001 1.307447e+001 2.623391e+000 1.230408e+001 1.331315e+001 4.139080e+000 2.996713e+000 9.076914e-001 2.256964e+000 1.108444e+000 1.335223e+000 2.852070e+000 9.947189e-001 2.889097e+000 1.765044e+000 1.063393e+000 3.417341e+000 3.719466e+000 5.576853e-001 1.023817e-001 3.800316e-002 1.323943e-001 4.085928e-001 1.282977e-001 3.773029e-001 1.206995e-001 4.023054e-001 5.749762e-001 2.383080e-001 2.696266e-001 1.599966e-001 7.087921e-002 1.833246e-002
<GCONST> 7.612393e+001
<STATE> 3
<MEAN> 39
 -5.913797e+000 -4.365698e+000 1.418108e+001 -2.059599e+000 -1.814819e+001 -1.289064e+001 -6.513318e+000 -3.953842e+000 -4.892762e+000 -9.960979e+000 1.200297e+001 -5.096629e+000 6.967976e+001 -8.951111e-002 -1.443667e+000 -5.611101e-001 -4.399965e-001 -1.252340e+000 -1.240768e+000 3.258628e-001 2.167057e+000 -9.489894e-003 3.286855e-001 1.564566e+000 3.079422e-001 1.067209e+000 -1.662790e-002 1.044778e-001 -6.624178e-001 1.790552e-001 7.852477e-001 2.394754e-001 5.346865e-002 2.446395e-001 3.382760e-001 -2.959084e-001 -7.234101e-001 -2.515628e-001 -1.593625e-001
<VARIANCE> 39
 7.674729e+000 1.099033e+001 3.380254e+001 1.551273e+001 2.867217e+001 3.369737e+001 2.960959e+001 3.642490e+001 9.700713e+000 4.140916e+001 2.213822e+001 9.767385e+000 6.958179e+000 3.083268e-001 6.326413e-001 3.035761e+000 5.464101e-001 2.184300e+000 1.462005e+000 1.122333e+000 2.576114e+000 1.494235e+000 1.869450e+000 3.093436e+000 1.007256e+000 1.697933e-001 4.649463e-002 1.108574e-001 3.745079e-001 1.442188e-001 5.264582e-002 2.815477e-001 4.614286e-001 6.650322e-001 1.773610e-001 3.494999e-001 3.648607e-001 7.041881e-002 1.702319e-002
<GCONST> 8.693305e+001
<STATE> 4
<MEAN> 39
 -2.626779e+000 -1.006746e+001 1.324205e-001 -1.022190e+000 -1.017110e+001 -1.316895e+001 -4.377057e+000 6.441502e+000 4.007662e+000 -1.092647e+001 3.295897e+000 -1.090154e+001 7.284025e+001 1.593065e-001 1.247510e-001 -6.647451e-001 -1.154858e-001 6.535580e-001 1.681931e-001 1.093640e-001 9.567864e-002 2.888749e-001 4.096415e-001 -7.456395e-001 -4.928815e-001 -9.982761e-002 -7.972100e-002 1.492678e-001 5.516066e-002 -5.567876e-002 -2.232025e-003 -3.899807e-002 3.854467e-002 -6.564865e-002 -9.385724e-002 1.078040e-001 1.624756e-002 -2.174711e-002 -8.576453e-002
<VARIANCE> 39
 8.935842e+000 7.884045e+000 3.016536e+001 1.194977e+001 3.394068e+001 2.145726e+001 2.136157e+001 2.488684e+001 3.243732e+001 3.988887e+001 3.037219e+001 3.554942e+001 5.147613e+000 3.835949e-001 1.038611e+000 8.506106e-001 7.902109e-001 1.016173e+000 9.543892e-001 9.757534e-001 1.079207e+000 1.683750e+000 1.916537e+000 1.528188e+000 1.036401e+000 4.216504e-001 7.934329e-002 8.315724e-002 1.019701e-001 1.249232e-001 1.832933e-001 1.500916e-001 1.140296e-001 2.434811e-001 1.929354e-001 2.184601e-001 2.573351e-001 2.200356e-001 4.097395e-002
<GCONST> 8.415180e+001
<STATE> 5
<MEAN> 39
 -1.722915e+001 1.558756e+000 -6.352075e+000 -6.810540e+000 1.793851e+000 -7.542542e+000 1.001723e-001 8.047865e+000 1.059246e+000 -4.345902e+000 6.177027e-001 -1.362520e+001 6.509851e+001 -7.531838e-001 1.548218e-001 -2.277896e-001 -9.475082e-003 3.130113e-001 3.282159e-001 3.640014e-001 2.064544e-002 -7.544725e-002 -3.198811e-001 1.626379e-001 2.603270e-001 -4.557977e-001 1.115186e-001 -1.498197e-001 1.851567e-002 5.462770e-002 -6.049009e-002 4.086701e-002 -2.223603e-002 -7.436965e-002 7.085064e-002 -7.081138e-002 5.539847e-002 6.386208e-002 3.100476e-002
<VARIANCE> 39
 3.333078e+001 1.038335e+001 1.133323e+001 1.084346e+001 2.765559e+001 2.805067e+001 1.805031e+001 1.112923e+001 2.524041e+001 3.597572e+001 1.953421e+001 2.732470e+001 8.838473e+000 2.207273e+000 1.359541e+000 6.254531e-001 1.171842e+000 1.435330e+000 1.533987e+000 1.270733e+000 1.416954e+000 1.234814e+000 1.864773e+000 1.155947e+000 1.679582e+000 6.852837e-002 1.702434e-001 7.857703e-002 1.419667e-001 2.462802e-001 2.167625e-001 2.748685e-001 2.915890e-001 1.961887e-001 2.904242e-001 3.673494e-001 2.553481e-001 2.479914e-001 2.185772e-002
<GCONST> 8.837502e+001
<TRANSP> 6
 0.000000e+000 1.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
 0.000000e+000 7.142819e-001 2.857181e-001 0.000000e+000 0.000000e+000 0.000000e+000
 0.000000e+000 0.000000e+000 8.185092e-001 1.814908e-001 0.000000e+000 0.000000e+000
 0.000000e+000 0.000000e+000 0.000000e+000 9.493426e-001 5.065738e-002 0.000000e+000
 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 9.480510e-001 5.194894e-002
 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>

~h "sil"
<BEGINHMM>
<NUMSTATES> 6
<STATE> 2
<MEAN> 39
 -1.205055e+001 -6.071544e+000 -4.953431e+000 -2.086219e+000 -7.696532e-001 -6.180044e+000 4.428514e+000 4.089669e-001 7.677385e-001 -6.506588e+000 8.637049e-001 -8.133173e+000 5.893624e+001 1.028111e-001 -2.095059e-001 4.930916e-002 1.026503e-001 -7.224108e-002 -2.562836e-002 -1.078459e-002 -3.646078e-001 -2.352235e-003 6.649423e-002 -2.300011e-001 -1.368367e-001 -4.435970e-002 -4.705233e-002 2.732716e-002 -4.914735e-002 -5.064989e-002 2.004289e-002 4.518612e-002 1.482240e-001 8.472140e-002 8.018477e-002 6.218801e-002 -4.590823e-002 -1.713296e-001 2.698532e-003
<VARIANCE> 39
 9.995130e+000 1.285863e+001 2.555799e+001 2.054044e+001 9.829945e+000 1.024835e+001 1.871873e+001 2.378679e+001 1.472677e+001 1.326252e+001 1.081685e+001 1.696764e+001 2.495445e+000 2.721120e-001 3.311672e-001 9.093692e-001 1.297935e+000 9.627227e-001 7.321044e-001 1.502767e+000 2.155972e+000 1.592869e+000 1.370266e+000 1.524849e+000 1.053926e+000 1.374337e-001 4.785442e-002 8.618005e-002 2.562610e-001 3.408333e-001 2.088208e-001 1.607134e-001 3.452048e-001 4.799360e-001 2.922609e-001 2.281612e-001 2.726102e-001 2.110895e-001 2.339070e-002
<GCONST> 8.032516e+001
<STATE> 3
<MEAN> 39
 -1.814091e+001 2.663553e+000 -4.914350e+000 -2.317764e+000 3.008735e+000 -1.087707e+000 1.287625e+000 6.091899e+000 2.862558e+000 -9.924241e+000 1.373552e+000 -8.071694e+000 6.348404e+001 3.318730e-001 -5.278828e-001 -9.494247e-002 -1.499072e-001 -3.174666e-001 -2.823065e-001 6.108246e-002 -1.983474e-001 4.261266e-002 3.537025e-001 4.446607e-002 -2.076580e-001 -2.741475e-001 6.894246e-002 -3.391993e-002 -1.667663e-002 4.350851e-003 -1.227802e-001 -1.186949e-001 2.493934e-002 -8.243520e-003 -3.572219e-003 5.363566e-002 -2.770266e-003 2.467832e-002 1.546283e-002
<VARIANCE> 39
 1.741966e+001 9.769640e+000 7.445446e+000 3.836594e+000 5.780912e+000 1.168015e+001 4.097112e+000 1.824830e+001 7.713724e+000 1.395045e+001 1.004712e+001 8.168225e+000 2.396237e+000 3.433821e-001 2.388967e-001 5.241452e-001 3.407781e-001 8.314158e-001 5.915961e-001 3.974668e-001 9.651667e-001 1.279390e+000 1.831751e+000 8.403545e-001 1.283583e+000 3.289731e-002 2.251048e-002 3.344000e-002 5.462619e-002 4.896105e-002 9.426531e-002 7.631385e-002 1.575904e-001 1.856415e-001 2.600564e-001 3.332623e-001 1.524348e-001 2.639678e-001 1.144448e-002
<GCONST> 5.856438e+001
<STATE> 4
<MEAN> 39
 -1.248727e+001 -7.260995e+000 -6.642402e+000 -2.322764e+000 -1.222477e+000 -5.968217e+000 6.963343e+000 1.038801e+000 2.325013e+000 -5.088502e+000 1.184449e+000 -8.760984e+000 5.800127e+001 4.907846e-002 1.306961e-003 -3.865775e-002 1.567145e-002 6.507996e-002 4.037856e-002 3.564140e-002 -1.379082e-002 4.384908e-002 1.433475e-003 5.116213e-002 -1.162575e-002 -2.618222e-002 8.161297e-003 3.528028e-002 3.151031e-002 1.165633e-002 1.063840e-002 -7.419401e-003 -4.056268e-002 -2.333735e-002 -1.917983e-002 -3.858940e-002 -9.163742e-003 1.074605e-002 1.217738e-002
<VARIANCE> 39
 1.636021e+000 2.962028e+000 4.243609e+000 5.675200e+000 6.495543e+000 9.003530e+000 8.768224e+000 9.354281e+000 1.236154e+001 1.266188e+001 1.303056e+001 9.000397e+000 4.370964e-001 1.208583e-001 2.222505e-001 3.274788e-001 4.198043e-001 5.608954e-001 7.269357e-001 9.016341e-001 8.214277e-001 1.080170e+000 1.237950e+000 1.379923e+000 8.003727e-001 3.261130e-002 3.120635e-002 6.066960e-002 6.583845e-002 6.907440e-002 1.138000e-001 1.205961e-001 1.915481e-001 1.594258e-001 2.234952e-001 2.459052e-001 3.115267e-001 1.641423e-001 6.802158e-003
<GCONST> 5.376580e+001
<STATE> 5
<MEAN> 39
 -7.860916e+000 -5.552484e+000 -4.901682e+000 -7.598982e+000 -4.282944e+000 -3.838386e+000 -6.697090e+000 -2.647323e+000 7.187539e+000 -8.239985e+000 1.202350e+000 -1.147782e+001 6.722357e+001 5.913837e-001 7.170141e-001 7.908542e-001 -2.591267e-001 -1.913313e-001 4.859999e-001 -1.239970e+000 -5.252860e-001 -2.478153e-001 -6.614624e-001 1.068146e-001 -1.770269e-001 6.459577e-001 1.310726e-001 1.197230e-001 3.162154e-001 8.112387e-002 -1.617024e-002 9.388867e-002 -1.802869e-001 -2.021954e-001 -1.142057e-001 -1.215021e-001 -2.550250e-002 9.946529e-002 7.361362e-002
<VARIANCE> 39
 1.016246e+001 1.689860e+001 1.697070e+001 7.355496e+001 1.682707e+001 3.573024e+001 1.405454e+002 2.217239e+001 3.946589e+001 1.374710e+001 3.769558e+001 2.095991e+001 6.122581e+001 9.523191e-001 2.348769e+000 3.175460e+000 1.866060e+000 1.131489e+000 1.451207e+000 4.070387e+000 2.776337e+000 1.532084e+000 2.172313e+000 2.741962e+000 1.458419e+000 6.819526e-001 7.628198e-002 1.794787e-001 2.118285e-001 1.426576e-001 2.539506e-001 2.432116e-001 6.223864e-001 4.009807e-001 1.190235e-001 2.711118e-001 4.121704e-001 2.268752e-001 1.015960e-001
<GCONST> 1.031369e+002
<TRANSP> 6
 0.000000e+000 9.230768e-001 7.692318e-002 0.000000e+000 0.000000e+000 0.000000e+000
 0.000000e+000 7.490159e-001 2.091535e-002 2.300688e-001 0.000000e+000 0.000000e+000
 0.000000e+000 0.000000e+000 8.947203e-001 5.041008e-002 5.486963e-002 0.000000e+000
 0.000000e+000 0.000000e+000 0.000000e+000 9.399282e-001 2.511858e-002 3.495316e-002
 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 8.229873e-001 1.770128e-001
 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>

注意:~o 与 ~h之间的部分只包含一次。这里用的hmm文件是训练好的hmm文件,按照上面的训练步骤,最后得到的HMM文件应该是保存在hmm3文件夹中的。将此内容保存为hmm3.mmf,保存在与direction.conf等文件同一个目录,然后运行如下命令:

HVite -A -D -T 1 -C  directin.conf -g -H hmm3.mmf -w net.slf dict.txt hmmlist.txt yes_03.mfcc

13.交互式识别。12步中的识别较为繁琐,其实这里有个交互式识别的方法。输入如下命令即可:

HVite -A -D -T 1 -C directin.conf -g -H hmm3\hmm_yes -H hmm3\hmm_no -H hmm3\hmm_sil -w net.slf dict.txt hmmlist.txt

或者HVite -A -D -T 1 -C directin.conf -g -H hmm3mmf -w net.slf dict.txt hmmlist.txt

这里需要一个derectin.conf文件,内容如下:

SOURCERATE = 625.0               #=16kHz,采样率   
  SOURCEKIND = HAUDIO
  SOURCEFORMAT = HTK
  
  TARGETKIND = MFCC_0_D_A      #后面是参数格式,制定提取MFCC特征参数的格式,与训练时要保持一致
  WINDOWSIZE = 250000.0
  TARGETRATE = 100000.0
  NUMCEPS = 12
  USEHAMMING = T
  PREEMCOEF = 0.97
  NUMCHANS = 26
  CEPLIFTER = 22
  AUDIOSIG = -1        #指定按键控制交互过程。

使用此命令后,会出现提示符 READY[1]> 表示开始录音,你开始说话(说话内容当然为yes 或者 no,我们模型也只有这么两个 ),说完后,按下回车,停止录音,并显示识别结果,回放录音,然后出现READY[2]>提示符,等待下一个输入信号...如图所示:(http://www.zhaomingming.cn/HTK语音识别/交互式识别.jpg)(将整个超链接复制到地址栏中打开即可)。

14.统计系统识别率和错误率。这个我还没做,等做了就给这部分补上,应该不难。新加命令应该有个与目标数据的对比,统计部分的内容。其他识别命令什么的都已经用过了。

-------------------------------------------------------------------------------

上一篇:[HTML/JS] JQuery 页面滚动回到顶部


下一篇:Java:通过反射复制父类字段到子类。