WinHTK开发与使用

来源:互联网 发布:数控编程吧 编辑:程序博客网 时间:2024/05/22 03:50

引用:http://blog.csdn.net/neustar1/article/details/19245527

WinHTK开发与使用一:软件设计

        接触语音识别的同行都会了解HTK,HTK工具包的功能很强大;但是对于习惯界面操作的很多人而言,它有一些先天不足。当然对于一开始就习惯类Unix等命令行界面开发者而言,这些都不是问题,所以本系列文章只针对习惯了可见即可及操作系统的,对于语音识别技术感兴趣的初学者。导致HTK不方便使用的原因主要以下几点:

(1) 不方便安装,随便上网上一搜,涉及HTK的基本都是问如何安装,包括本人也是琢磨了很长一段时间(本人一开始也只是对在Windows开发,故此出现类似问题);

(2) 使用麻烦,windows下可以在Cygwin软件环境下使用HTK的方法,好像看似方便了,因为可以利用windows下的工具进行一些数据处理和文本编辑,但又出现新问题,其中最主要的是,必须学会Perl脚本语言的编程,好像多学一样东西不是坏事,可问题是有些人的直接目标是语音,他们不想把过多的时间浪费在一些其它方面的学习上;

(3) 组织不方便,在unix下组织文件是一件很辛苦麻烦的事情,这也是HTK中很多关于路径搜索的处理的原因。

说白了,就一句,很多人就是一个初学者,如果连语音识别入门就很难,自然会阻碍大家对于语音识别技术的深入研究。基于以上原因,我在Windows环境下,对HTK进行再次开发,希望能够让更初入门语音识别的同行,解决最开始的障碍,后续的路还是要靠自己走的。

一、概述

    整个软件从功能上划分主要分为四部分:文件管理和文本编辑,HTK工具调用和调试,识别应用界面,语音文件录制。如图1所示。各部分设计内容和功能如下。

图1 WinHTK设计内容

(1) 文件管理和文本编辑。这部分的设计的目标是实现一个很好的文件管理系统,还有良好文本编辑环境。文件管理方式有很多种,在这里采用了最熟悉的树形文件管理方式,以项目的方式对语音识别中涉及的文件进行管理,同时实现了多种文件管理功能,比如添加删除文件夹,新建、复制、粘贴文件等等。在这里有一个重要的问题,工作路径的选择,常用方法是新建一个项目后,固定工作路径为项目所处的目录。本设计采用动态决定工作路径方式,这主要是由于HTK内在的路径处理方式所决定的,这样决定也是方便使用者选择适合自己的路径处理方式。除了文件管理,这部分的另一个功能就是,文本编辑。由于进行处理时,经常需要同时处理多个文件,因此设计了一个多文件编辑的文本编辑器。这部分设计是本软件的重点,也是难点。

(2) HTK工具调用和调试。这部分设计主要是实现HTK工具的调用。由于HTK工具多达十几个,因此要同时处理好工具的隐式调用和显示不是一件容易的事情。由于所有这些工具需要的处理是一致的,因此在本设计中对它们进行了统一管理并进行显示,将直接命令方式调用改成辅助式的命令行调用,免去了繁杂的命令行参数记忆。除了实现HTK调用,还应当能够实时观察HTK的运行结果,方便调试,以便决定下一步操作,对于这个问题,本设计也给出了很好的解答,具体在后面叙述。

(3) 识别应用界面。有时候,不仅仅需要进行理论研究,制作一些简单的识别应用也是有必要的。为此,根据HTK识别器的特点,本设计开发了一个用于实现识别应用的接口界面,既可以静态识别,即对语音文件识别,也可以动态识别,即实时录音识别。需要强调的是,这个识别界面可以显示汉语的识别结果,因此必不可少需要一个翻译文件。

(4) 语音文件录制。尽管实际中有很多录音软件,但是它们要么操作太复杂,要么就是不能胜任语音识别系统开发任务的实际需要。因此为解决这个问题,本设计附带开发用于语音文件录制的功能。该录音器的特点是,可以实现同时多个文件的录制,文件名的动态编排。录音器的难点在于波形的动态演示,本设计中对这个问题处理不太利索。

二、详细设计

1、文件管理和编辑

        开始的时候,对于Windows程序设计了解还不是很深,再就是需要考虑的问题很多,实现功能也很多。主要分为文件管理系统设计和文本编辑器的设计。

(1) 文件管理系统设计。文件管理系统设计内容包括文件的组织和管理,具体而言就是文件层次结构设计和文件夹及文件的管理。文件的组织形式有多种,常用的有列表形式,树形形式和图标形式本,列表形式简洁,但不方便管理;图表形式直观,方便管理,但是文件数目较多时,处理起来比较复杂;树形形式非常适合大量文件的组织和管理。因此本设计中采用了树形的文件组织形式,如图2所示。通过点击各个文件夹可

 树形文件组织形式示意图

        以轻松的实现多个文件的管理,这一点非常适合语音识别设计中文件管理。需要说明一点,在本设计中根据HTK的特点将文件的最大层次设为5层,即最多允许5层文件夹管理。为了避免今后的重新修改,在设计中采用了宏变量,也就是说必要的时候,这一限制完全可以修改宏变量来解除。由于语音识别系统设计中常常涉及多种文件,显然必须给以一定得区分。在本设计中主要有两类文件需要区分,即语音文件和文本文件,它们通过不同的图标进行显示,如3所示。当然文件夹与文件也是两个不同类型,也需要区别表示。要想设计一个很好的文件管理系统,除了层次结构的设计外,还需要提供相应的文件夹或文件的操纵。在这里有一点需要说明,不同层次的文件夹能够进行的操作是不同的。如图4所示,可以看出不同层次的文件夹的操作。另外文件与文件夹

3  不同类型文件表示示意图

4  不同层次文件夹的操作

得操作也应当不同,具体如图5.8所示。如果仅仅是一个层次,要实现这些操作的功能很容易,而实际情况是存在多个层次,而恰恰是不同层次间拥有相同的却又不完全的功能。显然如果每一个层次的操作单独实现,必然导致编程的低效率,这是不希望的。因此必须合理设计不同层次间的共同操作和不同操作,这是设计的难点。

 文件操作示意图

(2) 文本编辑器设计。文本编辑器的设计内容主要有设计一个多文本的编辑器和一些用于处理文件的编辑工具。多文本编辑器的设计主要是考虑在进行语音识别试验时需要同时编辑多个文本。显然如果每次只能编辑一个文本,意味着当要编辑新的文件,需要关闭当前文件,打开新的文件,这是一件非常烦人的事情。因此在本软件中设计了一个多文本编辑器。本设计中多文本编辑器的效果如图6 所示,图中包含四个文件。由

6 多文本编辑器效果图

API提供了标准的编辑器窗口,因此编辑器的功能设计不难,难就难在多个文件的打开和关闭。需要说明一点的是本编辑器是一个ASCII文件编辑器,仅能显示字符,不能够显示中文(因此在后面单独设计一个中文编辑工具)。除了提供一个多文本编辑窗口外,还需要添加一些辅助的功能,如列表文件生成,MLF文件生成等操作。具体包含的操作如7所示。

文件编辑功能示意图

2、HTK工具调用

    在这部分中设计的内容主要有HTK工具的调用接口和调试界面的设计。另外为了方便用户自己编写程序的使用,提供了一个良好的程序调用接口。

(1) HTK工具调用接口的设计。HTK中包含多个工具。这些工具都是通过命令行方式调用的,且需要的文件和设置的参数都基本相似。如果对于每一个工具单独设计调用接口,显然会导致程序量的剧增,再就是不方便设计。根据HTK工具调用特点,本设计中采用统一的框架和模式实现HTK工具的调用;另外在保留命令行调用方式的基础之上增加了辅助命令行调用方式,避免了繁杂的命令行参数的记忆,也缩短了实验所需要的时间;再就是如果需要增加工具,修改代码非常少,很容易实现。这个设计是本软件中的一个重要特点。具体效果如8和图9所示,图8显示的是HCopy 

8 HCopy工具调用界面

9 HList工具调用界面

具的调用界面,图9对应HList工具的调用界面,可以发现基本相同。有了调用HTK工具界面后,使用HTK工具非常简单。首先设置工作目录,在文件夹选项的操作中可以看到;然后设置需要的参数和文件,可以选择直接命令行方式,也可以采用辅助命令行方式;然后点击确定,再按一下执行就可以调用HTK工具。

(2) 调试界面设计。进行语音识别系统设计需要一个比较繁杂的过程,不可能不出现问题,比如路径设置错误,HTK工具出现bug或操作使用失误等等。因此必须提供一个良好的调试接口,用于观察HTK工具的操作结果,进而进行进一步的操作。HTK工具是一系列CUI程序,也就是说调用时将结果显示在控制台上,因此实际可以不需要设计调试接口,仅仅通过控制台可以观察输出结果。但是这样有一个缺点,无法方便保存调试结果,也违背本软件的设计目的,因此有必要转接到编辑器上显示。其过程大致为:首先将HTK工具输出到内存中,使用管道技术;然后将管道数据读到文本编辑器上显示。具体显示效果如10所示。 

图10 调试接口显示效果

(3) 自定义程序调用接口。由于HTK工具并不是万能的,因此有时候需要在调用HTK工具之前或者之后进行一些预处理或者后处理。比如增加一些语音增强程序或端点检测工具等等。还有就是有时候希望像HTK工具那样调用自己编写的程序,或者HTK工具名修改等等。所有这些都需要设计一个良好的程序接口。因此本设计设计了主程序接口和自定义程序接口。主程序接口主要用于设置标准HTK工具的调用界面对应关系,换句话说,修改这里的设置将导致前面HTK工具调用发生改变,软件启动时会恢复默认设置。这个功能可以用于将自定义的程序设置为标准调用,或者修改对应调用的HTK工具,主程序接口界面如11所示。自定义程序接口用于设置在标准HTK工具的调

11 主程序接口界面

用前后设置调用的程序,可以方便自定义程序的调用,也可以减少程序的多次调用,即一次实现多个程序的运行,当然这必须在合理设置文件目录情况下实现。自定义程序接口界面如图12所示。自定义程序接口有五个设置项,即意味可以同时设置五个自定义程序。下面介绍设置过程:假如现在有一个程序test.exe,希望在执行完HCopy.exe后执行,必须如下设置,选择接口一确认按钮,接口程序设置为test.exe;激活程序是标准HTK工具,属于main类,不需要改变;激活程序设置为HCopy.exe,由于在其之后执行,选择after。这样就可以实现在HCopy.exe运行后执行test.exe程序。

12 自定义程序接口界面

 

3、识别应用界面

通过前面这些设计,完全可以进行语音识别研究。但有些时候设计一个语音识别应用程序有很多重要的意义,其中进行演示就是最重要的一点。要设计一个基于HTK语音识别应用程序,既需要考虑HTK识别器的特点,也需要提供一个良好识别应用界面。本设计中的这个语音识别应用界面充分考虑了这些因素,不仅能够演示识别英语等语言,还可以实现汉语等语言识别演示。整个识别应用界面如13所示。整个界面分为六

13 识别应用程序界面

个部分:左边三个,右边三个。左上角窗口管理识别需要的文件,主要有训练好的模型,模型列表,词典,语法约束网络,参数文件等。左边第二个窗口用于管理测试语音文件,识别输入的文件如果保存会保存到该文件夹下。左边第三个窗口用于列出可以识别语句,或者其它内容。右边第一个窗口用于简要的显示波形曲线,当然这里采样不服从采样定理,仅仅示意而已。右边第二个窗口用于显示识别输出,为了让显示更明显,所以字号设置得比较大。右边第三个窗口用于显示识别结果,主要是观察识别结果是否正确,识别设置是否正确等。另外还有两个控制区域:左上角是一个按钮,用于设置识别程序的相关文件;右边是一排按钮,包括用于录音,播放语音文件的按钮,还有用于识别控制的按钮。如果要进行识别,必须按如下步骤进行操作:

(1) 添加模型文件。在左边第一个窗口内菜单下单击右键添加模型文件;

(2) 添加测试文件。在左边第二个窗口内菜单下单击右键添加测试文件;

(3) 设置识别文件。左键单击左上角按钮,弹出对话框,依次设置相应的文件和参数;

进行识别。如果想直接录音识别,单击录音按钮进行录音,结束按确定,然后按识别就进行识别,若想保存录音可以按保存键进行保存。如果想利用测试文件进行识别,左键双击测试语音文件,右边窗口会显示波形,然后按识别进行识别。在识别输出窗口可以看到识别结果。

 

4、语音文件录制

尽管实际有很多录音软件,但是它们要么太复杂,难于操作,要么不适合语音识别系统设计的需要。因此有必要设计一个适合HTK工具需要的录音器。本设计中的录音器的设就是完全是根据HTK的特点设计的,可以同时录制多个文件,然后通过动态命名的方式给所有文件编排,最后将所有文件保存到文件管理系统中设置的文件夹下,整个操作非常简单方便。录音器的界面如14所示。

使用录音器的步骤如下:

(1) 设定工作目录。工作目录对应的文件夹实际上就是用于保存录音文件的文件夹;

(2) 打开录音界面。点击录音界面按钮打开录音界面;

(3) 设定录音参数。在工具栏有一个设置按钮,按此按钮会弹出对话框,用于设置录音参数,如果设置之后需要修改录音参数,会弹出警告;

(4) 开始录音。点击录音按钮出现一个录音栏,该栏显示录音的动态波形。点击开始按钮开始录音,点击确定结束录音;

(5) 保存文件。点击保存按钮弹出保存文件对话框,设置合适的参数可以实现文件名的动态编排。如果需要删除某个文件,点击栏右上关闭按钮可以删除该文件。如果需要关闭所有的文件可以按主工具栏的关闭按钮。

14  录音器界面

第二篇介绍工具使用,并且把工具上传上来。。。




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%,识别效果非常好。当然这里仅仅给出了十个测试文件的测试结果,如果需要得到更可靠的结果,需要更多的测试文件。







WinHTK开发与使用三:连续语音识别

    本文接上文,介绍连续语音识别系统设计过程,演示视频见下载资源中。

二、连续语音识别系统设计

        上面讨论了一个简单的十个孤立数字识别系统的设计过程,可以看出比较简单,效果也非常好。下面将设计一连续语音识别系统,相比较于孤立词识别而言,它有很多不同的地方,且过程也比较繁琐复杂,识别效果并不是非常好(当然这是有很多原因的)。为了便于实现,识别任务主要是:识别一些简单的文档操作命令,比如复制,粘贴,删除等等。具体见语法约束中的描述。整个设计过程也分为四步。

1、数据准备

(1) 任务语法描述。这个系统识别任务为一些常见的文本编辑命令,具体包括43条语句,50个词汇。根据语法约束文件的格式描述语法,其对应的gram文件内容如下:

#选择命令

$ydir=(shang4 yi2)|(xia4 yi2);

$xdir=(qian2 yi2 ge4)|(hou4 yi2 ge4);

$selchar=xuan3 ze2 $xdir zi4;

$lp=hang2|ye4;

$sellp=xuan3 ze2 $ydir $lp;

$selcmd=$selchar|$sellp;

#删除,复制,粘贴,插入命令

$var=zi4|hang2|ye4;

$delcmd=shan1 chu2 xuan3 ze2 $var;

$copcmd=fu4 zhi4 xuan3 ze2 $var;

$pascmd=zhan1 tie1 xuan3 ze2 $var;

$inscmd=cha1 ru4 xuan3 ze2 $var;

#取消和重做命令

$cmd=(xuan3 ze2)|(shan1 chu2)|(fu4 zhi4)|(zhan1 tie1)|(cha1 ru4);

$cancmd=qu3 xiao1 $cmd;

$redo=chong2 zuo4 $cmd;

#查看命令

$view=((fang4 da4)|(suo1 xiao3)) cha2 kan4;

#翻页命令

$digit=yi1|er4|san1|si4|wu3|liu4|qi1|ba1|jiu3|shi2;

$gtpage=zhuan3 dao4 di4 $digit ye4;

#标记命令

$mark=(shi2 jian1)|(ye4 ma3)|(suo3 yin3);

$addcmd=tian1 jia1 $mark;

(sil($selcmd|$cancmd|$delcmd|$copcmd|$pascmd|$inscmd|$view|$gtpage|$addcmd) sil)

然后利用HParse工具转化成对应的SLF文件network.slf。其FSN形式由于比较复杂,故不列出。

(2) 词典准备。由于采用音素作为建模单元,因此需要给出发音词典。词典文件dict如下,共50个词汇(包含静音),为节省空间,分栏列出。实际要准备两个,一个有短暂停顿sp结尾和无sp结尾的词典,词典中的词必须按字母序排列好:


ba1             b a1 sp

cha1            ch a1 sp

cha2            ch a2 sp

… …           … …

chong2          ch ong2 sp

… …           … …


因为要转化成汉语输出,还需要转换文件translate,其功能是将发音输出转换成汉语输出。

(3) 语音录制。录制训语音样本,一共172条句子,对应43条语句,即每条语句说四遍,其中43条用于测试。采样速率为11.025khz16位单通道采样。对应语句标注如下:

*\train*--01.wav:xuan3 ze2 shang4 yi2 hang2

*\train*--02.wav:xuan3 ze2 shang4 yi2 ye4

*\train*--03.wav:xuan3 ze2 xia4 yi2 hang2

… … … … …

*\train*--41.wav:tian1 jia1 shi2 jian1

*\train*--42.wav:tian1 jia1 ye4 ma3 

*\train*--43.wav:tian1 jia1 suo3 yin3

(4) 数据标注。本系统采用flat start方式训练,也即连接词方式训练,不需要标注的边界信息,只需要给出相应的标注即可。因此语音文件的标注可以将上述文件通过WINHTK中的工具直接转换成MLF文件获得。由于MLF文件与上基本类似,故不列出。

(5) 编码数据。编码方案为:20ms汉明窗,10ms的帧移。采用12MFCC特征参数,能量参数,一阶,二阶动态参数,共39个系数。对应参数文件code.cfg内容如下: 


SOURCEFORMAT=WAV

TARGETFORMAT=HTK

SOURCEKIND=WAVEFORM

TARGETKIND=MFCC_E_D_A

ZMEANSOURCE=T

USEHAMMING=T

PREEMCORF=0.97

SOURCERATE=907

TARGETRATE=100000

WINDOWSIZE=200000

NUMCHANS=26

NUMCEPS=12

CEPLIFTER=22


由于静音也被当做语音进行建模,故不需要进行端点检测,因此这个参数文件相比较孤立词的要简单一些。

2、模型训练

        基于HTK的连续语音识别模型训练有两种方式:boot-strapflat start两种。boot-strap是指首先进行孤立词方式设置模型参数,然后再进行模型参数重估,其过程如1所示,这种方式需要手工标注语音文件,即需要边界信息;flat start方式则是首先采用全局均值和协方差设置模型参数,然后再进行模型参数重估,其过程如图2所示,对应的标签文件不需要边界信息。前者过程比较复杂,因此在这里采用第二种方


图1  boot-strap方式训练过程


2 flat start方式训练过程

式训练模型。另外在利用HERest进行HMM嵌入式重估过程中,经常需要不断修改HMM,再进行训练,这个过程往往需要重复多次,如3所示。具体过程如下所述:


 重估过程示意图

(1) 创建monophones

1) 首先将词层标签转换成音子层标签,利用HLed工具,调用形式:

HLed  -i phone.mlf -l * -d dict edit.led  word.mlf

输出音子层标签phone.mlf。其中dict为发音词典,这里用的词典是无sp结尾。word.mlf为词层标签,edit.led为其编辑文件,内容如下:

SO

EX

IS sil sil

2) 然后准备一个HMM模型定义文件hmm0,形式如下:

~o <VecSize>  39 <MFCC_E_D_A> 

<StreamInfo>3 13 13 13

~h "1hmm0"

<BeginHMM>    

<NumStates> 5 

<State> 2 

<Stream> 1 

<Mean> 13  

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

0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 

… … …

<Stream> 3  

    … … …

… … … …     

<State> 4  

… … …

<TransP> 5 

0.6 0.4 0.0 0.0 

0.2 0.4 0.4 0.0 

0.0 0.3 0.4 0.3 

0.0 0.0 0.6 0.4 

0.0 0.0 0.0 0.0 

<EndHMM>

并利用HCompV工具对模型进行初始化,调用形式:

HCompV -m -S train.scp -M newhmm -o hmm1 hmm0

输出设置参数后的HMM定义文件hmm1。其中train.scp为所有的训练文件列表,newhmm为输出HMM定义文件目录,hmm0为输入HMM原型定义文件。

3) 然后根据音子模型列表,利用WINHTK工具复制创建一系列HMM集,称为monophone

4) 接下来,用HERest对这些monophone进行训练。调用形式:

HErest -M newhmm -S train.acp -H hmm1 monophone.lst

其中monophone.lstHMM集列表,hmm1为输出hmm定义文件,newhmm为输出目录,train.scp为训练文件列表。连续进行两次。最后获得hmm3

5) 考虑停顿sp,修改sil模型。在这一步,首先,利用sil模型获取sp模型,sp

取三个状态,第二个状态对应sil的第三个状态。相应的HMM定义编辑文件edit.hed文件如下: 

AT 2 4 0.2 {sil.transP}

AT 4 2 0.2 {sil.transP}

AT 1 3 0.3 {sp.transP}

TI silsp {sil.state[3],sp.state[2]}

在后面使用带sp的词典获取音子层标签再用于后面的训练。

6) 模型训练,使用带sp的标签进行模型训练,连续两次,同步骤4。最后获得HMM定义文件hmm6

(2) 创建triphones

1) 将训练monophone时的上下文无关标签转换成triphone模型相对应的上下文相关标签,edit.led内容如下:

SO

WB sp

WB sil

TC

2) 利用上面获得monophone模型通过克隆产生triphone音子模型集,同时进行转移概率绑定。相应的HMM定义编辑文件edit.hed文件内容为:

CL triphonelist

TI tie_a1 {(*-a1+*,a1+*,*-x).transP}

TI tie_a2 {(*-a2+*,a2+*,*-x).transP}

TI tie_a3 {(*-a3+*,a3+*,*-x).transP}

… … … … … … … … …

3) 对triphone进行两次训练,最后获得HMM定义文件hmm9

(3) 创建 tied-state triphones

1) 对triphone模型进行数据驱动方式的状态绑定,相应的HMM定义编辑文件edit.hed内容如下:

RO 3 stats

TC 100 tc_a12 {(*-a1+*,a1+*,*-a1).state[2]}

TC 100 tc_a13 {(*-a1+*,a1+*,*-a1).state[3]}

TC 100 tc_a14 {(*-a1+*,a1+*,*-a1).state[4]}

TC 100 tc_a22 {(*-a2+*,a2+*,*-a2).state[2]}

… … … … 

2) 对绑定后的tied-state triphone HMM利用训练数据进行两次模型训练,最终获得HMM定义文件hmm12

3、识别测试

        下面利用HVite工具进行识别,其调用形式如下:

HVite –H hmm12 –S test.scp –l * -i  rec.mlf  -w network.slf dict triphonelist

rec.mlf为识别输出标注MLF文件。其中network.slf文件为语法约束转换成FSNSLF文件,hmm12为训练得到的模型集,triphonelist为相应的HMM列表。Dict为发音词典文件。test.scp中列出训练文件。

4、识别效果分析

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

HResults -A -T 0002 -n -L * -I trans triphonelist rec.mlf

其中trans为参考标准文件,triphonelisttriphone列表,rec.mlf为识别输出的标准文件。分析结果为:

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

Date: Thu May 21 20:24:58 2009

Ref : trans

Rec : rec.mlf

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

SENT: %Correct=72.09 [H=31, S=12, N=43]

WORD: %Corr=88.12, Acc=84.65 [H=178, D=2, S=22, I=7, N=202]

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

        从上可以看出识别效果并不是很好,句子的正确识别率仅为72.09%,词的正确识别率为88.12%。其主要原因是训练样本不足,另外就是HMM结构没有优化所致。有充分的训练样本的,训练好的模型在录音较好的环境下,百条语句的识别率可以上95%。


0 0