企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
如下图所示为HTK的训练流程: ![htk训练流程](https://box.kancloud.cn/b04cf62cc19eeea051b1d34f9410665a_1260x774.png) 从上图可以看到HTK的训练流程主要分为四个阶段:数据准备阶段、训练阶段、测试阶段、分析阶段。 **数据准备阶段:** 为了获得HMM的信息,我们需要一系列语音数据和其对应的抄本。**原始的语音数据必须被转化为参数向量的形式,原始的抄本必须被转换为音素或词标签的形式**。HCopy用来脱机地处理原始语音文件,将其转换为参数向量地形式;HLEd用来将抄本转化为标签形式,HLEd会生成一个**主要标记文件**(MLF)来方便后续的处理。HLStats用来收集和展示label文件的一些统计特征。HQuant用来建立VQ密码本来准备建立**离散概率的HMM系统**。 **训练阶段:** 首先需要创建原始的hmm集合。被标注过词内边界(例如音素边界)的语音数据,称为引导数据(bootstrap data)。HInit和HRest可以用来训练孤立词。*每一个被需要的HMM会被独立地计算。HInit读取所有的训练数据,把所有的样例剪切为音素,然后用分段的k-means算法迭代地计算出初始的参数。在第一个周期,训练数据会被均匀分割,每个模型状态会与对应的数据段匹配,然后计算模型的误差。此时如果有混合高斯模型可用,则会使用一个改进的k-means算法;在之后的周期内,平均分段算法被维特比序列所代替,由HRest用前项后向算法来重新估算模型参数,当没有数据可用的时候,一个被称为flat start标志会被使用。接着由HCompV处理未被标记的语音,使得所有的语音数据上的均值和方差与引导数据上的相同。* 一旦初始的hmm集合被创建,HERest将会在整个数据集上做**嵌入训练**。HERest执行单独的前向后向算法对所有音素的hmm模型进行再估计(**这是在干什么**?)。对每一个语音的训练中,会将相应的音素模型都连接起来,然后对序列中的每个hmm用前向后向算法累计计算均值等数据,当处理完所有的数据之后,上面统计的数据将会被用来更新hmm的参数。 HTK系统认为对hmm的改进应当是增量的,因此系统先训练一个独立的hmm集合,然后逐渐地将其扩展到上下文相关的内容上。HHEd提供了将模型克隆到上下文相关的集合中的功能,然后可以用HERest训练。为了提升特定说话人识别的性能,可以用HERest和HVite来将hmm模型对特定说话人进行适配。 训练上下文相关的的hmm系统存在的一个最严重的问题是训练数据不够充足。模型越复杂就需要越多的数据来对模型的参数进行估算,而数据往往是有限的,因此需要在模型复杂性和数据可用想之间做一定的平衡。对于一个连续的系统,可以用上面提供的方法来找到两者之间的平衡。利用合并的数据可以更好的估计模型参数。另外,除了连续系统之外,HTK还支持**完全绑定系统**和**离散概率系统**。此外,为了解决数据不足的问题,HTK提供HSmooth工具来使参数分布光滑以减少所需要的训练数据。 HTK提供HVite来完成语音识别HVite需要用到语言模型和词格来作为输入的一部分。HVite用TokenPassing的方式实现了Viterbi算法,来完成语音的识别。HVite的输入是一个词网络、所有词的发音和一系列hmm。它将词网络展开成音素网络并将对应的hmm定义附在对应的节点上。识别对象既可以是录制好的音频文件也可以是音频输入。HVite接受的词网络可以是一元语法(这种情况下,我们认为每个词之后都可以跟任意的其他词)或者二元语法(用图表示的语法),词网络必须以标准的HTK的Lattice格式存储(SLF文件)。SLF文件是一种基于文本表示的文件,因此可以用任意的文本编辑器编辑,然而这是一项很乏味的工作,因此HTK提供两个工具来协助创建SLF文件,它们分别是HBuild和HLStats,HBuild允许你建立层级的词网络,HLStats的作用上文已经说过。 HParse允许你使用扩展巴科斯范式(EBNF)来生成等价的词网络。HSGen能够根据输入的词网络随机地输出该种语言的句子。**HDMan作用暂时不明白。** HLRescore是一个可以操控lattice的工具。它能够读取SLF文件,并对其执行以下的操作: * 从lattice中找一条最佳路径; * 用新的语言模型扩展lattice; * 将lattice转换为等价的词网络; * 计算lattice的统计特征; * 基于前向后向算法对lattice进行剪枝; * 根据一个语言模型,将词网络文件转换为lattice。 HLRescore所需要的lattice是一个DAG图,当图中有环时,HLRescore将抛出错误。 最后,识别系统的结果可以用HResults来统计。