Htk实验笔记史上最完整版.docx
《Htk实验笔记史上最完整版.docx》由会员分享,可在线阅读,更多相关《Htk实验笔记史上最完整版.docx(73页珍藏版)》请在冰点文库上搜索。
![Htk实验笔记史上最完整版.docx](https://file1.bingdoc.com/fileroot1/2023-7/27/1e51849d-4480-4f23-8522-7c1beff09726/1e51849d-4480-4f23-8522-7c1beff097261.gif)
Htk实验笔记史上最完整版
Htk实验笔记——YesOrNo孤立词识别(史上最完整版哦)
[摘要:
本试验中,我们将基于HTK对象散设立建设一个2-单词辨认体系,辞汇散是{Yes,No}。
那是能够计划出去的最根基的主动语音辨认(Automaticspeechrecognition,ASR)体系。
方针:
设立建设一个伶仃词识]
本实验中,我们将基于HTK工具集建立一个2-单词识别系统,词汇集是{Yes,No}。
这是可以设计出来的最基本的自动语音识别(Automaticspeechrecognition,ASR)系统。
目标:
建立一个孤立词识别系统,只包含yes和no两个词。
步骤:
A:
创建一个语料库,确定识别基本元(如单词yes,no等),yes和no各录5次
B:
声学分析,把waveform的声音文件转换为mfcc()格式 ,即对语音材料库中的声音文件提取MFCC声纹特征 (梅尔频率倒谱系数,这个部分的详解见教程10)。
C:
模型定义:
为词典里的每一个词(基本元)建立一个HMM原型
D:
模型训练:
HMM模型初始化和迭代,利用MFCC声纹特征对每一个HMM模型进行训练,使模型参数与其描述的识别基本元对应。
E:
问题定义,即语法定义,定义输入语音的语法规则等,从发音对应到文字。
F:
对测试集合进行识别
G:
评测
使用的教程:
1. HTK(V3.1)基础指南中文版
2. 语音识别工具箱之HTK安装与使用
3. 语音识别系统之htk------孤立词识别(yesno)
4. HTK(yesno)教程
5. HTK孤立词识别回顾
6. 一个简单的HTK入门参考例子
7. 利用HTK工具包快速建立一个语音命令识别系统
8. Windows安装HTK3.4.1语音识别工具(这里有HSLab运行失败的原因)
9. Htkerrorbook
10.UNDERSTANDINGHTKERRORMESSAGES
11.htk源码
12. 语音信号处理之(四)梅尔频率倒谱系数(MFCC)
特别记录一下该博客,里面有大量语音方面的学习资料。
一. 准备工作——预先建立文件夹
我在htk目录下建立了work文件夹,今后所有的实验都放在这个文件夹中。
在该文件夹中建立YesNo文件夹用于存放本实验的所有文件和数据。
YesNo文件夹中的结构如下:
(1)data/:
存储训练和测试数据(语音信号、标签等等),包括一个子目录data/train,而train包括2个子目录,data/train/sig(用以存储步骤1接下来录制的训练语音数据) 和data/train/mfcc(用来存储步骤二中训练数据转化后的mfcc参数);
(2)model/:
存储识别系统的模型(HMMs)的相关文件;
(3)def/:
存储任务定义的相关文件;
(4)test/:
存储测试相关文件(我是将测试数据存在此文件夹的没有放在data中)。
在data/下创建data/train/sig、data/train/lab、data/train/mfcc文件夹,分别存放采集的语音材料的sig文件、lab(标签)文件和提取的MFCC声纹特征文件。
在model/下创建model/proto、model/hmm0、model/hmm0flat、model/hmm1、model/hmm2、model/hmm3文件夹:
model/proto用于存放模型初始化所需HMM原型定义文件hmm_yes、hmm_no、hmm_sil
model/hmm0用于存放使用HInit命令初始化HMM模型输出的描述结果文件(依然是hmm_yes、hmm_no、hmm_sil)
model/hmm0flat用于存放使用HCompv命令初始化模型时输出的可变基底宏文件vFloors(丢弃使用HCompv初始化模型时产生的hmm_yes、hmm_no、hmm_sil)
model/hmmi为使用HRest命令迭代训练HMM模型时的输出目录,i为表示当前迭代i的索引。
最终单词HMM模型是hmm3/hmm_yes,hmm3/hmm_no,andhmm3/hmm_sil。
在test/下创建test/sig、test/mfcc、test/result文件夹,分别存放测试用的语音材料的sig文件、提取的MFCC声纹特征文件和测试结果文件。
整个目录的结构我将在本文最后给出。
二. 创建语料库
首先我们需要录音以采集足够的语音数据,对于“yes、no”这两个命令都需要录一些相应的语音样本,同时也需要对录下的语音做一些简单的标注。
录音和标注可以采用HTK工具包中的HSLab来完成。
这里我们采集YES和NO两个单词。
在命令行下进入HTK/work/YesNo/data/train/sig文件夹(sig语言文件保存在该目录中),输入:
HSLab yes.sig回车
(该命令用于使用HSLab工具打开所在目录的yes.sig文件,如果没有该文件,则在该目录中新建该文件,这里使用该命令打开HSLab图形化界面,录制yes.sig)
这一步可能会遇到如下问题:
报错:
“ERROR[+6870] MakeXGraf:
NotcompiledwithX11support:
useHGraf.X.cFATALERROR-Terminatingpro”
解决办法:
-1、这需要修改HTKLib文件夹下的htk_htklib_nt.mkf文件,共有两处需要修改:
将文件中的HGraf.null.obj替换为HGraf_WIN32.obj、HGraf.null.olv替换为HGraf_WIN32.olv;
-2、然后在cmd命令行中重新编译HTKLib文件夹下的htk_htklib_nt.mkf;
-3、检查HTKTools文件夹下的Make文件,如果有"-lX11"字符的话将其删除,然后在cmd命令行中重新编译HTKTools文件夹下的htk_htktools_nt.mkf文件;
(需要将bin.win32文件夹的路径加入到环境变量中)
原因:
默认情况下HSLab工具使用的是x11做的图形界面接口,windows不支持,所以需要修改一下生成文件,使用windowsGUI。
重新执行HSLab yes.sig回车,一个用于录音的对话框就会出现。
如图:
下面我们开始录音。
录音环境自己控制哈。
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_01.sig,将yes_0.lab重命名为yes_01.lab.至此,我们完成了一个语音材料的录制。
4.点击new按钮(这里不点new的话你会发现lab文件中有N多个标签信息,如果遇到这种情况,你可以删除相应lab文件,重新打开sig文件贴标签),会发现new按钮旁边的set[0]变为set[1]了。
然后依照1,2,3步,新建下一条语音材料,这时HSLab自动保存的文件名为,yes_1.sig,yes_1.lab,将其命名为yes_02.sig和yes_02.lab即可。
5.再执行9次第4步,得到yes_03,yes_04...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文件夹中。
以方便后面训练操作。
我们可以打开一个.lab文件看一下它的结构。
如下记录了sig文件各标签的起止信息(如果你打开文件不是这样,而是有很多的标签,也许你在打标签的过程中出现了问题)。
三. 声学分析
语音识别系统并不直接在语音信号上进行识别,而是先要进行特征提取,包括分帧,加窗,求取频谱及倒谱,这样确保提取出的特征更加紧凑并尽可能多的保留语音内容的信息。
HTK中负责提取特征的是HCopy工具,它将wav格式的语音文件转化为包含若干特征
矢量的特征文件。
具体命令如下:
Hcopy-A-D-Ctest/analysis.conf -Sdef/targetlist.txt
使用该命令前,首先需要完成两个配置文件的编写(用记事本编写即可)。
1) analysis.conf为抽取参数配置文件,用于对特征提取过程中的参数进行配置,如命令所示保存在test文件夹下。
内容如下:
SOURCEFORMAT=HTK #指定输入语音文件的搁置
TARGETKIND=MFCC_0_D_A #定义提取什么样的特征参数,这里定义的是12个MFCC系数,1个nullMFCC系数c0,13个一阶MFCC系数,13个二阶MFCC系数。
一共39个。
MFCC的有关材料XX既可。
WINDOWSIZE=250000.0 #定义帧长
TARGETRATE=100000.0 #定义取帧时的滑动长度
NUMCEPS=12 #定义取到的MFCC首系数的个数。
上边的12就来源于此。
USEHAMMING=T #定义取帧时用到的窗函数。
这里定义使用汉宁窗。
PREEMCOEF=0.97 #定义预加重系数,
NUMCHANS=26 #定义美尔频谱的频道数量
CEPLIFTER=22 #定义倒谱所用到的滤波器组内滤波器个数。
其中#后代表注释,参数意义以后详细说(该文件可以有注释)。
2)targetlist.txt为源/目的列表文件,用以说明抽取源文件(**.sig)的路径和目标文件(**.mfcc)的保存路径,内容如下:
data/train/sig/yes_01.sigdata/train/mfcc/yes_01.mfcc
data/train/sig/yes_02.sigdata/train/mfcc/yes_02.mfcc
data/train/sig/yes_03.sigdata/train/mfcc/yes_03.mfcc
data/train/sig/yes_04.sigdata/train/mfcc/yes_04.mfcc
data/train/sig/yes_05.sigdata/train/mfcc/yes_05.mfcc
data/train/sig/no_01.sigdata/train/mfcc/no_01.mfcc
data/train/sig/no_02.sigdata/train/mfcc/no_02.mfcc
data/train/sig/no_03.sigdata/train/mfcc/no_03.mfcc
data/train/sig/no_04.sigdata/train/mfcc/no_04.mfcc
data/train/sig/no_05.sigdata/train/mfcc/no_05.mfcc
这里我只将yes和no的前五条作为抽取的源文件,原先是将10条都作为源文件的,但是有的文件在后面的初始化过程中报错了。
原因可能是在贴标签的时候,标签之间出现了重复,目前我也不是非常清楚。
去掉有问题的文件后,就没有问题了。
由于录音不方便,于是想到将yes和no的前五条作为抽取的源文件,后五条作为测试文件。
于是乎,需要将后五条sig文件存储到test/sig文件中。
读者可以全都写上,然后有报错的时候再去掉,然后重新生成mfcc文件即可。
完成上面两个文件后,运行上述命令Hcopy-A-D-Ctest/analysis.conf -Sdef/targetlist.txt,结果如下图:
屏幕上会输出配置文件中的各个参数。
如果没有错误的话,在data/train/mfcc下,应该有*.mfcc文件出现。
如下图。
此步骤不容易出错,一般都会成功。
至此,特征提取就完成了。
四.HMM模型定义
在model/proto中建立模型初始化所需HMM原型定义文件:
hmm_yes、hmm_no、hmm_sil(注意这三个文件无后缀名,否则会报错,且后面步骤中生成的同名文件也均无后缀名)。
hmm_yes内容如下(注意:
里面不能有注释,使用的时候必须删掉)
~o39 #定义输入特征参数的维书
~h"sil" #定义模型名字,这里是给识别基本元sil定义的,所以需要“”内为sil
#开始HMM参数的设置,
6 #定义隐含状态数
2 #状态1为空,我们从状态2开始定义
39 #连续HMM中的均值向量的定义
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
39 #连续HMM中的方差向量的定义
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
3
39
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
39
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
4
39
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
39
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
5
39
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
0.00.00.00.00.00.00.00.00.00.00.00.00.0
39
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
1.01.01.01.01.01.01.01.01.01.01.01.01.0
6 #转移概率矩阵的定义。
0.00.50.50.00.00.0
0.00.40.30.30.00.0
0.00.00.40.30.30.0
0.00.00.00.40.30.3
0.00.00.00.00.50.5
0.00.00.00.00.00.0
列表3HMM描述文件(原型)
~o39
文件头,给出系数向量大小(这里是39个系数)、系数类型(MFCC_0_D_A)。
~h"yes"(...)
封装对所谓的yes的HMM模型的描述。
6
给出HMM模型的状态总数,包括2个非发散状态1和6。
2
表示对状态2的观察函数的描述。
这里我们使用单一高斯观察函数,带有对角矩阵。
这样的函数完全由一个平均向量和一个变化向量(自相关矩阵的对角元素)。
状态1和6没有描述,他们没有观察函数。
390.00.0(...)0.0(x39)
给出当前观察函数的平均向量(在39维的观察空间中)。
每个元素是强制初始化为0,该文件仅给出HMM模型(它的全局结构)的原型。
这些系数后面将用来训练。
391.01.0(...)1.0(x39)给出当前观察函数的变化向量。
每个元素强制初始化为1.6给出HMM模型的6x6转换矩阵,即:
a11a12a13a14a15a16
a21a22a23a24a25a26
a31a32a33a34a35a36
a41a42a43a44a45a46
a51a52a53a54a55a56
a61a62a63a64a65a66
其中aij表示状态i到j转换的可能性。
Null值说明相应的转换不允许。
其它值进行强制初始化(但是矩阵的每行之和为1):
在训练过程中将被修改。
有人可能有疑问,HMM不是应该有个状态转移矩阵A,观测概率矩阵B么?
怎么这里不见观测概率矩阵B呢?
答:
有状态转移矩阵的是离散HMM(DHMM),这里用的是连续型HMM(CHMM),连续性HMM的参数为:
1.状态转移矩阵A,和高斯分布里用到的均值和方差,这里上面的HMM模型中都有定义。
具体可查阅:
,里面论文《语音识别系统中特征提取和声学建模的研究》里有关于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模型的拓扑结构,当然你也可以修改拓扑结构来试图改善识别系统性能。
我们必须为每个模型生成一个这样的原型。
在我们的例子中,我们要写3个HMM模型原型,即yes、no、sil。
关于HMM描述文件更多详细信息参加H