HTK(V3.1)基础指南(原文:HTK(v.3.1):Basic Tutorial)Nicolas Moreau/02.02.2002陶阳译taoyangxp@江西.南昌2009.6.1目录0HTK简介 (1)1Yes/No识别系统 (1)1.1搭建步骤 (1)1.2工作环境构建 (1)1.3标准HTK工具选项 (1)2创建训练集 (1)2.1录音 (2)2.2标注信号 (2)2.3文件重命名 (2)3声学分析 (2)3.1配置参数 (3)3.2源/目标规范 (3)4HMM定义 (4)5HMM训练 (6)5.1初始化 (6)5.2训练 (8)6任务定义 (8)6.1语法和字典 (8)6.2网络 (9)7识别 (10)8性能测试 (12)8.1主标签文件 (12)8.2错误率 (13)0HTK简介HTK是指隐马尔可夫模型工具箱(Hidden Markov Model Toolkit),由剑桥大学工程系(CUED)研发而成。
该工具箱的目的是搭建使用隐马尔可夫模型(HMMs)。
HTK主要用于语音识别研究(但是HMMs应用范围很广,还有很多其它可能的应用…)HTK由一系列库模块构成,包括C语言形式的可用工具,可自由下载,包括一个完整的文档说明(大约300页),见/。
1Yes/No识别系统本指南中,我们将基于HTK工具集建立一个2-单词识别系统,词汇集是{Yes,No}。
这是可以设计出来的最基本的自动语音识别(ASR)系统。
1.1搭建步骤构建语音识别系统的主要步骤如下:(1)训练库的创建:词汇集中的每个元素进行多次录制,且与相应词汇做好标签;(2)声学分析:训练波形数据转换为一系列系数向量;(3)模型定义:为总词汇集中的每个元素定义一个HMM原型;(4)模型训练:使用训练数据对每个HMM模型进行初始化、训练;(5)任务定义:识别系统的语法(什么可被识别)的定义;(6)未知输入信号识别;(7)评估:识别系统的性能可通过测试数据进行评估。
1.2工作环境构建建议创建如下的目录结构:(1)data/:存储训练和测试数据(语音信号、标签等等),包括2个子目录,data/train/ Array和data/test/,用来区分识别系统的训练数据和评估数据;(2)analysis/:存储声学分析步骤的文件;建立以下目录(3)training/:存储初始化和训练步骤的相关文件;(4)model/:存储识别系统的模型(HMMs)的相关文件;(5)def/:存储任务定义的相关文件;(6)test/:存储测试相关文件。
1.3标准HTK工具选项一些标准选项对每个HTK工具都是通用的。
我们将使用以下一些选项:(1)-A:显示命令行参数;(2)-D:显示配置设置;(3)-T1:显示算法动作的相关信息。
完整的选项列表请参见:HTK文档,第50页(第四章操作环境)。
2创建训练集Array图1录制标签训练数据首先,我们录制Yes和No两个语音信号,作为要训练的单词模型(训练集)。
然后为每个语音信号打上标签,也就是说,关联一个文本来描述语音内容。
录制和打标签,可以使用HSLab HTK工具来做(也可使用其它工具)。
创建和标注语音文件,使用下面的工具命令:HSLab any_name.sig回车之后,该工具的图形界面呈现在面前。
2.1录音按下Rec按钮,开始录制语音信号,Stop停止录音。
缓冲文件any_name_0.sig自动创建在当前目录下(如果录制一个新的文件,第二个缓冲文件命名为any_name_1.sig)。
说明:-这里的信号文件(.sig)以一种特定的HTK格式存在。
当然,也可能使用其它音频格式(如.wav等),参见HTK文档第68页(第五章音频输入/输出)。
-缺省采样率是16kHz。
2.2标注信号要为语音波形打标签,首先按下Mark按钮,然后选择你要打标签的区域。
当区域标注之后,按下Labelas,键入标签名称,然后按下回车Enter。
本指南中,我们仅录制孤立词(Yes或者No),通过短暂停顿隔开。
对于每个信号,我们标注三个连续的区域:开始停顿(标记为sil)、录音单词(标记为yes或no)、结束停顿(标记为sil)。
这三个区域不能重叠(即使它们之间间隙很小)。
这三个标注完成之后,按下Save按钮:标签文件any_name_b被创建完成。
这个时候,你就可以按下Quit退出按钮了。
说明:.lab文件是一个简单的文本文件。
它包括每个标注的类型信息,每行对应每个标签:41712509229375sil922937515043750yes1504375020430625sil其中数字代表每个标签的开始和结束采样点。
这样的文件可以进行手工修改(比如调整标签的开始或结束点),甚至创建(并不一定使用HSLab工具)。
2.3文件重命名录音/标签之后,你可以依据自己的方便,对.sig和.lab文件进行重命名(如yes01.sig和b)。
本指南中,两个词的每个进行10个录音应该足够了。
信号文件存储在data/train/sig/目录(训练集)里面,标签存储在data/train/lab/目录(训练标签集)。
关于HSLab图形界面的更多详细信息参见HTK文档,第237页(参考小节,HSLab)。
3声学分析图2训练数据转化语音识别工具不能直接处理波形语音,需要通过更简洁有效的方法来表示波形语音。
这一步就是声学分析:-信号分成连续的帧,一般每帧长度介于20ms和40ms之间,段与段交织在一起;-每帧与窗口函数相乘(如Hamming函数);-从每个窗口帧中提取声学系数向量(给出一种该帧的频谱属性的简洁表示)。
HCopy HTK工具可用来转换原始波形文件,生成一系列声学向量,命令为:HCopy–A–D–C analysis.conf–S targetlist.txtanalysis.conf是配置文件,设置声学系数提取参数。
targetlist.txt用于指定用于处理的每个波形文件的名称和存放位置,以及目标系数文件的名称和存放位置。
3.1配置参数配置文件是一个文本文件(#用来注释)。
本指南中,使用的配置文件如下:##Example of an acoustical analysis configuration file#SOURCEFORMAT=HTK#Gives the format of the speech filesTARGETKIND=MFCC_0_D_A#Identifier of the coefficients to use#Unit=0.1micro-second:WINDOWSIZE=250000.0#=25ms=length of a time frameTARGETRATE=100000.0#=10ms=frame periodicityNUMCEPS=12#Number of MFCC coeffs(here from c1to c12)USEHAMMING=T#Use of Hamming function for windowing framesPREEMCOEF=0.97#Pre-emphasis coefficientNUMCHANS=26#Number of filterbank channelsCEPLIFTER=22#Length of cepstral liftering#The End列表1分析配置文件从该配置文件可看出,使用了MFCC((Mel Frequency Cepstral Coefficient)分析,在TARGETKIND标识符的值的前缀“MFCC”表明了这一点。
对每个信号帧,可提取以下系数:-12个首MFCC系数[C1,…,C12](因为NUMCEPS=12)-null MFCC系数c0,与帧的总能量成正比(在TARGETKIND中,后缀_0)-13个Delta coefficients,估计首次序[c0,c1,…,c12]派生(在TARGETKIND 中,后缀_D)-13个Acceleration coefficients,估计第二次序[c0,c1,…,c12]派生(在TARGETKIND中,后缀_A)总之,每个信号帧提取39个系数向量。
关于声学分析配置更详细内容参加HTK文档第58-66页(第五章语音输入/输出)3.2源/目标规范一个或多个源/目标文件对(如,原始波形文件/系数文件),可在HCopy命令行中直接指定。
如果要处理大量数据,可使用-S选项。
一般允许指定脚本文件格式为:data/train/sig/yes01.sig data/train/mfcc/yes01.mfccdata/train/sig/yes02.sig data/train/mfcc/yes02.mfccetc...data/train/sig/no01.sig data/train/mfcc/no01.mfccdata/train/sig/no02.sig data/train/mfcc/no02.mfccetc...列表2转换脚本文件可自动生成这样的文本脚本文件(比如使用Perl脚本编辑工具)。
新生成的训练集(.mfcc 文件)存储在data/trail/mfcc/目录下。
更多关于HCopy工具的详细信息参见HTK文档第195页(参考小节HCopy)4HMM定义本指南中,3个声学事件需要使用HMM隐马尔可夫模型建模,即Yes、No、Silence。
每个事件设计一个HMM模型。
第一步,为每个HMM模型选择一个priori结构:-状态数-观察函数的形式(对应每个状态)-状态转换排列这种定义不是一成不变的。
其实并没有固定的规则。
在这里,我们为3个HMM模型选择同一个结构(如图3所示)图3基本结构该模型包含4个活动状态{S2,S3,S4,S5},开始和结束状态(这里是S1、S6),是非发散状态(无观察函数),仅供HTK用于一些功能的实现。
观察函数b i是带对角矩阵的高斯分布。
状态的可能转换由a ij表示。
在HTK中,HMM模型是通过文本文件来描述的。
如图3一样的HMM模型一般描述如下:~o<VecSize>39<MFCC_0_D_A>~h"yes"<BeginHMM><NumStates>6<State>2<Mean>390.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0<Variance>391.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.01.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.01.0 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>390.00.0(...)0.0<Variance>391.0 1.0(...) 1.0<State>4<Mean>390.00.0(...)0.0<Variance>391.0 1.0(...) 1.0<State>5<Mean>390.00.0(...)0.0<Variance>391.0 1.0(...) 1.0<TransP>60.00.50.50.00.00.00.00.40.30.30.00.00.00.00.40.30.30.00.00.00.00.40.30.30.00.00.00.00.50.50.00.00.00.00.00.0<EndHMM>列表3HMM描述文件(原型)~o<VecSize>39<MFCC_0_D_A>文件头,给出系数向量大小(这里是39个系数)、系数类型(MFCC_0_D_A)。