WinHTK开发与使用二:孤立词识别

来源:互联网 发布:网络电视有什么功能 编辑:程序博客网 时间:2024/06/15 07:06
WinHTK开发与使用二:孤立词识别
        本文在WinHTK软件设计的基础之上,介绍设计语音识别系统过程。具体包括孤立词语音和连续语音识别系统设计,这里先介绍孤立词的识别。语音识别系统设计过程主要包括四个步骤[32]:数据准备,模型训练,识别测试,效果分析,如图1所示。 

图1 基于WinHTK语音识别系统设计过程

一、孤立词识别

本设计的内容是介绍一个识别09共十个数字的孤立词识别系统的过程,采用整词模型。尽管任务比较简单,但足以说明一般的孤立词识别系统设计过程,演示视频文件在上传的资源中可以下载(不好意思不知道怎么提供链接,直接去找就是了)。

1、数据准备

(1) 任务语法描述。由于是孤立词系统,语法描述非常简单。相应的语法约束文件gram内容如下:

(hmm0|hmm1|hmm2|hmm3|hmm4|hmm5|hmm6|hmm7|hmm8|hmm9)

每一个hmm*代表一个数字。利用HParse工具转换成SLF文件network.slf。对于图形如2所示。

 

图2 语法约束对应的FSN示意图

(2) 词典准备。由于采用整词模型,词典也比较简单,对应的词典文件dict文件如下:


hmm0 hmm0

hmm1 hmm1

hmm2 hmm2

hmm3 hmm3

hmm4 hmm4

hmm5 hmm5

hmm6 hmm6

hmm7 hmm7

hmm8 hmm8

hmm9 hmm9


另外还需要准备一个转换词典translate,这个文件内容的作用是将模型名转换成需要输出的符号,其内容如下:


hmm0 0

hmm1 1

hmm2 2

hmm3 3

hmm4 4

hmm5 5

hmm6 6

hmm7 7

hmm8 8

hmm9 9


(3) 语音录制。由于任务中需要训练10个数字的HMM,因此需要分别录制语音文件。在本设计中对每个数字录制了5个语音文件,一共50个语音文件。采样速率为11.025KHz,单通道16位采样。另外准备10个测试语音文件,分别对应10个数字,用于检测识别系统效果。由于采用孤立词训练方式,故不需要对语音文件进行标注。

(4) 编码数据。编码方案:加汉明窗,窗长20ms10ms帧移。采用12MFCC系数,能量系数,一阶和二阶动态参数,共39个系数。由于需要进行端点检测,需要设置一些端点检测参数。编码参数文件内容如下:


SOURCEFORMAT=WAV

TARGETFORMAT=HTK

SOURCEKIND=WAVEFORM

TARGETKIND=MFCC_E_D_A

NUMCEPS=12

NUMCHANS=20

CEPLIFTER=22

USEHAMMING=T

PREEMCOEF=0.95

SOURCERATE=907

TARGETRATE=100000

WINDOWSIZE=200000

USESILDET=T

SPEECHTHRESH=0.8

SILENERGY=0.0

SPCSEQCOUNT=10

SILSEQCOUNT=10

SILMARGIN=1

SPCGLCHCOUNT=8

SILGLCHCOUNT=8


端点检测是一个两阶段检测过程,首先将语音帧进行划分,根据语音门限和静音门限分别划分为静音帧和语音帧;然后进行下一步检测,检测连续SPCSEQCOUNT个语音帧,若语音帧数目超过SPCGLCHCOUNT则划分为语音,否则划分为静音。

2、模型训练

(1) 初始化HMM。为每一个数字定义HMM拓扑。一则为简单化所有模型定义,二则实际上十个数字语音构成基本相似,故在这里采用相同拓扑(实际也可以不同)。定义的HMM拓扑如6.3所示,相应的HMM定义文件内容如下:

~o <VecSize>  39 <MFCC_E_D_A> 

~h "hmm"

<BeginHMM>

  <NumStates>  7

   <State> 2  

   <Mean> 39  

   0.0 0.0 0.0 0.0 … 0.0 0.0 0.0

<Variance> 39  

   0.0 0.0 0.0 0.0 … 0.0 0.0 0.0

… … … …

   <State> 6 

       <Mean> 39  

   0.0 0.0 0.0 0.0 … 0.0 0.0 0.0

<Variance> 39  

   0.0 0.0 0.0 0.0 … 0.0 0.0 0.0

  <TransP> 7 

         0.0 0.6 0.4 0.0 0.0 0.0 0.0

         0.0 0.2 0.4 0.4 0.0 0.0 0.0

         0.0 0.0 0.6 0.4 0.0 0.0 0.0

         0.0 0.0 0.0 0.4 0.6 0.0 0.0

         0.0 0.0 0.0 0.0 0.4 0.4 0.2

         0.0 0.0 0.0 0.0 0.0 0.4 0.6

         0.0 0.0 0.0 0.0 0.0 0.0 0.0

  <EndHMM>

图3 HMM拓扑示意图

然后利用HInit工具对各个模型进行初始参数估计,其调用形式如下:

HInit -A -T 0001 -H allhmm -S train*.scp -o hmm* -M newhmm hmm*

其中需要依次对十个数字相应模型进行估计。

(2) 重估HMM。前面仅仅利用HInit设置模型参数初始值,需要利用HRest工具进行模型的进一步重估。HRest工具调用形式如下:

HRest -A -T 0001 -H trainhmm -S train*.scp -M rehmm hmm*

也需要对十个数字模型分别进行。最后获得各个数字相应的模型hmm*,将这些模型保存到一个文件readymodel HMM定义文件中。并建立列表文件hmm.lst,列出其中的模型。

3、识别测试

下面利用已经训练好模型进行测试,HVite工具调用形式如下:

HVite -A -T 001 -i rec.mlf -w network.slf -S test.lst -H readymodel dict hmm.lst

识别输出MLF文件rec.mlf。其中network.slf为语法约束对应的FSNtest.lst列出测试文件,readymodel中保存了训练好的十个数字模型参数,dict为词典文件,hmm.lstHMM列表文件。

4、识别结果

最后,利用HResults工具进行识别效果分析,其调用形式如下:

HResults -A -T 001 -I trans hmm.lst rec.mlf

其中trans为参考标注,也即正确的标注,rec.mlf为识别输出标注,hmm.lstHMM列表文件。分析结果如下:

====================== HTK Results Analysis =======================

  Date: Fri Jun 05 10:07:47 2009

  Ref : trans

  Rec : rec.mlf

------------------------ Overall Results --------------------------

SENT: %Correct=100.00 [H=10, S=0, N=10]

WORD: %Corr=100.00, Acc=100.00 [H=10, D=0, S=0, I=0, N=10]

===================================================================

从上可见正确识别率为100%,识别效果非常好。当然这里仅仅给出了十个测试文件的测试结果,如果需要得到更可靠的结果,需要更多的测试文件。

1 0