语音识别工具箱之HTK安装与使用
HTK(HMM Toolkit)一款基于hmm模型的语音处理工具,早就听说它了,一直因为用MATLAB中的工具箱在学习,或自己写代码在做HMM方面的试验,所以没有接触到它。现在,上海朋友家里的网速超赞,我就趁投简历的时间空隙,下载了它的一些资料,包括安装文件,使用文档(最好中英文版都要找到,有时中文版更简洁,更节省时间,英文版则较详细,当发现自己调试不通过时,就有参考了),并做了基本的识别实验。下面会详细记录本次实验的过程。
资料搜集:
HTK官方主页:http://htk.eng.cam.ac.uk/,里面有最新版本的安装文件,有其文档材料htkbook.pdf,当然这是英文版的,中文版的叫HTK基础指南。下载的时候,你需要先注册用户,记住你的密码,后面在其FTP服务器上下载软件的时候需要使用到。
在百度文库中搜索关键字 一个简单的HTK入门参考例子 即可得到一份更简洁的文档;
还有一篇博文需要用到:http://www.cnblogs.com/eboard/archive/2012/02/20/HTK.html。
ps:或许你还需要安装 Active Perl...如果你没有安装的话。。。
好了,我们开始:
我的平台是:windows xp sp3搭配 IBM-42 配置很低很低呀
-------------------------------------------------------------------------------
安装篇
-------------------------------------------------------------------------------
1.下载到HTK-3.4.1.ZIP后,解压,将其中的htk文件夹整个复制到E盘根目录下。
2.将原来htk_htklib_nt.mkf文件中备份,然后修改下列两处,以使其录音软件可在WIN32界面下运行:
HGraf.null.obj改为HGraf_WIN32.obj
HGraf.null.olv改为HGraf_WIN32.olv
3. 开始\运行\cmd 回车
4. 进入 e:\htk 目录。这里用到两条命令: e: 和 cd htk
5.建立文件夹: mk bin.win32
6.运行命令:VCVARS32。如果提示找不到命令,大概解决办法是安装VC++6.0 或者其后版本。然后设置好path变量,后面凡是遇到错误提示:找不到命令的,一般都是VC++6.0没有安装,或者安装了,path变量没有设置好,当然,你也可以在你电脑上找到VCVARS32.EXE,然后复制到当前文件夹。具体请自查。
7.输入如下命令,来编译HTK Library:
cd HTKLib
nmake /f htk_htklib_nt.mkf all
cd ..
8.编译HTK TOOLS ,输入以下命令:
cd HTKTools
nmake /f htk_htktools_nt.mkf all
cd ..
cd HLMLibrary
nmake /f htk_hlmlib_nt.mkf all
cd ..
cd HLMTools
nmake /f htk_hlmtools_nt.mkf all
cd ..
9.编译成功后,打开bin.win32文件夹,会发现刚才6,7步编译结果就存在此文件夹中,如图:(http://www.zhaomingming.cn/HTK语音识别/HTK工具.jpg)所示,其中, 你可以找找有没有这些文件,在使用篇中我们用的到:
HSLab.exe 录音,标记工具
Hcopy.exe 从语音提取特征参数的工具
HInit.exe 和 HCompV.exe 对HMM模型初始化的工具,注意,这里需要对每个模型都要使用此命令进行初始化
HRest.exe 对模型进行迭代训练的工具
HParse.exe 语法转网络的工具,发音转本文用到的。
HSGen.exe 语法查错工具
HVite.exe 解码工具,也就是识别工具。可以用命令行方式使用,也可以用交互方式使用。
其他命令本文将不会用的到。
10.既然安装好了,不妨测试一下安装是否成功,这里需要电脑安装有 ActivePerl,将HTK3.4.1文件夹下HTKDemo文件复制到E:\htk下,然后使用如下命令:
cd HTKDemo
mkdir hmms
cd hmms
mkdir tmp
mkdir hmm.0
mkdir hmm.1
mkdir hmm.2
mkdir hmm.3
cd ..
mkdir proto
mkdir acc
mkdir test
perl runDemo.pl configs\monPlainM1S1.dcf
没有提示错误就看最后一步吧。
11.将e:\htk\bin.win32路径添加到环境变量path中。注销重登录,然后在命令行下输入path回车,找到path中有e:\htk\bin.win32即可。
好了,安装就总结到这里。中间有纰漏的地方,一经发现,会立即更改。
-------------------------------------------------------------------------------
使用篇
-------------------------------------------------------------------------------
这个是重点,呵呵,本部分会讨论到如下内容:
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.统计系统识别率和错误率。这个我还没做,等做了就给这部分补上,应该不难。新加命令应该有个与目标数据的对比,统计部分的内容。其他识别命令什么的都已经用过了。
-------------------------------------------------------------------------------
展望篇
-------------------------------------------------------------------------------
HTK工具的基本使用方法是知道了,那么该如何来建立复杂一点的识别系统呢?因为MFCC可用来作为说话人识别的特征参数,可以先建立一个说话人识别系统,从识别三个人试验开始做实验,看下最终它能识别的人数。然后建立起常用语句的识别系统,这个要选择好的音素,刚开始试验可以用三音子,这个工作有两个难点:1.语音库的整理;2,标注。都很需要细致和耐心。当然坚持到最后,相信付出会有回报的,一个连续语音识别系统建立起来了。然后你自己可以试验其他音素,验证其他特征,以获得较高的识别率。另外,利用HTK貌似只能建立起声纹识别系统,因为其字典貌似很死板,起不到语言学识别的作用,那么该怎么办呢?如何才能做一个大规模汉语连续语音识别系统?语言学方面二元文法可以是个方向,虽然有人做过,头一次做的话,“山寨”一下也可以。哦,用算法,不能算山寨吧,嘿嘿。
感慨一句,感性认识中,概率的方法做识别,性能肯定好不了。因为它只是个概率呀,肯定达不到100%。但现实中,计算不复杂,识别率较高的实际应用系统,都是用的概率方法。