语音识别HTK代码学习手册
MatLab环境下调用HTK的连续语音识别方法

MatLab环境下调用HTK的连续语音识别方法【摘要】本文根据HTK(HMM Toolkit)的基本原理,在MatLab环境下通过调用HTK各命令实现小词汇量连续语音识别。
采用HTK工具包搭建语音的隐马尔可夫模型(HMM),再利用MatLab循环编程开发进行仿真实验,避免了传统地逐步运行HTK各个命令的冗余操作,降低了操作复杂度。
【关键词】HTK;语音识别;隐马尔可夫模型Abstract:According to the basic principle of HTK(HMM Toolkit),small vocabulary continuous speech was recognized based on HTK by MatLab programming in this thesis.This thesis used HTK to build HMM model and then used MatLab to program it to do speech recognition,thus it avoided the redundancy of operating single HTK command,and the complexity was reduced.as well.Key words:HTK;Speech Recognition;Hidden Markov Model一、引言语言是交流的最自然方式,它为人机交互提供了一种有效的方法。
但目前人与机器的交互方式多以键盘和鼠标为主,为了让机器与人能够更好地进行交互,出现了基于语音识别的系统使人机对话成为可能。
语音识别就是让计算机通过识别和理解把人类的语音信号转换为相应的命令或者文本的一门技术。
HTK(HMM ToolKit)[1][2]工具包是英国剑桥大学专门开发用于建立和处理隐马尔可夫模型的实验工具包,广泛应用在语音识别领域,在语音合成和字符识别等其他领域也有所应用。
HTK Book 第一篇 教程概览

第一篇教程概览 1 HTK基础1.1MM基本原理1.2立词识别1.3出概率说明1.4aum-Welch Re-Estimation1.5别和Viterbi解码1.6续语音识别1.7话者适应2 HTK工具包概览2.1TK软件架构2.2TK工具的一般属性2.3具包2.3.1据准备工具2.3.2练工具2.3.3别工具2.3.4析工具2.4本3.4中的更新2.4.1本3.3中的更新2.4.2本3.2中的更新2.4.3本3.1中的更新2.4.4本2.2中的更新2.4.5本2.1中的新特征3 一个教程示例3.1据准备3.1.1骤一任务语法3.1.2骤二字典3.1.3骤三录制语音数据3.1.4骤四创建脚本文件3.1.5骤五语音数据编码3.2建单元音HMM3.2.1骤六创建Flat start单元音3.2.2骤七确定Silence模型3.2.3骤八Realigning训练数据3.3建Tied-Stated三元音3.3.1骤九从单元音创建三元音3.3.2骤十创建Tied-Stated三元音3.4别器评估3.4.1骤十一识别测试数据3.5行识别器3.6MM自适应3.6.1骤十二准备自适应数据3.6.2骤十三生成Transforms(转移矩阵)3.6.3适应系统评估3.7emi-Stated和HLDA Transform3.8结第一章HTK基础HTK是一个用于构建隐马尔可夫模型(HMM)的工具包。
隐马模型可用于对任意时间序列建模,与此类似,HTK的核心部分也是具有通用性的。
然而,HTK主要还是用于构建基于HMM的语音处理工具,特别是语音识别工具。
因此HTK的在基层架构上提供的功能,主要是为了完成这个任务。
如上图所示,这个任务主要由两个阶段构成。
首先,HTK的训练工具基于语音数据和关联的脚本进行HMM参数的估算,其次,未知的语音数据被HTK的识别工具识别,输出识别结果。
本教程主要关注于以上两个处理过程的机制。
然而在深入细节之前,理解HMM的一些基本原理是有必要的,对HTK工具包有一个大概的认识也是有帮助的。
HTK2

识别结果评估: N −D−S ×100% Correct= N
Accuracy = N −D−S−I × 100 % N
应用HTK建立连续语音识别的实例
数据准备 创建模型及学习
单音素模型 三音素模型 状态捆绑 增加高斯混合模型的个数
识别及评估
数据准备
训练及待识别语音文件(.wav) 训练语音包含的所有词(wlist) 训练语音的词级标注文件(.lab 或 word.mlf) wlist中词的发音词典dict(见附)
可根据实际问题需要适当增加高斯模型个数
识别及评估
识别HVite
HVite -H hmm15/macros -H hmm15/hmmdefs -S test.scp -l ’*’ -i recout.mlf -w wdnet -p 0.0 -s 5.0 dict tiedlist 词级、音素级、三音素级识别结果
应用HTK建立连续语音识别系统
------------王风娜
基本内容
知识回顾
HTK工具包 基于HMM的连续语音识别
应用HTK建立连续语音识别系统实例
知识回顾
HTK工具包
数据准备工具
HDMan、HCopy、HLEd、HSGen、HBuild、HLStats 、HParse
模型训练及优化工具
HERest、HInit、HRest、HHEd、HCompV
识别工具
HVite
性能评估工具
HResults、HRec
基于HMM的连续语音识别系统
HMM
三个基本问题:推理、学习、识别
模型初始状态 转移矩阵
ห้องสมุดไป่ตู้
λ ={π, A, B}
状态产生观测向 量的概率分布
MatLab环境下调用HTK的连续语音识别方法

Ab s t r a c t :Ac c o r d i n g t o t h e b a s i c p r i n c i p l e o f HTK( HMM T o o l k i t ) ,s ma l l v o c a b u I a r y c o n d n u o u s s p e e c h wa s r e c o g n i z e d b a s e d o n HTK b y Ma  ̄a b p r o g r a mmi n g i n t h i s t h e s i s . T h i s t h e s i s
r e d u c e d . a s we l 1 . Ke y wo r d s : HTK ; S p e e c h R e c o g n i i t o n ;Hi d d e n Ma r k o v Mo d e l
一
、
引言
三 、H T K 的调用 M a t l a b 调用H T K 各命令可 以通 过d o s 语句或 者s y s t e m 语 句 以及 用M a t L a b 语言编 写 出H T K 各 命 令运行时 所需的参数 的得 以实现 。例如生成 H T K 可 用的语 音识 别网络 ,M a t l a b 语句 可 以表 具。 示为 d o s ( ’ H p a r s e% s 0 u t p u t \ \ d i g i t . n e t ’ , 数据准备 工具:用A d o b e A u d i t i o n 录音软 h t k P a r a m . g r a m m a r F i l e ) ,其中H p a r s e 为H T K 中 件 采集语 音信号 ,再 完成建立语 料库 ,语 法定 生 成识别 网络 的命令 ,% s 代 表调 用h t k P a r a m . 义 ,字典 定义 ,标注 数据 ,提取 特征等过 程。 g r a m m a r F i l e 文件 ,该 文件是 事先 定义好 的语 语 法定义 是以特定 的文 法结构对 发音词汇进 行 法文 件 ,即汉语 无调 音节 的集总 。d i g i t . n e t 限制生成符 合发音语 法的语句 ,用命令H P a r s e 为生 成的识别 网络,生成后将 保存在o u t p u t 文 和} Ⅱ 3 u i l d 来 实现 。字 典定义可根据 实际要 求来 件夹 下。 定 义结构 ,如 音素 ,音节等 。本文 采用无 调音 M a t l a b 调用H T K 各命令 的部分代 码如 下: i f p r i n t o pt , 节对 连续汉 语进行 识别 J 。数据标注 利用命令 表1不同特 征参数的识别率 ( % ) f p r i n t f ( I . 2 : 无 调单 音节的列表 H L E d 来 实现 。特 征参数 利用H C o p y 来提 取 。常 用 的特 征参 数有线 性预 测系数 ( L P C ) 和 梅尔频 的生成 % s \ n ’, h t k P a r a m . p h o n e M l f F i l e ) ; 率倒 谱系 数 ( C c ) 。 分 析表 1 可知 ,采用梅 尔频 率倒谱 系数 进 H M M  ̄ I f 练工 具 :H M M i J I I 练 在语 音 识别 系统 行特征 参数 的提取 时语音识别 率 比采用线 性预 的搭 建过程 中发挥着重 要作用 ,它 的主要 目的 测系数 时的识别率 高3 . 6 % 。因此 ,本文特 征参 是 训练得  ̄ I H M M 模 型 。本 文使 用命令 H C o m p v 估 数采用梅尔频率倒谱 系数 。
基于HTK的命令字识别系统

基于HTK的命令字识别系统编号毕业设计说明书题目基于HTK的命令字识别系统学院专业学生姓名学号指导教师职称讲师题目类型理论研究实验研究工程设计工程技术研究软件开发年月日摘要语音识别技术经过半个世纪的发展目前已日趋成熟其在语音拨号系统数字遥控工业控制等领域都有了广泛的应用语音识别技术就是让机器听懂人类的语音并执行相关的动作是一个研究的热点数字语音识别是语音识别一个极其重要的分支其在现实生活中的应用愈加广泛由于目前常用的声学模型和语言模型的局限性计算机只能识别一些词汇或一些句子语音识别系统在语种改变时往往会出现错误的识别结果针对上述问题结合隐马尔可夫模型原理在HTK语音处理工具箱的基础上构建了中英文特定词语音识别系统该系统通过代码控制整个构建过程使其在更换新的训练数据和词典后能快速生成对应的识别模型HTK 是英国剑桥大学开发的一套基于C 语言的语音处理工具箱广泛应用于语音识别语音合成字符识别和DNA 排序等领域从HTK 的基本原理和软件结构出发设计了一个基于HTK 的数字语音识别系统并验证了其识别效率本文基于隐马尔可夫模型 HMM 的连续语音训练和识别算法理论结合梅尔频率倒谱系数 MFCC 提取技术单音素HMM建模技术基于上下文相关的三音素HMM建模技术以及基于维特比算法的识别技术等一系列技术利用隐马尔可夫模型工具箱 HTK 构建了基于HTK的连续语音识别实验平台随后通过更换识别单元更改特征参数的维数和增加高斯混合分量的个数来考虑不同因素对系统性能的影响最后通过比较试验验证了识别单元高斯混合分量的数目以及MFCC 维数的适当组合可提高系统的正确识别率实验结果表明随着HMM从单音素建模到三音素建模的转换测试语句在语句级和字词级的识别率都呈增加的趋势捆绑三音素后识别率达到稳定状态关键词语音识别隐马尔可夫模型隐马尔科夫工具箱梅尔频率倒谱系数识别单元AbstractHaving developed about 50 years the speech recognition SR technique has a wide range of applications inmany fields such as voice dialing system digital remote control and industrial control Speech is an important tool for people to communicate with machines Digital speech recognition is an extremely important branch of speech recognition Its application in real lifeis used more and more widelyBut the limitation of acoustic and language model is that the computer can only recognize some words or sentences When the speech language changesthe system often gets wrong results To address the problem above the speech recognition system has been built on the basis of HTK as well as hidden markov model theory Controlling the building process by code the system can quickly generate a new recognition model when the training data and dictionary has changedHTK is a C language-based toolkit developed by CUED mainly used for speech signalreorganization speech synthesis character reorganization DNA compositor and so on From HTKs general principlesand software architecture this paper designs a digital speech recognition system based on HTK and verifies itsrecognition efficiencyA continuous speech recognition experimental platform was built based on HTK HMM Toolkidusing HMM Hidden Markov Model theory and a series of technologies such as MFCC Mel-Frequency Cepstral Coefficients mono-phone modeltri-phone model and Viterbi algorithm.Then by changing the identification unit and MFCC dimension and by increasing the number of gaussian mixture components it considers effects of different factors on the performance of the system Finally through the comparing test it verifies the right combination of the identification unit and the number of gaussian mixture components and also proves that MFCC dimension can enhance the systems correct rate Experiential results showed that as the HMM changed from mono-phone model to tri-phone modethe recognition accuracy of statement-level and word-level were both increasedand reached a higher level after Tied-State Tri-phone model was employed.Key words speech recognition HMMHTK MFCC identification unit目录引言·············································································1 语音识别介绍 (5)11 语音识别系统概 (5)12语音识别研究的现实意义 (5)13 语音识别技术的研究现状···············································2 HTK简介 (5)21 HTK原理 (6)22 HTK的应用 (6)23 HTKLib 和 HTKTools (6)24 HTK安装 (6)3 设计内容与设计指标·················································31 系统设计内容 (7)32 系统整体构造框图 (7)4 系统搭建思路和具体步骤 (7)41 搭建前的准备工作 (8)com 录音文件 (7)com 手动生成文件 (7)com 自动生成文件 (7)42 数据准备 (8)com 建立任务语法grammar (8)com 建立字典文件 (9)43 创建单音素HMM模型 (10)com 创建音素水平副本文件 (11)com 创建flat start的单音素 (11)44 创建主文件和主宏文件 (12)comSP的发音文件 (12)com 创建HMM定义和宏文件 (13)com 重复训练数据 (14)45 固定静止模型 (14)com 在现有基础上加入SP (14)com 合并SPSIL模型状态 (14)com 对训练结果加入SP模型并训练 (15)com 对训练结果进行高斯扩展 (16)46 识别和结果分析 (16)com HviteHResults功能介绍 (14)com 用未高斯扩展模型识别 (14)com 用已高斯扩展的模型识别 (14)com 分析识别结 (14)6附录 (19)引言随着计算机与信息技术的继续发展语音交互技术必将成为人机交互的必要手段语音识别技术就是让机器听懂人类的语音并执行相关的动作是一个研究的热点语音识别系统根据不同的准则可以分为孤立词连接词和连续词识别小词汇量大词汇量识别特定人非特定人的语音识别系统连续数字语音识别是语音识别的一个重要分支数字语音识别尤其是连续数字识别无论在大词表的语音识别系统还是小词表语音识别系统中都具有重要的意义因此它在现实中具有广泛的应用前景在互联网通信军事国防人机交互等方面都有重要的应用价值虽然这方面的研究有很多但目前仍有许多问题有待进一步探索本文结合隐马尔可夫模型原理利用HTKHMMToolKit语音处理工具箱实现了数字语音识别系统的设计并且从识别单元音节和声韵母更改特征参数的维数和增加高斯混合分量的个数来考虑选取不同因素的情况下对本系统性能的影响最终通过实验证明了识别单元高斯混合分量的数目以及MFCC 维数的适当组合可提高系统的正确识别率隐马尔可夫模型是一种用参数表示的用于描述随机过程统计特性的概率模型它是由马尔可夫链演变而来的如果在分析的区间内信号是非时变或平稳的那么用线性模型就可描述它但如果在分析的区间内信号是时变的则线性模型的参数也是时变的所以最简单的方法是在极短的时间内用线性模型参数来表示然后再将许多线性模型在时间上串接起来这就是马尔可夫链由于不能准确地确定信号的时长所以用马尔可夫链描述时变信号不是最佳和最有效的而隐马尔可夫模型既解决了短时模型描述平稳段的信号又解决了每一个短时平稳段是如何转变到下一短时平稳段的问题它利用概率及统计学理论成功地解决了如何辨识具有不同参数的短时平稳的信号段以及如何跟踪它们之间的转化等问题由于语言的结构信息是多层次的除了语音特性外还牵涉到音长音调能量等超音段信息以及语法句法等高层次语言结构的信息而隐马尔可夫模型既可描述瞬变的随机过程又可描述动态的随机过程的转移特性所以它能够利用这些超音段和语言结果的信息1 语音识别介绍11 语音识别系统概述语音识别是解决机器听懂人类语言的一项技术作为智能计算机研究的主导方向和人机语音通信的关键技术语音识别技术一直受到各国科学界的广泛关注广泛意义上的语音识别按照任务的不同可以分为4个方向说话人识别关键词检出语言辨识和语音识别说话人识别技术是以话音对说话人进行区别从而进行身份鉴别和认证的技术关键词检出技术应用于一些具有特定要求的场合只关注那些包含特定词的句子例如对一些特殊人名地名的电话监听等语言辨识技术是通过分析处理一个语音片断以判别其所属语言种类的技术本质上也是语音识别技术的一个方面语音识别就是通常人们所说的以说话的内容作为识别对象的技术它是4个方面中最重要和研究最广泛的一个方向语音识别本质上是一种模式识别的过程未知语音的模式与已知语音的参考模式逐一进行比较最佳匹配的参考模式被作为识别结果图1 是基于模式匹配原理的自动语音识别系统原理框图12 语音识别研究的现实意义如今随着语音识别技术研究的突破其对计算机发展和社会生活的重要性日益凸现出来目前代表连续语音识别技术最高水平的是非特定人无限词汇的连续语音识别系统汉语数字语音识别尤其是连续数字识别无论在大词表的语音识别系统还是小词表语音识别系统中都具有重要的意义因此对它的研究具有很强的应用价值以语音识别技术开发出的产品应用领域非常广泛如在汉语小词表语音识别工作任务方面声控电话交换信息网络查询家庭服务宾馆服务医疗服务银行服务工业控制语音通信系统等几乎深入到社会的每个行业和每个方面同时在大词汇量语音识别中数字语音识别也有重要的意义这是因为汉语数字语音具有高度的混淆性采用普通的识别方法很难达到很好的识别性能而语音中的数字往往具有重要的意义其识别错误的代价可能会高于其他语音识别的错误这就需要专门对数字语音的识别采用特殊的方法以提高其识别率另外对汉语连续数字语音识别的研究也具有重要的理论意义一方面完成对汉语连续数字语音识别可以促进其他词表的连续语音识别的研究其声学模型搜索算法等都可以照搬到其他系统中去另一方面研究如何消除汉语数字语音的混淆性也可以对其他易混语音识别任务起到借鉴作用13 语音识别技术的研究现状语音识别在未来具有巨大的发展前景国外公司如IBMMicrosoft 在90 年代就开始进军中国市场如1997 年IBM 公司抢先在中国大陆市场推出了语音识别产品IBMViavoice一年时间内占领了大陆近90的市场份额获取了上亿元的利润我国语音识别研究工作起步于五十年代但近年来发展很快研究水平也从实验室逐步走向实用从1987 年开始执行国家863 计划后国家863 智能计算机专家组为语音识别技术研究专门立项每两年滚动一次我国语音识别技术的研究水平已经基本上与国外同步在汉语语音识别技术上还有自己的特点与优势并达到国际先进水平其中具有代表性的研究单位为清华大学电子工程系与中科院自动化研究所模式识别国家重点实验室语音识别在实验室环境下已经取得了良好的效果因此90 年代至今语音识别技术开始向实用化发展主要研究方向就是修改原有的理论来解决新三难问题比如在噪音语音分离方面寻找新的更加具有鲁棒性的声学特征来更好地去除噪声的影响使用麦克风阵列技术区分不同方位的声源达到分离语音噪音的目的和人脸识别相结合来识别语音在隐马尔可夫模型 HMM 方面提出了各种新的HMM如线性预测HMM时间驻留状态HMM基于最大互信息准则 MMI 的HMM 等等针对汉语的特点运用语言学的知识来改进识别效果如对声母韵母采取不同的处理或者将各个音素进行聚类分析再分别处理等等语音作为当前通信系统中最自然的通信媒介语音识别技术是非常重要的人机交互技术随着计算机和语音处理技术的发展语音识别系统的实用性将进一步提高应用语音的自动理解和翻译可消除人类相互交往的语言障碍国外已有多种基于语音识别产品如声控拨号电话语音记事本等的应用基于特定任务和环境的听写机也已经进入应用阶段这预示着语音识别技术有着非常广泛的应用领域和市场前景随着语音技术的进步和通信技术的飞速发展语音识别技术将为网上会议商业管理医药卫生教育培训等各个领域带来极大的便利其应用和经济社会效益前景非常可观2 HTK简介HTKHidden Markov Model Toolkit是一个工具箱用于搭建Hidden Markov 模型HMM21 HTK原理HTKHidden Morkov Model Toolkit是英国剑桥大学工程系开发的一套构建隐马尔可夫模型HMMs的工具集HTK 工具箱是使用HMM 模型作为语音识别核心的当HMM 应用于孤立词语音识别时它用不同的隐含状态转移描述不同的语音发音对于连续语音识别系统多个孤立词HMM子模型按一定的语言模型组成的复合HMM 模型序列来刻画连续的语音信号在序列中的每个模型直接对应于相关的发音在孤立词识别中对于训练数据需要为每一个发音单元提供边界信息常使用手工标注的方法实现一般情况下在连续语音识别的模型训练中发音单元的边界信息是不需要的只需要包含相应的发音序列的描述文件在HTK 中使用MLF 格式的文件来描述发音序列其广泛应用于语音识别语音合成字符识别和DNA 排序等领域但工具集设计的目的主要是建立语音识别系统语音识别技术主要有特征提取模型训练以及模式匹配准则三个方面此外还涉及到语音识别单元的选取语音识别系统主要包括语音特征参数的数据准备工具模型训练工具语音识别工具和模型分析工具目前HTK 的稳定发行版本是34 版本所有代码使用 c 语言编写可以在Windows和Linux 上编译使用HTK 的特点是开放源代码用户可以在分析其代码的基础上对某些算法和模块进行修改HTK 工具包的结构如图2 所示图 2 HTK工具包结构图22 HTK的应用隐马尔可夫模型HMM是20 世纪70 年代引入了语音识别领域它的出现使得自然语言识别系统取得了实质性的突破HMM 已经成为语音识别的主流技术目前大多数的语音识别系统都是基于它的HTKHMM tools kit是剑桥大学开发的一个专门用于建立和处理HMM 的实验工具包主要应用于语音识别领域也可以应用于语音合成字符识别和DNA 排序等领域HTK 经过剑桥大学Entropic 公司以及Microsoft 公司的不断增加和改进使其在语音识别领域处于世界领先水平另外HTK 还是一套源代码开放的工具箱其基于ANSI C 的模块化设计方式可以方便地嵌入到用户系统中23 HTKLib 和 HTKTools对于HTK语言层模型基本不会用到而比较重要的两个文件夹是HTKLib 和HTKToolsHTKLib 里面包含了语音信号处理所用到的资源文件如内存的分配HMem信号处理HSigP参数产生HParm 数学计 HMath 等这些模块构成了HTK 的主体结构HTKTools 则是利用上面文件夹里面的库文件链接生成一些可以执行的程序例如在HTKLib 里面HSigpc 完成了预加重信号加窗FFT 等方面的算法从语音信号处理方面来讲他提供了LPCCMFCCPLP 的计算细节但是HTKLib 提供的只是上述计算的一些子程序具体把上述子程序串起来生成所提到的参数则是HParm 的内容还有其他一些库文件HRec 实现识别功能HAdapt 实现说话人自适应HWave 提供跟不同语音格式文件的接口等而上面提到的HSigp 和HParm 只是库文件如果没有其他文件调用它们永远不可能自己运行HTKTools 就是一些入口程序通过这些程序对源文件的调用从而形成不同功能的可操作平台例如HCopy 可以实现对输入的wav 文件生成它所对应的信号参数序列等另外还有一些其他的工具如HERest 用来训练模型HVite 用来识别24 HTK安装首先在httpcomacuk上下载HTK34版本的HTK工具包在计算机上安装VC60安装流程如下1将C\Program Files\Microsoft Visual Studio\VC98\Bin路径添加到系统环境变量中2 在DOS窗口中进入HTK工具包存储的文件夹输入命令vcvars32会显示设置VC的环境变量3建立HTK Librarycd HTKLib nmake f htk_htklib_ntmkf all退回根目录4建立HTK工具cd HTKToolsnmake f htk_htktools_ntmkf allcd HLMLibnmake f htk_hlmlib_ntmkf allcd HLMToolsnmake f htk_hlmtools_ntmkf all执行完这些指令后HTK Tools已经建立在了binwin32中5将binwin32文件路径添加到系统环境变量中完成上面步骤后HTK就安装完毕直接可以使用3 设计内容与设计指标31 系统设计内容本设计是基于HTK的命令字语音识别系统将对10个命令字进行识别它们分别是开机关机升温降温制热制冷强风弱风摆风静止语料的构成包括训练级23个人每个人按顺序说这10个命令字3遍测试级7个人每个人按顺序说这10个命令字3遍其中还要注意停顿和结束时的静音识别我们要对所有的预料进行训练最后得到识别的结果最后用VC设计GUI界面对识别系统进行控制并显示是别结果32 系统整体构造框图根据 HTK 语音识别原理搭建一个语音识别系统一般分为四步数据准备模型训练模式识别和模型分析使用HTK 构建的语音识别系统的体系结构如下图3所示图 3 HTK语音识别体统框图总的来说整个系统可以分为三个部分数据准备训练识别评估数据准备又可以分为1建立任务语法grammar根据wlist生成2创建一个字典文件Dictionary应上步的模型3创建transcription files抄本文件用于训练数据训练部分分为1对数据进行编码提取特征的过程2重复训练语音文件模型3高斯扩展混合模型并反复训练识别部分分为1对测试级的数据进行识别和评估2显示识别结果4 系统搭建思路和具体步骤41 搭建前的准备工作com 语料库语料的构成包括训练级23个人每个人按顺序说这10个命令字3遍测试级7个人每个人按顺序说这10个命令字3遍其中还要注意停顿和结束时的静音识别语料库是由录好的语音文件经由HCopy工具提取语音文件的Mel倒谱系数转换成了相应的MFCC文件存放在相应的文件夹中com 手动生成文件首先我们需要手动生成wlistfulldctconfig_mfc_edacfgaudiocfgprotomacros文件这里的wlist文件包括kaijiguanjishengwenjiangwenzhirezhilengqianfengruofengbaifengjiangzhifulldct是包括是个命令字的含有sil的字典文件config_mfc_edacfg文件是将已经提取参数后得到的MFCC_E类型模型的mfc文件转换为MFCC_E_D_A类型的配置文件Proto文件是前缀模型文件其参数开始可以任意设置Macros文件是宏文件com 自动生成文件这里需要用perl语言编写perl文件来生成我们后面搭建过程中所需要的文件以下文件可以均由perl文件自动生成globaldedmkpholedtr_wordmlfte_wordmlfincmix2hed incmix4hedincmix6hed silhed①globalded文件可以由creat_dedpl文件来自动生成在使用HDman工具来获取准确的发音文件时需要用到该文件②mkpholed文件可以由mk_mkphopl文件来自动生成tr_wordmlfte_wordmlf 文件可用mkmlfpl文件来生成编写perl文件时可以用get_subdir函数来获取所有录音文件目录并将其文件名改成后缀为lab的形式输出其对应的命令字在使用HLEd工具来生成扩展标签文件phomlf时需要用到即当遇到mkpholed文件中EX命令时读取字典文件中的命令字并在命令字发音前后插入sil③incmix2hed incmix4hedincmix6hed可以由mk_incmixpl文件来产生这三个文件在对HMM模型进行高斯扩展是需要用到④silhed文件可以有mk_silhedpl文件自动生成在使用HHEd命令对HMM进行定义将sp和sil合并后并输出这是需要用到silhed文件42 数据准备com 建立任务语法grammar首先由已经准备好的wlist文件该文中列出了所有的十个需要识别的词语包括kaijiguanjishengwenjiangwenzhirezhilengqianfengruofengbaifengjiangzhi 然后用wlist文件来生成语法测试文件grammar此过程由运行perl文件mk_cmd_grampl来完成文件按内容为command kaijiguanjishengwenjiangwenzhilengzhireqiangfengruofengbaifengjingzhi[silence] command [silence]上面的语法是高层表示必须通过HParse转换成HTK的底层表示生成wordnetHParse grammar wordnet运行命令流程图见图4图4运行HParse命令流程图通过运行perl文件mkmlfpl来创建没有短暂停SP的音节水平副本文件tr_wordmlf这个副本文件中列出了所有的MFCC文件名并加上了lab后缀以特定的形式输出com 建立字典文件①首先需要手动建立一个字典文件fulldct包含每个命令字的发音fulldct usefuldct②通过HDman工具生成每个词语发音后面都有短暂停sp的usefuldct字典文件使用HDman工具的流程图为图 5运行HDman命令的流程图hdman -m -w DEF\WDL -e EDF -n LST\HMMLST_SP -l DEF\dlog DEF\usefuldct DEF\fulldct-m 表示合所有源字典的发音每个词语都生成一个发音假如输入的字典对一个词语有不同发音就使用第一次遇到的发音-w 下载wlist文件-e 寻找文本文件-n 输出遇到的清楚的音节到文件mon_sil_sppho中-l 写入一个记录档到dlog文件中文件中包含了字典统计和每一个音节发生的次数③通过运行perl文件add_siloutsympl给输出标志位silence [] sil后面添加短暂停SP④用DOS命令 echo sp sp DEF\usefuldct实现给usefuldct字典增加sp sp 表示将输出接在目标文件的后面不覆盖原文件内容43 创建单音素HMM模型com 创建音素水平副本文件通过HLEd工具来生成含有sil标志的标签文件phomlf这个过程中需要用到标签文件tr_com需要usefuldct字典文件完成如图6中所示的过程图6 运行HLED命令流程tr_wordmlf文件形式为MLF"a0lab"kaiji"a1lab"guanjimkpholed文件可通过运行perl文件mk_mkphopl生成也可以手动生成mkpholed文件包含的命令为EXIS sil silDE spEX代替tr-wordmlf文件中的相应的发音IS插入一个标记silDE删除所有的短暂停标记sp运行命令HLEd -l -d DEF\usefuldct -i MLF\PHO EDF\mkpholed MLF\TR_SYL-l 使在输出的到phomlf的标签文件前面加上前缀-i 指定输出宏标签文件phomlf生成的phomlf文件的形式为MLF"a0lab"silkaijisil"a1lab"silguanjisilcom 创建flat start的单音素①创建一个创建一个声学分析训练集脚本文件这里我们可以生成两个显示MFCC存储路径的脚tr_mfcscp 训练级te_mfcscp 测试级这路的两个文件可以用perl文件mkscpfilepl自动生成分别匹配训练集和测试集训练集放入训练集指定路径中测试集放入测试集的指定路径中图7 mkscpfilepl程序流程图②生成MFCC文件MFCC文件是对录音文件提取参数得来的这里制作简要的介绍Hcopy命令生成MFCC文件图8 运行Hcopy命令流程图Hcopy -T 1 -C j\config\config_hcopy -S j\perl\hcopyscp在指定的路径中生成MFCC文件hcopycfg文件内容WAVFORM-- MFCC config fileSOURCEKIND WAVFORMSOURCEFORMAT WAVSOURCERATE 1250TARGETKIND MFCC_ETARGETRATE 100000WORDSIZE 200000NUMCHANS 24NUMCEPS 12SAVECOMPRESSED FSAVEWITHCRC F③计算全局均值和方差我们首先要得到训练数据的均值和方差信息所以我们需要用到HCompV工具对训练数据进行初始化指令为HCompV -C CFG\CONFIG -f 001 -m -S SCP\TR_SCP -M HMM\hmmdst PRO\PROTO 指令中各个选项的功能为-C 指定配置文件config_mfc_edacfg-f 创建的方差层的macros的值等于全局方差的001倍为每一个输入流创建了macros并把输出保存在vFloors文件中-m 更新所有的含有从训练文件中计算出样本均值的HMM组件-S 指定系数文件路径的脚本文件tr_mfcscp-M 存储输出的HMM宏文件模型包括macrosvFloorsproto和hmmdefs文件这里dst 0HMM\hmmdst表示model\hmmdef\hmm0所以我们需要事先在指定目录下建立hmm0文件夹在进行初始化之前我们需要准备proto文件放在model文件夹中的proto中主要作用是定义hmm的结构其参数可以任意假设proto文件内容o 39h "proto"523900 00 00 00 003910 10 10 10 1043900 00 00 00 003910 10 10 10 10500 10 00 00 0000 06 04 00 0000 00 06 04 0000 00 00 07 0300 00 00 00 00这里的config_mfc_edacfg文件是在初始化的时候由MFCC_E转化为MFCC_E_D_A时所需要的参数配置文件config_mfc_edacf配置文件参数设置如下SAVEGLOBOPTS TRUE 是否保存全局的选择SOURCEKIND MFCC_E 源HMM模型的类型SOURCEFORMAT HTK 源文件格式为HTKSOURCERATE 100000 源文件的速率ZMEANSOURCE FALSE 是否零源波形分析TARGETKIND MFCC_E_D_A 目标HMM模型类型TARGETFORMAT HTK 目标格式TARGETRATE 100000 com 目标的速率SAVECOMPRESSED FALSE 是否以压死形式保存输出文件SAVEWITHCRC FALSE 是否给输出文件添加校验和WINDOWSIZE 2500000 com 加窗的长度USEHAMMING T 是否用汉明窗PREEMCOEF 097 预加重系数USEPOWER F 是否使用不是很强的功率NUMCHANS 26 滤波器组频道的数量CEPLIFTER 22 倒谱同态滤波系数NUMCEPS 12 倒谱参数的维数DELTAWINDOW 2 三角窗口大小ACCWINDOW 2 加速窗口大小ENORMALISE T 正常化对数能量HSHELL TRACE 0002HLABEL TRACE 0010HNET TRACE 0001HREC FORCEOUT T在提取的参数HMM模型类型MFCC_E_D_AMFCC类型表示由HCopy对源录音文件提取参数转换成MFC文件后的维数在参数配置文件中已经给出NUMCEPS 12 _E表示在后面添加了对数能量相当于增加了一维即MFCC_E有13维D表示添加三角系数其长度为13A表示添加加速系数其长度也是13所以MFCC_E_D_A类型的维数为MFCC_E 13 _D 13 _A 13 39 我们可以通过HList对其查看HList -C G\wodebishe\config\config_mfc_edacfg -o -h -t -s 100 -e 104。
htk简单使用教程

本人刚开始学习HTK,在网上下了一份《HTK(V3.1)基础指南》资料,根据上面提供的步骤创建一个yes/no识别系统,但是在中间发现很多地方说的不够明白(也可能是本人悟性不够),很多代码输入会有错误,所以根据自己的理解写了一份文档,希望对大家有用。
首先说明一下注意事项(1)在输入命令时,有文件作为参数时,都应在文件名前加上相应的路径,不然找不到文件。
(2)输入命令前,最好先单纯的打一遍命令,不输入任何参数,参看函数用法。
预先建立文件夹我做的时候没有创建新的根目录,根目录为htk文件夹。
(1)data/ :存储训练和测试数据(语音信号、标签等等),包括一个子目录data/train,而train包括2个子目录,data/train/sig(用以存储步骤1接下来录制的训练语音数据) 和data/train/mfcc(用来存储步骤二中训练数据转化后的mfcc参数);(2)model/:存储识别系统的模型(HMMs)的相关文件;(3)def/:存储任务定义的相关文件;(4)test/:存储测试相关文件。
《HTK(V3.1)基础指南》中在本步骤中用到了标签,我做的时候试着用了标签,报错了。
感觉可能是因为录制的训练语音中,静音或者是语音的长度有问题,导致了错误,但是也不知道怎么解决,所以干脆没用了,希望大牛们可以帮助解答这个问题。
第一步:创建训练文件DOS下打开htk/data/train/sig文件夹,命令:HSLabyes.sig创建10个yes音,10个no 音,10个sil(静音)。
保存在htk/data/train/sig下。
第二步:声学分析抽取yes和no的mfcc特征参数。
保存在htk/train/mfcc下。
命令:HCopy–C analysis.conf–S targetlist.txt其中analysis.conf(在htk文件夹下)为抽取参数配置文件,内容为:## Example of an acoustical analysis configuration file#SOURCEFORMAT = HTK # Gives the format of the speech filesTARGETKIND = MFCC_D_A_0 # Identifier of the coefficients to use# Unit = 0.1 micro-second :WINDOWSIZE = 250000.0 # = 25 ms = length of a time frameTARGETRATE = 100000.0 # = 10 ms = frame periodicityNUMCEPS = 12 # Number of MFCC coeffs (here from c1 to c12) USEHAMMING = T # Use of Hamming function for windowing frames PREEMCOEF = 0.97 # Pre-emphasis coefficientNUMCHANS = 26 # Number of filterbank channelsCEPLIFTER = 22 # Length of cepstralliftering# The Endtargetlist.txt(在htk文件夹下)说明抽取源文件路径和目标文件的保存路径,内容如下:data\train\sig\yes10.sig data\train\mfcc\yes10.mfccdata\train\sig\yes1.sig data\train\mfcc\yes1.mfccdata\train\sig\yes2.sig data\train\mfcc\yes2.mfccdata\train\sig\yes3.sig data\train\mfcc\yes3.mfccdata\train\sig\yes4.sig data\train\mfcc\yes4.mfccdata\train\sig\yes5.sig data\train\mfcc\yes5.mfccdata\train\sig\yes6.sig data\train\mfcc\yes6.mfccdata\train\sig\yes7.sig data\train\mfcc\yes7.mfccdata\train\sig\yes8.sig data\train\mfcc\yes8.mfccdata\train\sig\yes9.sig data\train\mfcc\yes9.mfccdata\train\sig\no10.sig data\train\mfcc\no10.mfccdata\train\sig\no1.sig data\train\mfcc\no1.mfccdata\train\sig\no2.sig data\train\mfcc\no2.mfccdata\train\sig\no3.sig data\train\mfcc\no3.mfccdata\train\sig\no4.sig data\train\mfcc\no4.mfccdata\train\sig\no5.sig data\train\mfcc\no5.mfccdata\train\sig\no6.sig data\train\mfcc\no6.mfccdata\train\sig\no7.sig data\train\mfcc\no7.mfccdata\train\sig\no8.sig data\train\mfcc\no8.mfccdata\train\sig\no9.sig data\train\mfcc\no9.mfccdata\train\sig\sil10.sig data\train\mfcc\sil10.mfccdata\train\sig\sil1.sig data\train\mfcc\sil1.mfccdata\train\sig\sil2.sig data\train\mfcc\sil2.mfccdata\train\sig\sil3.sig data\train\mfcc\sil3.mfccdata\train\sig\sil4.sig data\train\mfcc\sil4.mfccdata\train\sig\sil5.sig data\train\mfcc\sil5.mfccdata\train\sig\sil6.sig data\train\mfcc\sil6.mfccdata\train\sig\sil7.sig data\train\mfcc\sil7.mfccdata\train\sig\sil8.sig data\train\mfcc\sil8.mfccdata\train\sig\sil9.sig data\train\mfcc\sil9.mfcc第三步:HMM原型定义建立文件hmm_yes.hmm、hmm_no.hmm、hmm_sil.hmm保存在htk/model/proto下。
一种基于HTK的数字语音识别系统

学开发 的一套基 于 C语言 的语音 处理工具箱 ,广泛应用 于语音识别 、语音合成、字符识别和 D NA排序等领域 。 从 HT K的基 本原理和软件结构 出发 ,设计 了一个基于 HT K的数字语音识别系统 ,并验证 了其识别效率 。随后,
通过更换识别单元 ,更 改特 征参数的维数和增 加高斯 混合分量 的个数来考虑不 同因素对系统性 能的影响。最后 , 通过 比较试验 ,验证 了识 别单元、高斯混合分量的数 目以及 MF C维数 的适当组合可提高系统 的正确识别 率。 C 关键词:语音识别 ;H K;H T MM;识别单元;MF C C
i e r n m o ewi ey HTK sa C a g a e b s d t o k td veo e y CUED i l s d f rs e c i a sus d mo e a d r d l. i ln u g e o p e h sg l n r o g n z to s e c yn h ss c aa t rr o g nz to ,DNA o o i ra d S n. o HTK ’ g n r lp i cp e e r a ia in, p e h s t e i, h r ce e r a iai n c mp st n O o Fr m o S e e a rn i ls
Ab ta t Dii l p e h rc g i o n e t mey i o t n r n h o e c e o n t n Isa p ia in i e l i sr c : g t e c e o n t n i a xr as i s e l mp r t a c fs e hr c g i o . t p l t r a f a b p i c o n le
语音识别HTK代码学习手册

HMM的理论基础一、HMM定义1.N:模型中状态的数目,记t时刻Markov链所处的状态为2.M:每个状态对应的可能的观察数目,记t时刻观察到的观察值为:初始状态概率矢量,,,3.4.A:状态转移概率矩阵,,,5.B:观察值概率矩阵(适用于离散HMM),,,;对于连续分布的HMM,记t时刻的观察值概率为一个离散型的HMM模型可以简约的记为。
二、关于语音识别的HMM的三个基本问题1. 已知观察序列和模型参数,如何有效的计算。
a. 直接计算2-1当N=5,T=100时大概需进行次乘法!b. 前向算法定义t时刻的前向变量(forward variable),可以通过迭代的方法来计算各个时刻的前向变量:1)初始化(Initialization)当t=1时2-2 2)递归(Induction)当时即: 2-33)终结(Termination)2-4 乘法次数大约为:N2Tc. 后向算法定义t时刻的后向变量(backward variable),可以通过迭代的方法来计算各个时刻的后向变量:1)初始化(Initialization)当t=T时, 2-52)递归(Induction)当时即:, 2-63)终结(Termination)2-7 乘法计算次数约为:N2T2. 已知观察序列和模型参数,在最佳意义上确定一个状态序列。
定义一个后验概率变量(posteriori probability variable)2-7 则最优序列可以通过, 2-7求得。
不过,这样求得的最优序列有些问题。
如果,那么这个最优序列本身就不存在。
这里讨论的最佳意义上的最优序列,是使最大化时的确定的状态序列。
即,使最大化时确定的状态序列。
定义为t时刻沿一条路径,且,输出观察序列的最大概率,即:2-8下面介绍迭代计算的Viterbi算法:1)初始化(Initialization),回溯变量:,2)递归(Induction)即: 2-82-93)终结(Termination)2-102-11 4)回溯状态序列, 2-12 3. 已知观察序列和模型参数,如何调整模型参数使最大。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HMM的理论基础一、HMM定义1.N:模型中状态的数目,记t时刻Markov链所处的状态为2.M:每个状态对应的可能的观察数目,记t时刻观察到的观察值为:初始状态概率矢量,,,3.4.A:状态转移概率矩阵,,,5.B:观察值概率矩阵(适用于离散HMM),,,;对于连续分布的HMM,记t时刻的观察值概率为一个离散型的HMM模型可以简约的记为。
二、关于语音识别的HMM的三个基本问题1. 已知观察序列和模型参数,如何有效的计算。
a. 直接计算2-1当N=5,T=100时大概需进行次乘法!b. 前向算法定义t时刻的前向变量(forward variable),可以通过迭代的方法来计算各个时刻的前向变量:1)初始化(Initialization)当t=1时2-2 2)递归(Induction)当时即: 2-33)终结(Termination)2-4 乘法次数大约为:N2Tc. 后向算法定义t时刻的后向变量(backward variable),可以通过迭代的方法来计算各个时刻的后向变量:1)初始化(Initialization)当t=T时, 2-52)递归(Induction)当时即:, 2-63)终结(Termination)2-7 乘法计算次数约为:N2T2. 已知观察序列和模型参数,在最佳意义上确定一个状态序列。
定义一个后验概率变量(posteriori probability variable)2-7 则最优序列可以通过, 2-7求得。
不过,这样求得的最优序列有些问题。
如果,那么这个最优序列本身就不存在。
这里讨论的最佳意义上的最优序列,是使最大化时的确定的状态序列。
即,使最大化时确定的状态序列。
定义为t时刻沿一条路径,且,输出观察序列的最大概率,即:2-8下面介绍迭代计算的Viterbi算法:1)初始化(Initialization),回溯变量:,2)递归(Induction)即: 2-82-93)终结(Termination)2-102-11 4)回溯状态序列, 2-12 3. 已知观察序列和模型参数,如何调整模型参数使最大。
定义3.1 给定训练序列和模型,时刻Markov链处在状态和时刻处在状态的概率定义如下3-1 定义3.2 给定训练序列和模型,时刻Markov链处在状态的概率定义如下3-2定义3.3 给定训练序列和模型,从状态转移出去的概率为定义 3.4给定训练序列和模型,从状态转移到状态的概率为利用Baum-Welch重估算法可以得到使局部最大时的参数更新公式。
1. Baum-Welch重估公式的理论基础引理3.1 设,,为正实数,,,为非负实数,那么,由对数函数的凹特性,有如下结论3-3 定义辅助函数如下3-4 其中,为更新前模型参数,为更新后模型参数,为训练序列,为可能的状态序列。
利用和引理3.1易得3-5式3-5构成了重估公式得理论基础,对辅助函数,只要能够找到,使,从而,这样,更新后的模型在拟和训练序列方面就比更新前的模型要好,使最大而得到的的参数更新公式就称之为Baum-Welch重估公式。
引理 3.2 ,,在的约束条件下,函数的唯一最大值点为。
证明如下求最大值令得:,同理可证:利用凹函数特性可知此最大值唯一。
2.离散HMM模型的重估公式HTK内存管理一、HTK内存管理概述C语言编程中,遇到的关于内存分配和释放的问题主要有如下两个方面。
第一是指针维护问题。
试想,你写的一个程序执行了一系列内存空间分配(通常是由malloc函数完成)操作,为了能够在以后适当的时候(通常是你不再需要那些内存时)可以将分配的内存空间释放(通常是由free函数完成),你必须小心谨慎的维护好这些指向分配的内存空间的指针。
有经验的程序员大概都会有这样的感受,维护这些指针并非易事!特别是当程序比较复杂时,尤为如此。
如果你一不小心(其实这很容易)丢掉了某些指针,那么操作系统将无法回收那些内存(这便是我们常说的内存泄漏问题),除非你的程序死了。
第二就是关于内存分配释放操作本身。
如果你的程序会相当频繁的执行malloc和free函数,那么程序将会费去大量的CPU时间来执行它们。
为了解决以上两个问题,尽可能的提高内存利用率,HTK设计了一个内存管理子系统,利用自定义的堆结构(Heap)来进行内存分配和释放。
HTK内存分配和释放的主要思想是一次向操作系统要大一些的内存块,然后在将它分成小块供上层程序使用,不需要时只需释放那个大内存块。
HTK把堆结构分为三大类:1.M-HEAPS:元素大小固定,new/free操作执行次序无限制,可全局重置(global reset)。
2.M-STACK:元素大小可变,最后分配的空间必须先释放,可全局重置。
3.C-HEAPS:元素大小可变,new/free操作执行次序无限制,全局重置无效(直接使用malloc和free函数)。
二、数据结构1. 堆数据结构定义typedef enum{MHEAP,MSTAK,CHEAP} HEAPTYPE; // 堆类型定义typedef unsigned char* ByteP; // 无符号字符(8位)指针typedef void* Ptr;typedef struct _Block *BlockP;/* MHEAP和MSTAK块数据结构定义*/typedef struct _Block{ /* MHEAP ,MSTACK */size_t numFree; /* 空闲元素数目,空闲字节数*/size_t firstFree; /* 第一个空闲元素索引 ,栈顶索引*/size_t numElem; /* 块分配元素的个数,块分配的字节数*/ByteP used; /* 指向元素分配表指针,1bit/元素,不使用*/Ptr data; /* 指向数据区指针,指向数据区指针*/BlockP next; /* 指向下一个块指针,指向下一个块指针*/}Block;/* 堆数据结构定义*/typedef struct{ /* MHEAP ,MSTACK */char* name; /* 堆的名称,堆的名称*/HEAPTYPE type; /* 堆的类型,堆的类型*/float growf; /* 增长因子,增长因子*/size_t elemSize; /* 元素大小,总是1 */size_t minElem; /**/size_t maxElem; /* 每个块最大允许分配的元素个数,每个块最大允许分配的字节数*/size_t curElem; /* 当前块元素个数,当前块字节个数*/size_t totUsed; /* 已使用的元素总个数,以使用的字节总个数*/size_t totAlloc; /* 分配的元素总数,分配的字节总数*/BlockP heap; /* 指向当前块的指针,指向当前块的指针*/Boolean protectStk; /* 仅适用于MSTAK */}MemHeap;2. 堆数据结构框图M-Heaps内存堆结构示意图同一个M-Heaps内存堆中分配的元素大小都是一样的。
堆结构中的块指针成员变量heap指向数据块链的头。
数据块链中的每个块分配的内存区大小由(字节)计算得到。
每个块中的BYTE型指针成员变量used指向记录元素使用状态的表数据结构,表中第i位记录数据区中第i个元素的使用状态:1表示使用中、0表示空闲。
每个块中的firstFree成员变量的值表示数据区中第一个空闲元素的标号。
每个块中的numFree成员变量的值记录所在块中空闲元素的个数。
如果numFree为0表示块满,这时firstFree=numElem。
M-Stack内存堆结构示意图三、算法1.接口描述1.定义:Export-->void InitMem(void)说明:初始化全局MSTAK堆变量gstack和全局CHEAP堆变量gcheap。
该函数必须在调用任何其它堆操作函数前调用。
参数:无返回值:无2.定义:Export-->void CreateHeap(MemHeap *x , char *name , HeapType type , size_t elemSize , float growf , size_t numElem , size_t maxElem)说明:创建一个名称为name、类型为type的内存堆,elemSize指定内存堆中元素的大小,numElem指定块中元素默认个数。
如果,内存堆的类型是MSTAK或CHEAP,则elemSize必须为1。
参数:x:指向给定的内存堆[In,Out]name:堆的名称[In]type:堆类型[In]elemSize:对于MHEAP表示堆的每个块中元素的大小,对于MSTAK和CHEAP,elemSize必须设为1 [In]growf:numElem:堆的每个块默认分配的元素个数[In]maxElem:堆的每个块最大允许分配的元素个数[In] 返回值:无3.定义:Export-->void ResetHeap(MemHeap *x)说明:释放内存堆x中所有元素,对CHEAP内存堆无效。
参数:x:指向给定的内存堆[In,Out]返回值:无4.定义:Export-->void DeleteHeap(MemHeap *x)说明:释放内存堆x中所有元素,并删除内存堆x。
参数:x:指向给定的内存堆[In,Out]返回值:无5.定义:Export-->Ptr New(MemHeap *x , size_t size)说明:从内存堆x中分配一大小为size的新元素并返回其指针。
如果x类型为MHEAP则忽略参数size。
如果分配失败,程序将会异常退出,所以返回值永远不会为NULL。
参数:x:指向给定的内存堆[In,Out]size:指定分配的元素大小[In]返回值:返回指向新分配的元素的指针6.定义:void BlockRecorder(BlockP *p , int n)说明:对于MHEAP堆,从块p向后搜索有n个以上(包括n个)元素的块,并将其移至块链表头。
对于MSTAK堆,从块p向后搜索有n个以上(包括n个)字节数的块,并将其移至块链表头。
参数:p 指向给定的块[In,Out]n 对于MHEAP,表示元素个数;对于MSTAK,表示字节数。
[In]返回值:无7.定义:void* GetElem(BlockP p , size_t elemSize , HeapType type)说明:如果type为MHEAP则从块p中返回一空闲元素指针,并将其在使用状态表中的对应项置1。
如果type为MSTAK则从块p中返回一大小为elemSize字节数的区域指针,并对块p中firstFree和numFree变量进行相应的修改。