您好,欢迎访问三七文档
第三章一个例子——使用HTK指南本章作为指南部分的最后一章,将描述构造一个简单的用于语音拨号的识别器的过程。这个识别器可以识别连续的数字串和有限个名字。由于这是一个子词[译者注:并非为整个单词建立模型,而是词的一部分建立模型,可理解成对音素建模](sub-word)识别系统,所以向词典中加入一个新的名字只需要修改发音词典和语法网络(taskgrammar)。HMM模型使用的是连续密度混合高斯模型,且使用决策树聚类的状态绑定的triphone。虽然这个语音拨号系统本身相当简单,但是系统的设计具有代表性,对学习HTK的使用很有帮助。我们将从无到有构建此系统,包括使用HTK工具HSLab录制训练数据和测试数据。为了简化,这个系统是说话人相关的,但是建造一个说话人无关的系统可以采用相同的设计方法。唯一的不同在于需要足够数量的不同说话人的数据,以及相应地增加模型复杂度。构造一个“全新”的识别器包括很多相关的子任务,而且没有一个明确的实现这些任务的最佳顺序。这里就按时间顺序来介绍,构造类似系统时可以参考本书介绍的步骤。本书剩下的部分相当详细地描述了完整的过程,并清晰地给出HTK工具集所涉及的范围。HTK的发行软件中也包含了一个用于ARPA海军资源管理任务的1000个词的识别系统的例子,放在HTK软件包的目录RMHTK下。在HTKDemo目录下有更多体现HTK性能和功能的实例。另外还可以在HTKTutorial目录下找到对学习指南部分有帮助的一些例子的脚本。这一章的指南里介绍的每个步骤,假定使用者在执行命令之前完全了解了所有部分,并对于每个HTK工具都可以参考第17章1(参考章节),所以所有的命令行参数和选项都应该是容易理解的。3.1数据准备任何构造识别器的工程的第一步都是数据准备。训练数据和测试数据都需要准备。在我们需要建造的系统里,所有的语音都需要由最原始的录音得到,而且需要对每句录音进行标注。测试数据的重要性在于,可以通过测试数据度量识别器的性能,选择测试语料的一种简单的办法是由目标语法随机生成。对训练数据来说,语料内容的标注和发音词典一起用于完成初始音素层的标注,而这个标注是开启HMM训练过程所必须的。因为实际可能要将任意名字加入识别器,所以训练数据应该尽量提高音素覆盖率和均衡性[译者注:训练数据各方面(比如音素覆盖、语法结构等)的均衡性对HTK训练极其重要,对识别来说,会提高识别器的鲁棒性和识别性能,对合成来说会提高合成语音的自然度]。这里为了方便,我们用于训练的使用的提示脚本是从TIMITacoustic-phonetic数据库获取的。根据上面的描述,在录数据之前,必须先定义音素集合、覆盖训练数据和测试数据的词典和目标语法。1指南的最后一部分涉及说话人相关系统中加入新的说话人的自适应方法HTKBOOKV3.2第页-1-3.1.1第一步——目标语法为电话拨号创建一个语音操作接口,是我们系统的最终目标。因此,识别器必须要能处理数字串和人名列表。典型输入可能是这样的:DialthreethreetwosixfivefourDialninezerofouroneohninePhoneWoodlandCallSteveYoungHTK规定了一个语法定义语言,用于制定简单的目标语法。如下所示,它包括下面一组变量定义规则,描述需要识别的词。语音拨号应用中,一个可能的语法如下:$digit=ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE|OH|ZERO;$name=[JOOP]JANSEN|[JULIAN]ODELL|[DAVE]OLLASON|[PHIL]WOODLAND|[STEVE]YOUNG;(SENT-START(DIAL$digit|(PHONE|CALL)$name)SENT-END)间隔符”|”表示几选一的,方括号”[]”表示可选项,尖括号””表示一个或可多个重复。一个完整的语法可以被描述成一个如图3.1表示的网络。HTKBOOKV3.2第页-2-上图中上层的目标语法描述是为了方便使用者。HTK识别器实际上需要的是一个使用更低层的符号定义的词网络,称为HTK标准网格SLF格式(HTKStandardLatticeFormat(SLF)),在SLF里,每个词的实例和词之间的转换都明确列出了。这种词网络可以使用HParse工具由上面的语法自动建立,比如,包含上面的语法的文件称为gram,执行下面的操作HParsegramwdnet将会建立一个等效的词网络并存储到wdnet文件中(如图3.2)。3.1.2第二步——词典建立一个词典的第一步是建立一个经排序的包含所有词的列表。在电话拨号任务中,建立一个所有词的列表可以轻松地手工完成。但是如果任务更加复杂,则应该根据训练数据中的例句建立词列表。此外,若建立一个鲁棒性声学相关模型,就需要使用一个包含很多词的并且音素更均衡的大的句子集合。因此,训练数据是由和电话拨号任务无关的英文句子组成。下面,给出一个由句子提示建立一个词列表的简单例子。这里训练用的句子都取自TIMIT数据库中使用的一些提示命令,并且为了便于处理,这些句子都重新编号。例如,开始一部分数据内容可能是下面这样的:S0001ONEVALIDATEDACTSOFSCHOOLDISTRICTSS0002TWOOTHERCASESALSOWEREUNDERADVISEMENTS0003BOTHFIGURESWOULDGOHIGHERINLATERYEARSS0004THISISNOTAPROGRAMOFSOCIALIZEDMEDICINE等等我们希望得到的训练词列表wlist可以通过下面介绍的方式自动生成。在使用HTK之前,首先需要以合适的方式编辑文本。例如,可能需要将所有的空格变成换行,然后使用UNIX命令sort和uniq对词进行排序,最终的结果是一行一词并严格按字母顺序排序。可以使用HTKTutorial目录中的脚本prompts2wlist完成此功能。词典本身能由标准的输入源用HDMan建立。举个例子,可以用BritishEnglishBEEP发音词典2。词典中的音标集合除重音记号之外都将被直接采用;并且在每个发音的后面都加上一个短暂的停顿(sp)。如果词典包含任何静音标记,则MP命令将把sil和sp合并成一个sil。这些操作都可以用HDMan和一个包含三行命令的编辑脚本来完成(保存在global.ded中)。ASsp2可通过匿名访问FTP:svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries/beep.tar.gz获得。需要注意的是应该移除词典开头的目录部分。HTKBOOKV3.2第页-3-RScmuMPsilsilsp其中,cmu表示采用了一种重音符号的风格,这种风格中,词汇的重读程度是通过直接写在音素名后面的单个数字表示的(例如,eh2表示次重读(level2stress)的音素eh)。命令HDMan-m-wwlist-nmonophones1-ldlogdictbeepnames会建立一个名为dict的新词典,通过搜索源词典beep和names,找到wlist中每个词的发音(见图3.3)。这里的wlist可以仅仅是一个对目标语法中出现的所有词进行排序得到的列表。其中,names是一个人工生成的包含目标语法中出现的每个名字的发音的文件。HDMan的命令选项-l表示将构造词典相关的各种统计数据输出到一个log文件dlog中。特别地,如果有些词在发音词典中没有出现,它将给出提示。HDMan也能输出一个词典中出现的音素列表,这里称为monophones1。一旦训练和测试数据录好后,将根据每个音素重估出一个HMM。通常每个词典的词条格式如下:WORD[outsym]p1p2p3....方括号中的字符串指定词被识别出后的输出,缺损的输出是词本身。如果是空字符串,则表示没有任何输出。让我们来看看词典是什么样子,下面列出了一部分词典内容:AahspAaxspAeyspCALLkaolspDIALdayaxlspEIGHTeytspPHONEfownspSENT-END[]silSENT-START[]silSEVENsehvnspTOtaxspHTKBOOKV3.2第页-4-TOtuwspZEROziarowsp需要注意的是某些词比如A和TO有多种发音。SENT-START和SENT-END的实体有一个静音模型sil作为它们的发音,并且输出的是空符号。3.1.3第三步——录数据我们使用HTK工具HSLab录取训练和测试数据。这是一个结合了录音和标注功能的工具。在我们的例子里,仅使用HSLab来录音,因为标注已经存在了。如果没有预先准备好的训练语料(如TIMIT数据库中的数据),你可以使用HSLab通过文本(上面介绍的那样)建立它们,或者使用HSLab标注你的训练语料。HSLab按如下的方式调用HSLabnoname执行命令后,将显示这样的窗口,窗口上半部分是一个波形播放区域,下半部分是一排按钮,包括录音按钮等。如果一个文件名当作命令参数,HSLab将播放这个文件。这里,指定的文件名是noname,指明了将要录新的数据。HSLab并不给用户特别的提示,只要录音按钮被按下,它就将录得的数据交替地写到noname_0,noname_1,….这些文件里,因此很容易写一个shell脚本,当有noname_0之类的文件出现时,就输出提示信息,并按照事先约定的提示方式重命名文件(如图3.4所示)。当训练语料句子的提示按上面的方法生成后,测试语料句子的提示在录音前也要生成。工具HSGen可以帮助我们完成测试句子提示的生成;HSGen能随机的遍历一个词网络并输出穿越过程中遇到的每个词。例如,下面的命令HSGen-l-n200wdnetdicttestprompts将创建一个包含200个词的测试语料,内容可能是下面这样的:1.PHONEYOUNG2.DIALOHSIXSEVENSEVENOHZERO3.DIALSEVENNINEOHOHEIGHTSEVENNINENINE4.DIALSIXNINESIXTWONINEFOURZERONINEEIGHT5.CALLJULIANODELL...etc可以用它生成测试数据所需的提示文件testprompts。3.1.4第四步——建立标注文件HTKBOOKV3.2第页-5-在训练一套HMM集合时,每个训练数据文件都必须对应一个音素级的标注。如果没有手工标注的数据用来开启初始(bootstrp)的模型训练,可以采用一种被称为flat-start的方法来代替。这种方法中,需要两套音素标注,开始使用的脚本中词之间不包含短暂停顿模型(sp),一旦一套合理的音素模型建立后,sp模型将被插入到可能有停顿的词之间。两种音素标注的起始点都是一个按HTK标签格式规范的标注,可以很容易地用文本编辑器或脚本语言创建。在RMDemo的point0.4中能找到生成这种脚本的一个例子。另外,HTKTutorial目录下提供了脚本prompts2mlf,完成的功能是将上面例子的提示语料转化成下面的格式:#!MLF!#*/S0001.labONEVALIDATEDACTSOFSCHOOLDISTRICTS.*/S0002.labTWOOTHERCASESHTKBOOKV3.2第页-6-ALSOWEREUNDERADVISEMENT.*/S0003.labBOTHFIGURES(etc.)我们可以看到,提示标注要转换成“路径名”(pathname),每个词单独作为一行,并且每个语料按照自己的周期终止。文件第一行指明了文件是MasterLabelFile(MLF)。这个例子里,一个文件包含了全部的标注。HTK也允许每个标注拥有各自的MLF文件,但是全部存在于同一个MLF中更加有效率。MLF中使用的“路径名”格式需要解释一下,因为实际上,它是一种模式(pattern)而不是名字(name)。HTK处理语音文件时,需要找和语音文件名字相同但
本文标题:HTK手册_第三章
链接地址:https://www.777doc.com/doc-3095457 .html