HTK工具包孤立词识别系统(详细过程)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HTK工具包孤立词识别系统(详细过程)
1.前言
介绍HTK工具包建立孤立词识别系统,包含详细过程和可能出现的错误,分享错误分析和解决心得。

主要参考书籍博客:HTK,/jamesju/blog/116151
2.孤立词识别系统
2.1搭建流程
A:创建语料库,brightness,channel,color各录制5次。

B:声学分析,把wavform的声音文件转换为mfcc格式。

C:模型定义,为词典里面的每一个词建立一个HMM原型。

D:模型训练,HMM模型初始化和迭代。

E:问题定义,即语法定义。

F:对测试结合进行识别
G:评测
2.2.工作环境的搭建
创建如下目录结构:
(1) data/: 存储训练和测试数据(语音文件、语音标签、特征矢量文件)。

子目录:
data/train/lab data/train/wav data/train/mfcc data/test/lab data/test/wav data/test/mfcc
(2)analysis/:存储声学分析步骤的文件
(3)training/:存储初始化和训练步骤的文件
(4)model/:存储识别系统的模型(HMMS)的相关文件。

子目录:model/proto
(5)def/:存储任务定义的相关文件。

(6)test/:存储测试相关文件
2.3.标准HTK工具选项
一些标准选项对每个HTK工具都是通用的。

将使用以下一些选项:
1. -A :显示命令行参数
2. -D :显示配置设置
3.-T 1:显示算法动作的相关信息
3.语料库的准备
录制{brightness,channel,color}这三个词的读音。

每个读9次。

同时对每个录音都要进行标注,也就是有一个文本文件与其对应描述它的内容。

3.1语料库的准备
每个词各录制9次,保存为wav格式。

5次存放在
data/train/wav/brightness
data/train/wav/channel
train/train/wav/color
4次作为测试音频,存放在:
data/test/wav/brightness
data/test/wav/channel
train/test/wav/color
3.2 语音标注
我使用的是praat软件进行语音标注。

在这之前我用手机进行录音,文件格式是m4a,首先采用音频转换软件将m4a格式转换为wav格式,进而进行praat标注,将标注结果保存为lab 形式。

需要注意的是,praat标注单位为s,而HTK是以100ns为单位的,因此需要自己修改
标注文件,将分割点时间乘以10的7次方。

建议音频时间长一些,HTK可以分辨的一帧是25ms,小于25ms的无法分辨,所以,说话慢一些,会让识别效果更好。

标注文件位置:
data/train/lab/brightness
data/train/lab/channel
data/train/lab/color
标注.lab文件的格式如下:
4.声学分析
从原始的声音文件转换为特征矢量文件:
需要创建的文件:
(1)analysis.conf 创建目录:training/
说明:配置文件,特征矢量的特性。

内容:
SOURCEFORMAT = HTK
SOURCEFORMAT = WA V
TARGETKIND = MFCC_0_D_A
WINDOWSIZE = 250000.0
TARGETRATE = 100000.0
NUMCEPS = 12
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
(2)targetlist_train.txt 创建目录:training/
说明:列出源文件和目的的文件,即声音文件和特征文件
内容:
data/train/wav/brightness/brightness1.wav data/train/mfcc/brightness/brightness1.mfcc data/train/wav/brightness/brightness2.wav data/train/mfcc/brightness/brightness2.mfcc data/train/wav/brightness/brightness3.wav data/train/mfcc/brightness/brightness3.mfcc data/train/wav/brightness/brightness4.wav data/train/mfcc/brightness/brightness4.mfcc data/train/wav/brightness/brightness5.wav data/train/mfcc/brightness/brightness5.mfcc data/train/wav/channel/channel1.wav data/train/mfcc/channel/channel1.mfcc data/train/wav/channel/channel2.wav data/train/mfcc/channel/channel2.mfcc data/train/wav/channel/channel3.wav data/train/mfcc/channel/channel3.mfcc data/train/wav/channel/channel4.wav data/train/mfcc/channel/channel4.mfcc data/train/wav/channel/channel5.wav data/train/mfcc/channel/channel5.mfcc data/train/wav/color/color1.wav data/train/mfcc/color/color1.mfcc
data/train/wav/color/color2.wav data/train/mfcc/color/color2.mfcc
data/train/wav/color/color3.wav data/train/mfcc/color/color3.mfcc
data/train/wav/color/color4.wav data/train/mfcc/color/color4.mfcc
data/train/wav/color/color5.wav data/train/mfcc/color/color5.mfcc
指令:
HCopy -A -D -C training/analysis.conf -S training/targetlist_train.txt
运行结果:
我们可以看到:
如果生成失败,根据错误提示修改。

如果显示标签有误,检查下lab文件的标注,时间是否符合规范。

进行这些操作之前确保HTK工具箱安装正确。

本人在操作过程中,一直出现label错误,在检查标签无误之后,把htk重新装了,一直倒腾,这个问题就没了。

5.定义HMM
需要创建的文件:
hmm_brightness
hmm_channel
hmm_color
hmm_silb
hmm_sile
创建目录:model/proto
说明:用来定义单词的HMM模型
内容:
hmm_brightness:
~o<VecSize>39<MFCC_0_D_A>
~h "brightness"
<BeginHMM>
<NumStates>10
<State>2
<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>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
<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 <State>6
<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>7
<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
<State>8
<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>9
<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>10
0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<EndHMM>
hmm_channel、hmm_color定义方法同brightness类似,不过上面的名字要分别换成channel 和color同时状态数根据因素分配2~3个状态,具体参考:HTK BOOK
hmm_silb:
~o<VecSize>39<MFCC_0_D_A>
~h "silb"
<BeginHMM>
<NumStates>3
<State>2
<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>3
0.0 1.0 0.0
0.0 0.5 0.5
0.0 0.0 0.0
<EndHMM>
hmm_silb和hmm_sile相同,只修改名字
6.HMM训练
6.1 初始化
(1)trainlist_brightness.txt trainlist_channel.txt trainlist_color.txt trainlist_silb
trainlist_sile.txt
创建目录:training/
说明:特征矢量文件路径
内容:
trainlist_silb.txt 和trainlist_sile.txt文件内容一样。

(2)hmm0目录
创建目录:model/
说明:初始化后的HMM模型存放的位置。

指令:
HInit -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm0 -H
model/proto/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HInit -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm0 -H model/proto/hmm_channel -l channel -L data/train/lab/channel channel
HInit -A -D -T 1 -S training/trainlist_color.txt -M model/hmm0 -H model/proto/hmm_color -l color -L data/train/lab/color color
HInit -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm0 -H model/proto/hmm_silb -l silb -L data/train/lab silb
HInit -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm0 -H model/proto/hmm_sile -l sile -L data/train/lab sile
初始化出现错误,无法生成下面文件。

根据错误提示修改内容。

检查下是否有低级错误。

初始化之后我们可以再hmm0文件夹中看到:
6.2 训练
需要创建的文件夹
hmm1
hmm2
hmm3
创建位置:model/
每次,HRset迭代(即当前再估计迭代中的迭代)显示在屏幕上,通过change量度标示收敛性。

一旦这个量度值不再从一个HRset迭代到下个迭代减少(绝对值),过程就该停止了。

指令:
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm1 -H
model/hmm0/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm2 -H
model/hmm0/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm3 -H
model/hmm0/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm1 -H model/hmm0/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm2 -H model/hmm0/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm3 -H model/hmm0/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm1 -H model/hmm0/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm2 -H model/hmm0/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm3 -H model/hmm0/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm1 -H model/hmm0/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm2 -H model/hmm0/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm3 -H model/hmm0/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm1 -H model/hmm0/hmm_sile -l sile -L data/train/lab sile
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm2 -H model/hmm0/hmm_sile -l sile -L data/train/lab sile
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm3 -H model/hmm0/hmm_sile -l sile -L
data/train/lab sile
7.任务定义
7.1建立语法规则和字典
需要创建的文件:
(1)gram.txt
创建的目录:def
在使用我们的单词模型之前,要定义识别器的基本结构(任务语法)。

我们首先定义最简单的语法:开始停顿、接着简单单词(这里指brightness、channel、color)、结束停顿。

内容:
$WORD = BRIGHTNESS | CHANNEL | COLOR;
({START_SIL}[ $WORD ] {END_SIL})
注释:用括号{}括住STRAT_SIL和END_SIL表示其可不存在或者重复多次(允许单词之前或之后长时间的停顿,或者根本没有停顿)。

括号【】括住$WORD表示0个或一次出现(如果没有单词,可能只是识别停顿)。

(2)dict.txt
创建目录:def
说明:系统要知道HMM模型和语法变量
BRIGHTNESS、CHANNEL、COLOR、STRAT_SIL、END_SIL的对应关系。

这种信息存储在文本文件中,命名为任务字典。

内容:
7.2网络
建立任务网络:
生成的文件:net.slf
命令:HParse -A -D -T 1 def/gram.txt def/net.slf
8识别
8.1准备测试数据
需要准备的文件:
创建的目录:test/
说明:列出了要使用的模型的名字(brightness、channel、color、silb、sile),每个一行,最后要加一个空行。

内容:
brightness
channel
color
silb
sile
(2)targetlist_list.txt
创建的目录:test/
内容:
命令:
HCopy -A -D -C test/analysis.conf -S test/targetlist_test.txt
生成test数据的mfcc特征
如下图所示:
8.2识别
基本方法:
需要创建的文件:
(1)result文件夹
(2)reco.mlf
创建目录:result/
初始内容:
#!MLF!#
(3)hmmsdef.mmf
创建目录:test
将hmm3中所有文件的内容粘帖,第一个文件内容全部粘帖,第二个文件开始从 “~h ……”开始复制,即:hmmsdef.mmf文件中只有一个“~o”。

命令:
HVite -A -D -T 1 -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt data/test/mfcc/brightness/brightness1.mfcc
结果在reco.mlf中显示:
交互方式:
需要创建的文件:
direction.conf
创建的目录:test
说明:是HVite的配置文件,允许使用直接音频输入,为了允许从输入信号中直接提取声学系数,这个文件必须包含前面训练数据使用的升学分析配置参数。

内容如下:
命令:
HVite -A -D -T 1 -C test/directin.conf -g -H test/hmmsdef.mmf -w def/net.slf def/dict.txt
test/hmmlist.txt
9.性能测试
9.1.主标签文件
在性能评测之前,创建两个文件,命名为主标签文件,扩展名为.mlf;
(1)第一个文件包含整个训练集的正确副本,既是通过手工标注的副本。

ref.mlf记作参考副本
(2)第二个文件包含整个测试集的识别副本,即识别器产生的假设副本。

把reco.mlf记为识别副本。

通过比较每项数据的参考副本和识别假设,进行性能评测。

内容:
ref.mlf(包含brightness、color、channel的所有lab信息)
需要创建的文件:testlist.txt 说明:测试路径
内容:
命令:
HVite -A -D -T 1 -S test/testlist.txt -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt
测试结果如下:
运行之后在reco.mlf中看到:
9.2错误率
需要创建的文件:
(1) labellist.txt
说明:出现在副本文件中的标签列表创建的目录:result
内容:
data/test/lab/brightness/b data/test/lab/brightness/b data/test/lab/brightness/b data/test/lab/brightness/b
data/test/lab/channel/b
data/test/lab/channel/b
data/test/lab/channel/b
data/test/lab/channel/b
data/test/lab/color/b
data/test/lab/color/b
data/test/lab/color/b
data/test/lab/color/b
(2) results.txt
创建的目录:result
说明:存放错误率结果
命令:
HResults -A -D -T 1 -e ??? sil -I result/ref.mlf result/labellist.txt result/reco.mlf
不知道为什么总是出现这个错误,检查了所有的文件,不知道。

希望有同行的你告诉我错误在哪里
根据这个错误提示,将test的对应lab文件直接放在test/mfcc对应文件下,问题得以解决(有好的解决方法求共享)
出现如下:
注:由于选取的数据集很小只有12个词,非常有限,所以识别率是100%。

第一行(SENT)给出句子的识别率(%Correct=100.00),第二行(WORD)给出的是单词的识别率(%Corr=100.00)。

上图中,这两个比率是相同的,这是因为我们的任务语法仅使用一个单词(除了
停顿之外)作为句子。

这是孤立词识别任务。

这里只要考虑第一行(SENT)就够 了。

H=12 给出的是测试数据被正确识别的数量,S=0,表示识别相反的数量。

N=0表示测试数据总数。

相关文档
最新文档