HTK学习记录

1.运行环境 蠢事

       本人爱折腾,本来想在window中编译htk-3.4,可是偏偏想着学点linux,就装了cygwin32位准备装个,谁知道在cygwin不嫩使用界面,就安装了x11等一系列运行库,发现依旧有问题找不到音频设备,现在想来可能是没有装那些音频设备的运行库,

       后来一狠心就用虚拟机装了桌面版的ubuntu14,再装虚拟机时还顺便刷了新的BIOS(vmplayer需要ADM-V开启)差点把电脑弄得没办法开机,同时笔记本刷了BIOS后WiFi好几天不能使用,把htk装完了,可是因为电脑问题又把Ubuntu删了,然后再狠心装了个Ubuntu14 server,发现htk还是需要界面,再装了个轻量级桌面xfce,折腾了许久还是学到了不少知识,自学还是比较容易走弯路。即为蠢事。

 

2.HTK yes-or-no 孤立词识别实验

     个人为行动派(其实是英语不太好,htkbook实在啃得太吃力了),直接先进行实验然后再慢慢进行研究,接下来是我的实验步骤总结:

HTK如何编译搭建,我就不介绍了蛮简单的,装好库就可以了,本次实验要用到的命令:

       HSLab     录音,标记工具
       HCopy    从语音提取特征参数的工具
       HInit 和 HCompV 对HMM模型初始化的工具,注意,这里需要对每个模型都要使用此命令进行初始化
       HRest     对模型进行迭代训练的工具
       HParse    语法转网络的工具,发音转本文用到的
       HSGen    语法查错工具
       HVite      解码工具,也就是识别工具。可以用命令行方式使用,也可以用交互方式使用

 

步骤一:

       创建一些文件夹:建立htk_yesorno,在该文件夹下建立data、def、hmms、mfcc、models、results和tests,每个文件夹是干啥的看名字应该就知道了;

步骤二:

      在data文件夹中使用命令HSLab yes.sig,着手准备音频材料:

       1.界面中vol6是音量大小,在旁边是音频图放大缩小,可以调大点x4差不多

       2.界面中录音点击rec键,开始录音,然后再点击stop停止,点击play播放音频听听可以不

       3.界面中会显示音频图,然后你先点击mark,选中你需要的音频段,再点击labelas,输入音频段的名称,不要点击labe,如下图所示,开始和结尾都要标注sil,中间使我们需要的音频标注,yes和no的音频都需要标注好,

这样做个5次十次都可以,反正就是做实验,HSLab能标注0,1文件,你可以先重命名已经保存好的文件不用退出录音界面。

    4.录音结束后再data文件夹内新建两个文件sig_dir、label_dir,通过mv *.sig sig_dir/

步骤三:

有了音频库后,这时候就需要采集特征,使用的是HCopy命令,首先呢需要两个文件,一个是特征矢量参数配置文件htk.conf ,还有源音频文件和需生成目标MFCC特征文件列表文件sigtomfcclist.txt

htk.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                          #定义倒谱所用到的滤波器组内滤波器个数

sigtomfcclist.txt:

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

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

将这两个文件保存到tests,然后输入(注意我没有进入任何一个子文件夹,一直在htk_yesorno文件下执行命令)

HCopy -A -D -T 1 -C tests/htk.conf -S tests/sigtomfcclist.txt

              -C   配置文件

              -S   特征提取的列表文件

              -A   显示命令行参数

              -D   显示配置设置

              -T 1 显示算法动作的相关信息 

然后就ls mfcc查看是否生成成功了,若没有成功请自行检查上面步骤和htk是否安装成功!

步骤四:

接下来我们得初始化三个hmm模型:hmm_yes、hmm_no、hmm_sil,因为我们在lab时标注了音频的三个隐藏状态,三个隐藏状态可以用音频特征表述出来,在models下新建三个hmm_* 空文件,三个文件中hmm模型初始参数都相同就是名称得改,我就写一个yes hmm连续模型:

~o <VecSize> 39 <MFCC_0_D_A>  #定义输入特征参数的维数
~h "yes"              # 定义模型名字,(yes写yes no写no,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>

做好这些准备,我们就可以开始初始化我们的模型啦,我们在建立一个训练列表文件trainlist.txt保存字tests中,列表为:

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

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

现在hmms建立几个文件夹   mkdir hmms/hmm{0,1,2,3}  接下来,我们输入初始化命令:

HInit -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm0 -H models/hmm_yes -l yes -L data/label_dir yes 

HInit -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm0 -H models/hmm_no -l no -L data/label_dir no

HInit -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm0 -H models/hmm_sil -l sil -L data/label_dir sil 

步骤五:

可以开始训练模型,分别对yes、no、sil都使用三次命令(需要改变文件夹hmm{1,2,3}和模型hmm_{yes,no,sil}):

HRest -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm1 -H hmms/hmm0/hmm_yes -l yes -L data/label_dir yes

HRest -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm2 -H hmms/hmm1/hmm_yes -l yes -L data/label_dir yes

HRest -A -D -T 1 -C tests/htk.conf -S tests/trainlist.txt -M hmms/hmm3 -H hmms/hmm2/hmm_yes -l yes -L data/label_dir yes

注意的是每次迭代都要改-M和-H中的文件夹目录,还有hmm模型,最后训练完成都会放在hmms/hmm3文件夹内

 

步骤六:

在def中新建语法文件gram.txt和字典文件dict.txt,在tests中新建模型名称列表hmmlist.txt:

gram:

$WORD = YES | NO;

( { SIL } [ $WORD ] { SIL } )

dict:

YES [yes] yes

NO [no] no

SIL [sil] sil

hmm:

yes
no
sil

使用命令:HParse -A -D -C tests/htk.conf -T 1 def/gram.txt def/net.slf 编制网络,使用HSGen -s def/net.slf def/dict.txt查字典文件中的错误;

 

步骤七:

为最后能识别做最后准备新建最后连续录音配置tests/Readin.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        #指定按键控制交互过程

 

先新建个空的结果文件reco.mlf,然后输入识别命令:

HVite -A -D -T 1 -C tests/Readin.conf -H hmms/hmm3/hmm_yes -H hmms/hmm3/hmm_no -H hmms/hmm3/hmm_sil -i results/reco.mlf -w def/net.slf def/dict.txt tests/hmmlist.txt(这种方式不太容易成功,看采样情况)

HVite -A -D -T 1 -C tests/Readin.conf -H hmms/hmm3/hmm_yes -H hmms/hmm3/hmm_no -H hmms/hmm3/hmm_sil -i results/reco.mlf -w def/net.slf def/dict.txt tests/hmmlist.txt mfcc/no_00.mfcc(这个可以识别本地)

若是嫌命令太长,可以将三个模型合并唯一模型,就是如下格式:

~o
<STREAMINFO> 1 39
<VECSIZE> 39<NULLD><MFCC_D_A_0><DIAGC>
~h "yes"
<BEGINHMM>
<NUMSTATES> 6
。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。

~h "no"
<BEGINHMM>
<NUMSTATES> 6
<STATE> 2
<MEAN> 39
。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。

~h "sil"
<BEGINHMM>
<NUMSTATES> 6
<STATE> 2
<MEAN> 39

然后命令就可以不用写那么多模型了!!!!!

然后这就是我的实验过程啦!!!!!!!!!!!!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值