Htk实验笔记-史上最完整版_第1页
Htk实验笔记-史上最完整版_第2页
Htk实验笔记-史上最完整版_第3页
Htk实验笔记-史上最完整版_第4页
Htk实验笔记-史上最完整版_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Htk 实验笔记实验笔记 Yes Or No 孤立词识别孤立词识别 史上最完整版哦 史上最完整版哦 摘要 本试验中 我们将基于 HTK 对象散设立建设一个 2 单词辨认体系 辞汇散是 Yes No 那是能够计划出去的最根基的主动语音辨认 Automatic speech recognition ASR 体系 方 针 设立建设一个伶仃词识 本实验中 我们将基于 HTK 工具集建立一个 2 单词识别系统 词汇集是 Yes No 这是可以 设计出来的最基本的自动语音识别 Automatic speech recognition ASR 系统 目标 建立一个孤立词识别系统 只包含 yes 和 no 两个词 步骤 A 创建一个语料库 确定识别基本元 如单词 yes no 等 yes 和 no 各录 5 次 B 声学分析 把 waveform 的声音文件转换为 mfcc 格式 即对语音材料库中的声音文件提取 MFCC 声纹特征 梅尔频率倒谱系数 这个部分的详解见教程 10 C 模型定义 为词典里的每一个词 基本元 建立一个 HMM 原型 D 模型训练 HMM 模型初始化和迭代 利用 MFCC 声纹特征对每一个 HMM 模型进行训练 使模 型参数与其描述的识别基本元对应 E 问题定义 即语法定义 定义输入语音的语法规则等 从发音对应到文字 F 对测试集合进行识别 G 评测 使用的教程 1 HTK V3 1 基础指南中文版 QFXAdmDjIJwA78t0qBJCAET9XPXXr7 qTlL7N6I6XcwEzYGJ7fhF2h4b5CaPHLwGNZCBFeSaq 2 语音识别工具箱之 HTK 安装与使用 3 语音识别系统之 htk 孤立词识别 yesno 4 HTK yesno 教程 5 HTK 孤立词识别回顾 7nJQrbkQOTZYToW7sN k6gT AsQBcO9ADnjlVUyFY1r4e 1d14PLO 6 一个简单的 HTK 入门参考例子 7 利用 HTK 工具包快速建立一个语音命令识别系统 8 Windows 安装 HTK3 4 1 语音识别工具 这里有 HSLab 运行失败的原因 9 Htk error book 3 3 HTKBook 23errors tex 1 7 htm 10 UNDERSTANDING HTK ERROR MESSAGES 11 htk 源码 12 语音信号处理之 四 梅尔频率倒谱系数 MFCC 特别记录一下该博客 音方面的学习资料 一一 准备工作准备工作 预先建立文件夹预先建立文件夹 我在 htk 目录下建立了 work 文件夹 今后所有的实验都放在这个文件夹中 在该文件夹中建立 YesNo 文件夹用于存放本实验的所有文件和数据 YesNo 文件夹中的结构如下 1 data 存储训练和测试数据 语音信号 标签等等 包括一个子目录 data train 而 train 包括 2 个子目录 data train sig 用以存储步骤 1 接下来录制的训练语音数据 和 data train mfcc 用来存储步骤二中训练数据转化后的 mfcc 参数 2 model 存储识别系统的模型 HMMs 的相关文件 3 def 存储任务定义的相关文件 4 test 存储测试相关文件 我是将测试数据存在此文件夹的没有放在 data 中 在 data 下创建 data train sig data train lab data train mfcc 文件夹 分别存放采集 的语音材料的 sig 文件 lab 标签 文件和提取的 MFCC 声纹特征文件 在 model 下创建 model proto model hmm0 model hmm0flat model hmm1 model hmm2 model h mm3 文件夹 model proto 用于存放模型初始化所需 HMM 原型定义文件 hmm yes hmm no hmm sil model hmm0 用于存放使用 HInit 命令初始化 HMM 模型输出的描述结果文件 依然是 hmm yes hmm no hmm sil model hmm0flat 用于存放使用 HCompv 命令初始化模型时输出的可变基底宏文件 vFloors 丢弃 使用 HCompv 初始化模型时产生的 hmm yes hmm no hmm sil model hmmi 为使用 HRest 命令迭代训练 HMM 模型时的输出目录 i 为表示当前迭代 i 的索引 最终单词 HMM 模型是 hmm3 hmm yes hmm3 hmm no andhmm3 hmm sil 在 test 下创建 test sig test mfcc test result 文件夹 分别存放测试用的语音材料的 sig 文件 提取的 MFCC 声纹特征文件和测试结果文件 整个目录的结构我将在本文最后给出 二二 创建语料库创建语料库 首先我们需要录音以采集足够的语音数据 对于 yes no 这两个命令都需要录一些相应的语音 样本 同时也需要对录下的语音做一些简单的标注 录音和标注可以采用 HTK 工具包中的 HSLab 来完成 这里我们采集 YES 和 NO 两个单词 在命令行下进入 HTK work YesNo data train sig 文件夹 sig 语言文件保存在该目录中 输入 HSLab yes sig 回车 该命令用于使用 HSLab 工具打开所在目录的 yes sig 文件 如果没有该文件 则在该目录中新建 该文件 这里使用该命令打开 HSLab 图形化界面 录制 yes sig 这一步可能会遇到如下问题 报错 报错 ERROR ERROR 6870 6870 MakeXGraf MakeXGraf NotNot compiledcompiled withwith X11X11 support support useuse HGraf X cHGraf X c FATALFATAL ERRORERROR TerminatingTerminating pro pro 解决办法 解决办法 1 这需要修改 HTKLib 文件夹下的 htk htklib nt mkf 文件 共有两处需要修改 将文 件中的 HGraf null obj 替换为 HGraf WIN32 obj HGraf null olv 替换为 HGraf WIN32 olv 2 然后在 cmd 命令行中重新编译 HTKLib 文件夹下的 htk htklib nt mkf 3 检查 HTKTools 文件夹下的 Makefile in 文件 如果有 lX11 字符的话将其删除 然 后在 cmd 命令行中重新编译 HTKTools 文件夹下的 htk htktools nt mkf 文件 需要将 bin win32 文件夹的路径加入到环境变量中 原因 原因 默认情况下 HSLab 工具使用的是 x11 做的图形界面接口 windows 不支持 所以需要修改 一下生成文件 使用 windows GUI 重新执行 HSLab yes sig 回车 一个用于录音的对话框就会出现 如图 下面我们开始录音 录音环境自己控制哈 1 录制声音 点击 rec 按钮 说 yes 然后点击 stop 按钮 你会看到界面上出现一个语音波形 一条语音样本就录制完成了 你可以点击 play 播放听一下 2 给声音做标记 本条语音一共需要做 3 个标记 yes 语音段的标记和其前后各一个的静音段标 记 注意 做标记的语音段不能重复 可以不相连 点击 mark 用鼠标选取 yes 前面的一段静 音后 再点击 Labelas 用键盘输入 sil 表示 silence 静音的意思 然后 回车 这样我们就给本条 语音的静音段做了一个标记 再点击 mark 选取 yes 的发音段 可以选取左右两边的边界 不容 易出错 然后点击 Labelas 按钮 用键盘输入 yes 回车 这样我们就给本语句的 yes 做了标 记 依照此方法 完成 yes 后面那个 sil 语音段的标记 完成这 3 个标记后 点击 save 按钮 回车 将我们的其标记文件保存 保存目录为 HSLab exe 的运行目录 别找不到文件了哈 3 重命名语音文件和语音标记文件 语音文件后缀为 sig 标记文件后缀为 lab 因为 HGraf HSLab 只能自动给出 0 1 的文件名序号 我们又需要至少 10 条的语音材料 所以就需要录 制一条语音 重命名一条 我们将 yes 0 sig 重命名为 yes 01 sig 将 yes 0 lab 重命名为 yes 01 lab 至此 我们完成了一个语音材料的录制 4 点击 new 按钮 这里不点 new 的话你会发现 lab 文件中有 N 多个标签信息 如果遇到这种情 况 你可以删除相应 lab 文件 重新打开 sig 文件贴标签 会发现 new 按钮旁边的 set 0 变为 set 1 了 然后依照 1 2 3 步 新建下一条语音材料 这时 HSLab 自动保存的文件名为 yes 1 sig yes 1 lab 将其命名为 yes 02 sig 和 yes 02 lab 即可 5 再执行 9 次第 4 步 得到 yes 03 yes 04 yes 10 的语音材料和标记文件 6 依照 1 2 3 4 5 步的方法 完成 no 的语音材料和标记文件的制作 得到 no 00 sig no 00 lab no 10 sig no 10 lab 7 这样我们就完成了本 yes 和 no 语音识别系统的语音库的建立 然后将所有的 lab 文件放入到 laber dir 文件夹中 以方便后面训练操作 我们可以打开一个 lab 文件看一下它的结构 如下记录了 sig 文件各标签的起止信息 如果你 打开文件不是这样 而是有很多的标签 也许你在打标签的过程中出现了问题 三三 声学分析声学分析 语音识别系统并不直接在语音信号上进行识别 而是先要进行特征提取 包括分帧 加窗 求取频 谱及倒谱 这样确保提取出的特征更加紧凑并尽可能多的保留语音内容的信息 HTK 中负责提取特征的是 HCopy 工具 它将 wav 格式的语音文件转化为包含若干特征 矢量的特征文件 具体命令如下 Hcopy A D C test analysis conf S def targetlist txt 使用该命令前 首先需要完成两个配置文件的编写 用记事本编写即可 1 analysis conf 为抽取参数配置文件配置文件 用于对特征提取过程中的参数进行配置 如命令所示保存 在 test 文件夹下 内容如下 SOURCEFORMAT HTK 指定输入语音文件的搁置 TARGETKIND MFCC 0 D A 定义提取什么样的特征参数 这里定义的是 12 个 MFCC 系数 1 个 nullMFCC 系数 c0 13 个一阶 MFCC 系数 13 个二阶 MFCC 系数 一共 39 个 MFCC 的有关材料 百度既可 WINDOWSIZE 250000 0 定义帧长 TARGETRATE 100000 0 定义取帧时的滑动长度 NUMCEPS 12 定义取到的 MFCC 首系数的个数 上边的 12 就来源于此 USEHAMMING T 定义取帧时用到的窗函数 这里定义使用汉宁窗 PREEMCOEF 0 97 定义预加重系数 NUMCHANS 26 定义美尔频谱的频道数量 CEPLIFTER 22 定义倒谱所用到的滤波器组内滤波器个数 其中 后代表注释 参数意义以后详细说 该文件可以有注释 2 targetlist txt 为源源 目的列表文件目的列表文件 用以说明抽取源文件 sig 的路径和目标文件 mfcc 的保存路径 内容如下 data train sig yes 01 sig data train mfcc yes 01 mfcc data train sig yes 02 sig data train mfcc yes 02 mfcc data train sig yes 03 sig data train mfcc yes 03 mfcc data train sig yes 04 sig data train mfcc yes 04 mfcc data train sig yes 05 sig data train mfcc yes 05 mfcc data train sig no 01 sig data train mfcc no 01 mfcc data train sig no 02 sig data train mfcc no 02 mfcc data train sig no 03 sig data train mfcc no 03 mfcc data train sig no 04 sig data train mfcc no 04 mfcc data train sig no 05 sig data train mfcc no 05 mfcc 这里我只将 yes 和 no 的前五条作为抽取的源文件 原先是将 10 条都作为源文件的 但是有 的文件在后面的初始化过程中报错了 原因可能是在贴标签的时候 标签之间出现了重复 目前我 也不是非常清楚 去掉有问题的文件后 就没有问题了 由于录音不方便 于是想到将 yes 和 no 的前五条作为抽取的源文件 后五条作为测试文件 于是乎 需要将后五条 sig 文件存储到 test sig 文件中 读者可以全都写上 然后有报错的时候再去掉 然后重新生成 mfcc 文件即可 完成上面两个文件后 运行上述命令 Hcopy A D C test analysis conf S def targetlist txt 结果如下图 屏幕上会输出配置文件中的各个参数 如果没有错误的话 在 data train mfcc 下 应该有 mfcc 文件出现 如下图 此步骤不容易出错 一般都会成功 至此 特征提取就完成了 四四 HMM 模型定义模型定义 在 model proto 中建立模型初始化所需 HMM 原型定义文件 hmm yes hmm no hmm sil 注意这三个文件无后缀名 否则会报错 且后面步骤中生成的同 名文件也均无后缀名 hmm yes 内容如下 注意 里面不能有注释 使用的时候必须删掉 o 39 定义输入特征参数的维书 h sil 定义模型名字 这里是给识别基本元 sil 定义的 所以需要 内为 sil 开始 HMM 参数的设置 6 定义隐含状态数 2 状态 1 为空 我们从状态 2 开始定义 39 连续 HMM 中的均值向量的定义 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 连续 HMM 中的方差向量的定义 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 3 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 4 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 6 转移概率矩阵的定义 0 0 0 5 0 5 0 0 0 0 0 0 0 0 0 4 0 3 0 3 0 0 0 0 0 0 0 0 0 4 0 3 0 3 0 0 0 0 0 0 0 0 0 4 0 3 0 3 0 0 0 0 0 0 0 0 0 5 0 5 0 0 0 0 0 0 0 0 0 0 0 0 列表 3HMM 描述文件 原型 o39 文件头 给出系数向量大小 这里是 39 个系数 系数类型 MFCC 0 D A h yes 封装对所谓的 yes 的 HMM 模型的描述 6 给出 HMM 模型的状态总数 包括 2 个非发散状态 1 和 6 2 表示对状态 2 的观察函数的描述 这里我们使用单一高斯观察函数 带有对角矩阵 这样 的函数完全由一个平均向量和一个变化向量 自相关矩阵的对角元素 状态 1 和 6 没有描述 他 们没有观察函数 390 00 0 0 0 x39 给出当前观察函数的平均向量 在 39 维的观察空间中 每个元素是强制初始化为 0 该文件仅给出 HMM 模型 它的全局结构 的原型 这些系数后面将用来训练 39 1 01 0 1 0 x39 给出当前观察函数的变化向量 每个元素强制初始化为 1 6 给出 HMM 模型的 6x6 转换矩阵 即 a11a12a13a14a15a16 a21a22a23a24a25a26 a31a32a33a34a35a36 a41a42a43a44a45a46 a51a52a53a54a55a56 a61a62a63a64a65a66 其中 aij 表示状态 i 到 j 转换的可能性 Null 值说明相应的转换不允许 其它值进行强制初始化 但是矩阵的每行之和为 1 在训练过程中将被修改 有人可能有疑问 HMM 不是应该有个状态转移矩阵 A 观测概率矩阵 B 么 怎么这里不见观测概率 矩阵 B 呢 答 有状态转移矩阵的是离散 HMM DHMM 这里用的是连续型 HMM CHMM 连续 性 HMM 的参数为 1 状态转移矩阵 A 和高斯分布里用到的均值和方差 这里上面的 HMM 模型中 都有定义 具体可查阅 里面论文 语音识别系统中特征提取和声学建 模的研究 里有关于 HMM 的详细资料 可供查阅 好了 观察状态转移矩阵 a11 0 a12 0 5 a13 0 5 a1x 0 x 4 5 6 这说明由状态 1 到自身的转 移概率为 0 到状态 2 的转移概率为 0 5 到状态 3 的转移概率为 0 5 到状态 4 5 6 的状态转移 概率为 0 其他行数据以此类推 由此我们便知道此 HMM 模型的拓扑结构 当然你也可以修改拓 扑结构来试图改善识别系统性能 我们必须为每个模型生成一个这样的原型 在我们的例子中 我们要写 3 个 HMM 模型原型 即 yes no sil 关于 HMM 描述文件更多详细信息参加 HTK 文档第 94 页 第七章 HMM 定义文件 然后 以此方法建立 yes 和 no 的 HMM 模型 我们保持拓扑结构无变化 hmm no hmm hmm sil hmm 有着相同的内容 只需将 h yes 中 yes 改为相应的 no 和 sil 即 可 关于 HMM 定义的更多知识 你可以参考 htkbook pdf 英文资料 里面介绍的非常详细 至此 HMM 模型定义完成 五五 模型初始化模型初始化 在训练过程开始之前 为了使得训练算法快速精准收敛 HMM 模型参数必须根据训练数据正确初 始化 HTK 提供了 2 个不同的初始化工具 Hinit 和 HCompv 本步是难点 因为我在实验中总是出错 苦恼了几个小时才解决问题 关于我遇到的问题及问题的 关于我遇到的问题及问题的 解决办法会在本文最后予以说明 解决办法会在本文最后予以说明 使用到命令为 Hinit 和 HCompv HInit 下面的命令是使用 Viterbi 算法通过训练数据的时间轴对 HMM 模型进行初始化 HInitHInit A A D D T T 1 1 S S trainlist txttrainlist txt M M model hmm0model hmm0 H H model proto hmmfilemodel proto hmmfile l l labellabel L L label dirlabel dir nameofhmmnameofhmm 我们来解释一下 A A D D T T 1 1 等参数 是显示命令本身 显示设定变量等功能 读者可以在命令行直接输入 HInit 回 车 便可看到清晰的解释 trainlist txttrainlist txt 是训练语料库里全部 mfcc 文件的列表 用于建立训练集 mfcc 文件存储在目录 data train mfcc 我将 trainlist txt 存储在 test 文件夹中 这里使用的时候要用 test trainlist txt M M 后跟一个文件夹 是初始化 HMM 模型描述结果输出的目录名称 用来存放初始化后的 hmm 文件 也就是输出文件夹 这里我们采用 model hmm0model hmm0 必须提前创建好 这个我们在做准备工作的时 候就创建了 H H 后跟 hmm 模型文件 model proto hmmfilemodel proto hmmfile 它是一个描述文件 本例中包含被称作 nameofhmm 的 HMM 模型的原型 这里指 proto hmm yes proto hmm no proto hmm sil l l 后是制定此 HMM 模型对应的标签 labellabel 用来标示哪个标签段用于训练集中 这里指 yes no 或 sil 因为它们对于标签和 HMM 模型使用了相同的名字 当然这不是强制的 这里 hmm yes 对应的 当然是 yes 了 还记得嘛 我们很辛苦做的标签呢 当然如果你错写成 no 了 就会按照 no 标签所 指定的语音参数来初始化 hmm yes 了 很影响训练 L L 后写上 lab 标签文件所在文件夹 即 label dirlabel dir 是存储相关训练集的标签文件 lab 的目录 这里是 data train lab nameofhmmnameofhmm 是要进行初始化的 HMM 模型的名称 这里指 yes no sil 这个过程对每个模型 hmm yes hmm no hmm sil 重复执行 具体使用的时候要根据自己的实验 情况将上述字段替换成实际的目录和文件名 说明 由 HInit 输出的 HMM 模型文件和输入原型具有相同的名字 根据上面的解释可以看到 要执行 HInit 命令来初始化模型 我们要做三件事 1 创建 trainlist txt 文件 在 test 下新建 trainlist txt 文件 内容为 data train mfcc yes 01 mfcc data train mfcc yes 02 mfcc data train mfcc yes 03 mfcc data train mfcc yes 04 mfcc data train mfcc yes 05 mfcc data train mfcc no 01 mfcc data train mfcc no 02 mfcc data train mfcc no 03 mfcc data train mfcc no 04 mfcc data train mfcc no 05 mfcc 2 准备一个文件夹 hmm0 作为初始化输出目录 在 model 下新建 hmm0 文件夹 准备工作中已经创建 3 分别执行如下命令对三个 hmm 原型进行初始化 Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm yes l yes L data train lab yes Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm no l no L data train lab no Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm sil l sil L data train lab sil 命令行显示如下 F dialecthtkHTKworkYesNo Hinit A D T 1 S test trainlist txt M model hm m0 H model proto hmm no l no L data train lab no Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm no l no L data train lab no No HTK Configuration Parameters Set Initialising HMM no States 2 3 4 5 width Mixes s1 1 1 1 1 39 Num Using 0 0 0 0 Parm Kind MFCC D A 0 Number of owners 1 SegLab no maxIter 20 epsilon 0 000100 minSeg 3 Updating Means Variances MixWeights DProbs TransProbs system is PLAIN 5 Observation Sequences Loaded Starting Estimation Process Iteration 1 Average LogP 2423 35156 Iteration 2 Average LogP 2344 08716 Change 79 26445 Iteration 3 Average LogP 2336 55200 Change 7 53520 Iteration 4 Average LogP 2335 74146 Change 0 81060 Iteration 5 Average LogP 2335 31958 Change 0 42192 Iteration 6 Average LogP 2335 31958 Change 0 00005 Estimation converged at iteration 7 Output written to directory model hmm0 No HTK Configuration Parameters Set F dialecthtkHTKworkYesNo Hinit A D T 1 S test trainlist txt M model hm m0 H model proto hmm yes l yes L data train lab yes Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm yes l y es L data train lab yes No HTK Configuration Parameters Set Initialising HMM yes States 2 3 4 5 width Mixes s1 1 1 1 1 39 Num Using 0 0 0 0 Parm Kind MFCC D A 0 Number of owners 1 SegLab yes maxIter 20 epsilon 0 000100 minSeg 3 Updating Means Variances MixWeights DProbs TransProbs system is PLAIN 5 Observation Sequences Loaded Starting Estimation Process Iteration 1 Average LogP 3840 66357 Iteration 2 Average LogP 3785 84644 Change 54 81709 Iteration 3 Average LogP 3783 84375 Change 2 00269 Iteration 4 Average LogP 3783 55591 Change 0 28789 Iteration 5 Average LogP 3783 55591 Change 0 00005 Estimation converged at iteration 6 Output written to directory model hmm0 No HTK Configuration Parameters Set F dialecthtkHTKworkYesNo Hinit A D T 1 S test trainlist txt M model hm m0 H model proto hmm sil l sil L data train lab sil Hinit A D T 1 S test trainlist txt M model hmm0 H model proto hmm sil l s il L data train lab sil No HTK Configuration Parameters Set Initialising HMM sil States 2 3 4 5 width Mixes s1 1 1 1 1 39 Num Using 0 0 0 0 Parm Kind MFCC D A 0 Number of owners 1 SegLab sil maxIter 20 epsilon 0 000100 minSeg 3 Updating Means Variances MixWeights DProbs TransProbs system is PLAIN 20 Observation Sequences Loaded Starting Estimation Process Iteration 1 Average LogP 1884 75818 Iteration 2 Average LogP 1831 56348 Change 53 19470 Iteration 3 Average LogP 1827 01855 Change 4 54492 Iteration 4 Average LogP 1808 18774 Change 18 83086 Iteration 5 Average LogP 1785 25684 Change 22 93091 Iteration 6 Average LogP 1781 88904 Change 3 36777 Iteration 7 Average LogP 1781 35974 Change 0 52927 Iteration 8 Average LogP 1781 07556 Change 0 28416 Iteration 9 Average LogP 1781 00781 Change 0 06775 Iteration 10 Average LogP 1780 98633 Change 0 02148 Iteration 11 Average LogP 1780 98633 Change 0 00000 Estimation converged at iteration 12 Output written to directory model hmm0 No HTK Configuration Parameters Set F dialecthtkHTKworkYesNo 这样就实现了分别对三个模型 hmm yes hmm no hmm sil 进行初始化 初始化成功后 初 始化了的三个模型便被保存在了 hmm0 文件夹中 其实到这里 初始化已经完成了 由于后面需要文件 vFloors 来对 HMM 进行训练 所以还要使用 Hcompv 来进行一次训练 以得到此文件 HCompv HCompv 工具用来对模型进行平坦初始化 HMM 模型的每个状态给定相同的平 均向量和变化向量 在整个训练集上全局计算而得 一般初始化命令行形式如下 HCompvHCompv A A D D T T 1 1 S S trainlist txttrainlist txt M M model hmm0flatmodel hmm0flat H H model proto hmmfilemodel proto hmmfile f f 0 010 01 nameofhmmnameofhmm 我们来解释一下 nameofhmm hmmfile trainlist txtnameofhmm hmmfile trainlist txt 见 HInit 中的解释 model hmm0flatmodel hmm0flat HMM 模型输出目录 与 HInit 必须保持不同 避免覆盖 说明 label 选项也可以使用 这种情况下 对全局平均和变化向量的估值就仅基于训练集的相应 的标签部分 我们不使用 HCompv 来初始化我们的模型 已经使用了 HInit 尽管它也输出了初始化后的 HMM 模型 我们只使用与初始化模型一起输出一个名称为 vFloors 的有趣的文件 它包含乘以因 子的全局变化向量 见列表 4 这个因子可通过 f 选项来设置 这里是 0 01 可变基底宏文件 vFloors 如下所示 存储在 varFloor1 中的值 称作可变基底宏 在后面训练过程中用作估计的变化向量的基底 在训练迭代过程中 与特定 HMM 模型状态相关联的训练帧数可能很低 该状态的估计变化值会很 小 如果只有一个可用的训练帧的话 变化甚至为空 null 这种情况下 可用基底来替代 避免 变化值趋于极小 甚至产生计算错误 这里 我们将对我们将对 HMM 原型之一使用原型之一使用 HCompv 一次一次 来计算上述 varFloor1 宏 相应的 vFloors 文件输出到目录 model hmm0flat 根据上面的解释 我们知道 使用 Hcompv 命令得到 vFloors 文件我们需要做两件事 1 创建 HMM 模型输出目录 model hmm0flat 准备工作中已经创建 2 使用如下命令 执行初始化 HCompvHCompv A A D D T T 1 1 S S test trainlist txttest trainlist txt M M modelhmm0hmm1modelhmm0hmm1 H H model proto hmm yesmodel proto hmm yes f f 0 010 01 yesyes 读者可能有注意到 图中命令的输出目录为 hmm1 这是因为我对 Hmm 三个原型都进行了一次 Hcompv 来观察生成的初始化文件 放在不同文件夹下避免覆盖 生成的三个 vFloors 文件是完全 一致的 之后我手动将 vFloors 文件移动到 model hmm0flat 下 并清空 hmm1 hmm2 hmm3 文件夹 待后续步骤使用 读者仅需按照我上面所述的两个步骤进行操作即可 六六 模型训练模型训练 初始化成功后 就可以进行训练了 训练过程的描述如下图 模型参数的估计采用 HRest 工具 调用该工具完成一轮参数的重新估计 具体命令行如下 HRestHRest A A D D T T 1 1 S S trainlist txttrainlist txt M M model hmmimodel hmmi H H vFloorsvFloors H H model hmmi 1 hmmfilemodel hmmi 1 hmmfile l l labellabel L L label dirlabel dir nameofhmmnameofhmm 我们来解释一下 trainlist txttrainlist txt 文件包含所有用于训练的 mfcc 特征文件列表 model hmmimodel hmmi HMM 模型的输出目录 i 从 1 开始 每次迭代加 1 vFloorsvFloors 由 HCompv 生成的最小方差值的文件 hmmfilehmmfile 是名字为 nameofhmmnameofhmm 的 HMM 模型文件 放在 model hmmi 1 hmmi 1 代表上一次迭代使用的 输出目录 作为这一次迭代使用的输入目录 每次迭代都会生成模型文件和 vFloors labellabel 训练语料中的标签 yes no sil label dirlabel dir 是存放标注文件 lab 的目录 nameofhmmnameofhmm 要训练的 HMM 模型的名字 yes no sil 对于每个要训练的 HMM 模型 整个训练过程需要迭代多次 通常 5 10 轮次 每次迭代时 HRest 程序可输出数据的似然值 每次 HRest 迭代 即当前再估计迭代中的迭代 显示在屏幕上 通过 change 量度标示收敛性 一旦这个量度值不再从一个 HRest 迭代到下个迭代减少 绝对值 过程就该停止了 每个 HMM 都要重复这个过程 N 次 在我们的例子中 2 或 3 次再估计迭代就足 够了 最终的单词模型存储在 hmm3hmm yes hmm2hmm no hmm1hmm sil 根据上面的解释 我们知道 使用 HRest 命令得到最终的 HMM 模型我们需要做两件事 1 创建每次迭代使用的输出目录 在 model 下创建文件夹 hmm1 hmm2 hmm3 2 使用如下命令进行训练 HRestHRest A A D D T T 1 1 S S test trainlist txttest trainlist txt M M model hmm1model hmm1 H H model hmm0flat vFloorsmodel hmm0flat vFloors H H model hmm0 hmm yesmodel hmm0 hmm yes l l yesyes L L data train labdata train lab yesyes 回车 实现对模型 yes 的第一次迭代优化 使用如下命令进行第二次 HRestHRest A A D D T T 1 1 S S test trainlist txttest trainlist txt M M model hmm2model hmm2 H H model hmm0flat vFloorsmodel hmm0flat vFloors H H model hmm1 hmm yesmodel hmm1 hmm yes l l yesyes L L data train labdata train lab yesyes 回车 实现对模型 yes 的第二次迭代优化 使用如下命令进行第三次 HRestHRest A A D D T T 1 1 S S test trainlist txttest trainlist txt M M model hmm3model hmm3 H H model hmm0flat vFloorsmodel hmm0flat vFloors H H model hmm2 hmm yesmodel hmm2 hmm yes l l yesyes L L data train labdata train lab yesyes 回车 这样我们就完成了对模型 hmm yes 的训练 并保存在了 hmm3 文件夹中 对模型 hmm no 和 hmm sil 的训练同上 只需替换命令中 yes 的部分即可 如上所述命令是近乎每一个使用了 vFloors 文件的教程中都使用的 然而我在实际实验过程却无法 按此命令顺利执行 报错如下 查看 htk error booK erno pm 7032 Option mismatch All HMMs in a particular set must have consistent options 查看 htk 源码 CheckOptions check that options are set in given HMM set static ReturnStatus CheckOptions HMMSet hset if hset optSet HRError 7032 CheckOptions options not set in HMM Set return FAIL return SUCCESS 由于也有不少教程 并没有使用 vFloors 文件 我试着不用该文件看看能不能运行 使用的命令如下 HRestHRest A A D D T T 1 1 S S test trainlist txttest trainlist txt M M model hmm1model hmm1 H H model hmm0 hmm yesmodel hmm0 hmm yes l l yesyes L L data train labdata train lab yesyes HRestHRest A A D D T T 1 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论