HTKbook第一章

来源:HTKbook

第一章 HTK基础

图1

HTK是一个构建隐马尔科夫模型(HMMs)的工具。如图1所示,它主要包括两个阶段:

  1. HTK training tools:通过训练样本估计HMMs的参数及其相关的录音文本(transcriptions)

  2. HTK recognition tools:测试的未知文本语音由识别器转录(transcribe)

1.1 HMMS基本原则

如图1.1所示,语音识别系统通常会假设语音信号是把消息编码成由一个或多个符号组成的序列(symbols)。识别的过程就是解码,即把测试语音还原成强调的符号序列,连续的语音波形首先被转换为一串等长的离散参数向量。假设这个参数向量的序列恰好是语音波形的最佳表示,参数向量是以单个向量持续时间为基础,通常是10ms,在这个时间内语音波形可以认为是不变的。常用的典型参数是平滑的频谱(smoothed spectra)、LPC(linear prediction coefficients)+其他从中推出的表示。

识别器(recogniser)的作用就是把speech vectors sequences映射为underlying symbol sequences。这里有两个问题:

问题一:

  1. 从符号到语音的映射不是一对一的,因为不同的强调符号会发出相似的语音。而且由于说话人、说话态度、环境等的不同,最终的语音波形也会千差万别。

  2. 符号间的边界不能从语音波形中明显地识别出。

因此,不能把语音波形当成一串级联的静态模式(concatenated static patterns)。

问题二:

不知道单词边界的位置。这个问题可以通过增加孤立词识别这一条件避免。如图1.2所示,语音波形与单个符号(例如,单词)对应,单词都是从一个固定的字典里选出。所以,首先解决的是孤立词识别问题。

1.2 孤立词识别(Isolated Word Recognition)

令每个发音单词用语音向量序列或观察向量O表示,定义为:
1.1
(1.1)

其中 表示在 时刻观察到的语音向量。就可以认为孤立词识别问题是在计算:

(1.2)

其中 表示第 个词典词。这个概率不是直接计算的,而是由贝叶斯公式给出:

(1.3)

因此,给定先验概率 ,最可能的发音单词就仅仅取决于概率 。给定观察序列 的维数,从发音单词的样本直接计算联合条件概率 是很难实现的。然而,如果一个单词的参数模型假设是马尔可夫模型,当估计条件观察值密度 的问题被估计马尔可夫参数的简单问题代替,由观察向量计算 就可以实现了。

当然,所有的这些都要假设每个模型的参数{aij}和{bij}是已知的。这里依赖于HMM框架的魅力和能力。假定一组训练样本对应一个特定模型,根据一个稳定有效的重估过程可自动求出该模型的参数。因此,当每个单词都有足够多的具有代表性的样本时,一个HMM就可以构造出来了,其中隐含了对真实语音的所有的内在变化的模拟。图1.4描述了HMM在孤立词识别中的应用。首先,在词典中只有“one”,“two”,“three”三个单词的情况下,用各个词典词的许多样本训练出对应的HMM。然后,为了识别未知单词,计算各个模型生成该单词的似然,找出最有可能的一个模型,这就识别出了这一未知的单词。

1.3 输出概率


1.4 Baum-Welch重估








1.5 识别和Viterbi解码



1.6 连续语音识别

现在回到图1.1所示的语音产生和识别的概念模型,需要明白的是推广到连续语音只是简单地让HMM有序地连接在一起。序列中的每个模型和隐藏的符号直接对应。这些符号可能是针对连接语音识别(Connected Speech Recognition)的整个单词,或者是针对连续语音识别的子词(例如音素)。为什么存在没有输出的入口状态和出口状态呢?现在就很明显了,因为这些状态可以用来将各个模型连接在一起。

然而还得克服一些实际问题中遇到的困难。连续语音的训练数据必须包括连续语料,而一般对应到子词模型的每段语音的切分边界都是不知道的。在实际过程中,通常是人工标注少量的数据边界,这样,一个模型对应的所有语音片段都可以提取出来,也可以进行上述的孤立词训练。然而,用这种方法得到的数据是很有限的,并且模型估计结果也很差。此外,即使有了大量的数据,人工强行标记的边界也可能不是HMM使用的最佳边界。因此,在HTK中使用HInit和HRest初始化子词模型可视为引导(bootstrap)操作 。主要的训练阶段还是用工具HERest来完成,它用于嵌入式训练(Embedded Training)。

同孤立词训练一样,嵌入式训练也使用Baum-Welch算法,不同的是前者对各个模型单独训练,而后者是所有模型并行训练。它具体的工作步骤如下:

  1. 为所有模型的所有参数的accumulators分配空间,并置0。
  2. 得到下一个训练语料。
  3. 有序地联结和训练语料的符号脚本相对应的所有HMM,构造出一个复合的HMM。
  4. 对这个复合的HMM计算前向-后向概率。在复合模型中,包含不输出的状态,因此前向概率和后向概率的计算有所改变,但变动很小,这在第八章中将详细地讨论。
  5. 使用前向和后向概率计算在每一帧的状态占有概率,并用通常的方法更新accumulators。
  6. 从第二步开始重复上述操作,直到处理完所有的训练语料。
  7. 用accumulators计算所有HMM的新的参数估计值。
    多次重复这些步骤,直到达到要求的收敛为止。需要指出的是,虽然这个过程没有要求训练数据中的符号边界位置,但每个训练语料的符号脚本还是必须的。
    对于训练子词模型,Baum-Welch算法需要做的扩展相对Viterbi算法需要做的扩展来说要少一些 。
    在HTK中,Viterbi算法的另一表述形式为Token Passing Model 。简单地说,Token Passing Model明确地给出状态对齐路径的概念。假设在 时刻HMM的每个状态 对应了一个可移动的token,该token在其它信息中包含了局部log概率 。那么这一token就表示了观测序列 … 与在 时刻进入状态 的模型之间的一个局部匹配。这时可用token passing 算法来代替公式(1.31)表示的路径扩充算法,它在每一帧 都要执行。这个算法的主要步骤如下:

  8. 拷贝状态 中的每一个token,传给到所有的连接的状态 ,使用 增加所拷贝的token的log概率。

  9. 检查每个状态的token,留下最大概率的token,扔掉其他token。
    在实际中,处理不输出的状态时需要一些修改,但这些比较简单,如果token在入口状态,就假设路径延伸到 ,而在出口状态则延伸到 。
    用Token Passing Model的关键是因为它能很简单地扩展到连续语音的情形。假设HMM序列是一个有限状态网络。例如,图1.7显示了一个简单的网络,每个单词定义为基于音素的HMM序列,所有的单词是放在一个圆环里。在这个网络里,椭圆框表示HMM实例,方框表示word-end节点。这个复合网络正是一个大的HMM,应用了上面的Token Passing 算法。现在唯一的不同是比最优token的log概率需要更多的信息。当最优token到达语音结尾时,为了恢复识别出的模型序列,我们必须知道它通过网络的路径。

    ![](http://i.imgur.com/BNlnrDx.png)
    

    穿过网络的token路径的历史记录可以按照下面方式有效地记录下来。每个token带有一个“Word End Link”指针,当一个token从一个单词的出口状态(用穿过word-end结点表示)传到另一个单词的入口状态产生一个路径时,这一传输表示了一个可能的单词边界。因此生成一个称为“Word Link Record”(WLR)的记录存储该单词的刚刚出现的token和token链的当前值。那么这个实际的token链就是用一个新的WLR指针来代替,图1.8说明了这一过程。
    一旦处理完所有的未知语音,带有最优token(也就是最大log概率的token)链的WLR能够追溯得到最优匹配单词序列。同时如有需要,也能得到单词边界的位置。

    上面针对连续语音的Token Passing算法描述仅仅用于记录单词序列。如果需要,该原理还能用来记录在模型和状态级的决策,也能保存每个单词边界上更多的最优路径。这样就为生成hypotheses(译者注:意为可能的识别结果)的lattice(译者注:网格)提供了可能,lattice比单Best输出更有用。基于这个思想的算法称为lattice N-best。因为每个状态一个token,限制了可能得到的不同token历史记录的数量,所以他们不是最合适的。若每个模型状态对应多个token,并且如果认为来自不同前序单词的token是不同的,就可以避免上述限制。这类算法称为word N-best 算法,经验表明它的性能可以和最优的N-best算法相当。
    上面概述了用在HTK中的Token Passing的主要思想。这些算法植入到了库模块HNet和HRec中,它们会被识别工具HVite调用。它们提供单个和多个Token Passing识别,single-best输出,网格输出,N-best列表,支持上下文相关cross-word,lattice rescoring和forced alignment。

1.7 发音人自适应

虽然上面所讲的训练和识别技术能够产生出高效的识别系统,但如果对特定发音人的特征定制HMM,那么这些系统的效果将得到进一步的提高。HTK提供了HEAdapt和HVite工具,它们用少量的enrollment或自适应数据来执行自适应。这两个工具的不同之处在于,HEAdapt进行离线有监督的适应,而HVite识别自适应数据并使用生成的脚本来进行自适应。通常,HEAdapt提供的有监督的自适应更稳定一些,但是给定一个初始的已经很好地训练过的模型集,HVite仍然能显著地改善其效果。在第九章将描述自适应的细节及它在HTK中的使用。