HTK源代码分析.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HTK源代码分析 陈光 2009-8-6 HTK工具包主要功能是计算。包括: 声音编码运算,音频采样数据到频域信号的转换; HMM模型训练,使用前向-后向的递归算法,计算出HMM模型的参数; 数据识别,对于给定的数据在有哪些信誉好的足球投注网站空间内寻找具有最大概率的匹配模型; 数据运算过程 计算工作基本都在内存中完成,计算结果会保存到硬盘保存,例如wav数据,mfcc数据以及HMM模型数据,都需要保存到硬盘中以备使用。 1 HTK基本数据结构 1.1 HMM模型 HMM模型是最重要,也是最复杂的一个数据结构,其复杂性来源于模型自身结构的复杂。在HTK手册中,一个典型的HMM结构如下图,由多个状态和一个转移矩阵构成,每个状态内有多个数据流,每个数据流的分布又由多个多元正态函数叠加而成。而每个多元正态函数,则包括均值向量、方差向量。这是一个典型的层次结构,是Composite模式。 为此,HMM模型的数据结构定义为 其中的transP是转移矩阵,svec是状态向量,这两个成员是HMM的核心元素。SMatrix是矩阵类型,HTK中的矩阵定义的相当随意,就是指针的指针,纯粹的数据,没有控制数据,所有的矩阵运算都在函数中完成。 Svec向量是从2到numState-1,因为没有将起始状态和结束状态算进来。下面看一下StateElem结构体,它内部只有一个指针,指向StateInfo结构体,StateInfo结构体才是真正的状态信息定义。那么有一个疑问,为什么要使用一个间接指针呢? 其中pdf是一个指向该状态内部数据流数组的指针,StreamElem定义了一个数据流的信息,这个结构体倒是简洁明了,只包含了高斯分量的数目和数组定义。 Pdf: Probability Density Funcfion, 即概率密度函数。 其中spdf成员是该数据流内部的高斯分量数组,类型为MixtureVector,即混合分量的向量。注意这里的spdf不再使用指针的形式来引用内部的数组了,但实际上,MixtureVector就是一个指针,只不过是一个通过union定义的指针,用于指向不同类型的HMM的高斯分量数组。 最终hmm-svec[state].info-pdf[stream].spdf.cpdf[mixture]-mpdf才是到达了一个真正的多元正态分布参数的定义,即结构体MixPDF。 数据名称 类型 说明 Mpdf (Mixture PDF) MixPDF* 高斯分量的概率密度函数 Cpdf (Continous PDF) MixtureElem*n 数据流的概率密度函数 Spdf (Stream PDF) MixtureVector 数据流的概率密度函数,通过union类型分为三类:连续的、绑定的、离散的 Pdf StreamElem*n 状态的概率密度分布 下图是整个层次结构的示意图。有图可见,每种子元素都是以数组的方式进行组织的。这使得寻址更快,提高了运算效率。 HMM层次结构图 1.2 数学元素 HTK中大量使用矩阵,向量及其运算。如何定义高效的数据结构至关重要。HTK中的数学元素的定义,异常简洁,这可能是处于运算效率的考虑。 1.3 内存管理 由于涉及大量数据在内存中的运算,因此,如何管理堆内存也是值得考虑的问题,同样处于效率的考虑,HTK在原始的malloc之上定义了自己的内存管理机制。它定义了三种堆: MHEAP,随机顺序的固定大小对象, new/free操作以及全局reset功能; MSTAK,LIFO顺序的可变大小对象, new/free操作以及全局reset功能; CHEAP,随机顺序的可变大小对象,new/free操作,但没有reset功能; 除CHEAP外,堆内存的分配都以block为单位,块的大小会根据growf因子而增长。当MHEAP内的对象被释放时,它占用的block将被释放,变为空闲块。可以是用ResetHeap函数释放堆内的所有对象,对于MSTAK堆来说,这是个操作并没有太大开销。 块是一种什么单位呢?对于MHEAP来说,一个块内可以容纳多个对象,因为对象大小固定,而对于MSTAK来说,一个块是以字节计数的。定义如下。 每个内存堆中有一个块的链表,每当需要为堆分配新的块时,需要使用growf来确定新的块的大小。块与堆的关系如下图所示。 堆与块 1.4 音频数据 音频采样以WAV格式保存,加载到内存中后,会被编码为频域数据,例如MFCC数据。这种数据是HTK直接处理的形式,每个音频被认为是观察向量的序列,使用Observation结构表示一个观察向量。 观察向量数据表示方式有两种,可以是一组向量,每个向量代表一个数据流,也可以是一个整型数组,其中每个数值表示一个数据流,该数值是在编码簿中的索引值。 H

文档评论(0)

xingyuxiaxiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档