语音识别系统之htk------孤立词识别(yesno)

来源:互联网 发布:软件疲劳强度测试 编辑:程序博客网 时间:2024/04/16 12:04

      孤立词的识别应该是最基础了,搭完htk的环境和安装好,首先就应该实验下。网上这方面的介绍也很多,大家可以去参考参考。下面就是整个过程:

一 数据准备

   说明:由于自己的linux操作系统不支持麦克风输入。所以在windows下准备数据。下午折腾了下,感觉比较麻烦。网上说需要安装oss,但是我的ubuntu版本似乎没找到对应的版本,我还是放弃了。这个是后话了。如果大家有什么更好的办法,可以告诉我。谢谢你……大家相互学习。

   首先,需要下个htk-3.3-windows-binary.zip。然后解压后,在这目录下运行

    HSLab name.sig

   这样就会出现录音和标注的图形界面。

1.1 录音

 Rec开始录音,按Stop结束。这样一个名字为name_0.sig的声音文件就被记录在当前目录了。如果你接着录音,name_1.sig就会被记录。SigHTK的格式。

1.2标注

   Mark后,出现第一个选择点A,然后再选择点B,这样你就选择好了要标注的段落,然后按Lableas键入名字,然后回车,比如第一个是sil,中间是yes或者no,最后是sil。我们的每段语音分成三部分,静音(sil), yes或者no,静音(sil)。相邻的段不能重叠,可以有小的间隔。按Save加回车表示存储,会显示出你保存的名字。按Quit退出。

 

这个结果会很影响你的实验的。希望大家认真标记,不然初始化就会出现问题的。我一开始就出现了这样的问题。当然你应该多准备些数据了,数据肯定是越多越好吧。这里,我的数据时yes_0.sig,yes_1.sig,.....,yes_9.sig和no_1.sig,no_2.sig,....,no_9.sig。还有的就是lab数据了。

此外,你需要在htk目录下建立一个work文件夹,以后什么的都在这里面进行吧。然后在work下你需要建立下面几个文件夹:def, hmms, models, lab, sig, mfcc, results, test。

然后把你的sig文件都放到sig文件夹下,lab文件都放到lab文件夹下。至此数据都准备好了。

 二 提取特征

2.1 在test文件夹中新建analysis.conf文件,内容为:

SOURCEFORMAT=HTK

TARGETKIND=MFCC_0_D_A

WINDOWSIZE=250000.0

TARGETRATE=100000.0

NUMCEPS=12

USEHAMMING=T

PREEMCOEF=0.97

NUMCHANS=26

CEPLIFTER=22

具体参数介绍详见HTKbook

2.2在def文件夹中新建targetlist.txt,内容为

work sig/yes_0.sig work/mfcc/yes_0.mfcc

work/sig/yes_1.sig work/mfcc/yes_1.mfcc

work/sig/yes_2.sig work/mfcc/yes_2.mfcc

work/sig/yes_3.sig work/ mfcc/yes_3.mfcc

work/sig/yes_4.sig work/mfcc/yes_4.mfcc

work/sig/yes_5.sig work/mfcc/yes_5.mfcc

work/sig/yes_6.sig work/mfcc/yes_6.mfcc

work/sig/yes_7.sig work/mfcc/yes_7.mfcc

work/sig/yes_8.sig work/mfcc/yes_8.mfcc

work/sig/yes_9.sig work/mfcc/yes_9.mfcc

后面加上no的10个,总共20行对应为targetlist.txt.

 

然后在命令行中输入:Hcopy -A -D -C test/analysis.conf -S def/targetlist.txt

至此,特征提取就可以了。

三 模型初始化

3.1 在model文件夹下建立hmm_yes  hmm_no  hmm_sil 这三个文件。注意没有后缀的哦。

在hmm_yes文件中输入:

~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_no跟yes一样,把上面的yes换为no就可以了。

hmm_sil的文件里输入:

~o <VecSize> 39 <MFCC_0_D_A>

~h "sil"

<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>

3.2 初始化

test文件夹中新建trainlist.txt文件,内容为

work/mfcc/yes_1.mfcc

work/mfcc/yes_2.mfcc

work/mfcc/yes_3.mfcc

work/mfcc/yes_4.mfcc

work/mfcc/yes_5.mfcc

work/mfcc/yes_6.mfcc

work/mfcc/yes_7.mfcc

work/mfcc/yes_8.mfcc

work/mfcc/yes_9.mfcc

work/mfcc/yes_10.mfcc

把no也加上。这样也是20个。

3.3 在hmms文件夹中新建hmm0文件夹,然后执行命令:

Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_yes –l yes –L lab hyes

Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_no –l no –L lab no

Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_sil –l sil–L lab sil

至此,初始化完毕。你可以在hmm0文件下分别看到三个文件。

四 模型训练

hmms中新建三个文件夹,hmm1,hmm2,hmm3

使用命令:

HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm1 -H hmms/hmm0/hmm_yes  -l yes -L lab yes

HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm2 -H hmms/hmm1/hmm_yes -1 yes  -L lab yes

HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm3 -H hmms/hmm2/hmm_yes -l yes -L lab yes

其他的no和sil也跟这个一样。做三遍,注意里面的区别。

至此,模型训练完毕。

五 建立语法规则和字典

5.1 def文件夹中新建gram.txt文件,输入语法:

$WORD=YES | NO ;

({START_SIL}[$WORD]{END_SIL})

5.2 def文件夹中新建dict.txt文件,输入字典:

 YES [yes] hyes

NO [no] no

START_SIL [sil] sil

END_SIL [sil] sil

5.3 建立任务网络

输入命令:Hparse -A -D -T 1 def/gram.txt def/net.slf

def文件中生成了net.slf文件.你可以去看下net.slf文件。

六 识别

6.1results文件夹中新建reco.mlf文件

6.2 test文件夹中新建hmmsdef.mmf文件,其内容为hmms/hmm3文件夹中的所有hmm_xxx的数据,注意:在第一个复制进去的hmm_xxx为全部数据,剩下的从第一行的~h开始复制,也就是说只保留第一个~o

6.3 此时可以用一个.mfcc文件进行测试,先在test文件中新建一个hmmlist.txt文件,内容为:

yes

no

sil

命令为:Hvite -A -D -T 1 -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt mfcc /yes_1.mfcc

剩下的你就可以看到结果了。应该会不错吧。

此外,在window下可以交互识别。在linux下由于驱动的问题还是不行。具体的大家可以去参考其他的博客。

 

 

这样,一个简单的系统搭建完毕。总的来说,还是比较麻烦的。你可以很顺利的完成吧。

我也在别人的帮助下完成的,感谢@语音识别-零落。希望我们后面的连续语音也会很好完成。

参考的博客:

      1.http://my.oschina.net/jamesju/blog/116151

      2.http://www.cnblogs.com/mingzhao810/archive/2012/08/03/2617674.html

 

 

附上之前的安装博客:

         1.语音识别系统之htk----安装

 

 

 

 

 

0 0
原创粉丝点击