基于HTK的语音拨号系统

为什么80%的码农都做不了架构师?>>>   hot3.png

基于 HTK 的语音拨号系统

Veket

  NWPU

2011-6-22

目标:

该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词( sub-word,eg.. 音素),具有一定的可扩充性。当加入一个新名字时,只需修改发音词典和任务语法即可。模型为连续混合高斯输出,运用语音决策树聚类形成的绑定状态式三音素。

内容:

1. 数据准备

(1)       任务语法定义

(2)       字典定义

(3)       录制 语音数据

(4)       标注数据,得到真值文件

(5)       数据特征的提取

2. 创建单音素 HMM 模型

(6)       一致初始化法创建单音素模型

(7)       修补哑音素模型

(8)       重新校正数据

3. 创建绑定状态的三音素 HMM 模型

(9)       得到三音素 HMM

(10)   绑定三音素

4. 识别器评估

11 )验证测试结果

步骤:

1. 数据准备

需要录制训练数据和测试数据。为了进行校准,还需要数据的标注文本。这里用任务语法( task grammar )产生真值文本( ground truth . 为了处理训练数据,需要定义一个语音集合和一个字典用以涵盖训练和测试数据中涉及的单词。

(1)       任务语法定义

任务语法以包含变量的正则表达式形式定义,存储在文件 gram (手工制作,在 Notepad++ UltraEdit 环境下进行 , 最后要空一行)里:

 

上面的语法是高层表示,必须通过 HParse 转换成 HTK 的底层表示。

运行指令: HParse gram wdnet

 

底层表示存于文件 wdnet HParse 工具生成 )中。

 

(2)       字典定义

利用 BEEP 语音词典(现成的),除去其中的重音符。

在每个发音后加入 sp(short pause). 如果有哑音标志,就用 MP 命令把 sil sp 合并成 sil ,这些处理命令放在 global.ded (手工制作)的脚本中。

 

文件 wlist (此系统由于涉及的单词较少,于是手工制作即可)是出现在任务语法中的所有单词的有序列表。

 

       文件 names 是专有人名的发音(手工制作,包括 SEND-START,SENT-END )。

 

       执行 HDMan:

HDMan -m -w lists/wlist - g global.ded   -n lists/monophones 0 -l dlog dict/dict1   dict/beep dict/names

 

生成的文件 monophones 0 是用到的音素列表(包括 sp , 生成的 dlog 是参数文件,其中包含生成的字典 dict1 的相关统计信息,还会提示是否丢失单词。生成的与任务相关的发音词典 dict1, 需要手工修改,为 SENT-END SENT-START 加上无输出标志。

 

为了避免在 dlog 里出现 warnning, 可在 names beep 同一目录下分别建立同名的编辑脚本,内容为空即可。

 

(3)       录制语音数据

HSGen 工具可以生成符合 task grammar 的句子,用来指导录音:

HSGen -l -n 10 wdnet dict/dict1>labels/trainprompts

HSGen -l -n 1 0 wdnet dict/dict1>labels/testprompts

       根据上述生成的指令文件,录制相应的 10 个训练用语音数据 文件和 10 个测试用语音数据 文件。一个录制例子如下:

HSLab ./data/Train/speech/S0001

 

(4)       标注数据,得到真值文件

perl 脚本 prompts2mlf( 现成的 ) 可以把录音文本截成单词级真值文件 trainwords _2 .mlf testwords _2 .mlf

perl scripts/prompts2mlf labels/trainwords _2 .mlf labels/trainprompts

perl scripts/prompts2mlf labels/testwords _2 .mlf labels/testprompts

:将生成的文件 trainwords _2 .mlf testwords _2 .mlf trainwords _1 .mlf testwords _1 .mlf 的格式 "*/S0*.lab" 添加到其文件末尾,并保存为 trainwords.mlf testwords.mlf

标注编辑器 HLEd 可把单词级真值文本( word level MLF )转成音素级真值文本( phone level MLF phones0.mlf

HLEd -l * -d dict/dict1 -i labels/phones0.mlf mkphones0.led labels/trainwords.mlf

编辑脚本 mkphones0.led 的内容如下:

 

其中 EX 命令表示按照字典 dict1 进行展开, IS 表示在每个话语的前后插入标志, DE 一行表示 phones0.mlf 中单词间不用 sp 隔开。

 

(5)   数据的特征提取

这里所用特征为 MFCC 。工具 HCopy 可以实现提取特征的工作

HCopy -T 1 -C config/config 1 -S codetr.scp

其中,配置文件 config1 要设置转换参数(红色标出), config 内容如下:

# Coding parameters

    TARGETKIND = MFCC_0_D_A           // 目标文件参数类型

    TARGETRATE = 100000.0               // 目标速率, 100 /

     SOURCEFORMAT = WAV                // 源文件格式

    SAVECOMPRESSED = T                // 以压缩的方式存储

    SAVEWITHCRC = T                    // 附加校验和到输出参数中

    ZMEANSOURCE=TRUE

    SOURCERATE=208                    // 源文件的速率

    WINDOWSIZE = 250000.0               // 25ms 为一帧进行分帧处理

    USEHAMMING = T                    // 采用汉明窗,进行加窗处理

    PREEMCOEF = 0.97                   // 预加重系数

    NUMCHANS = 26                     //26 组滤波器

    CEPLIFTER = 22                      // 倒谱滤波系数

    NUMCEPS = 12                        // 参数个数

    ENORMALISE = F                    // log 能量不进行 归一

 

实现该命令所需的脚本文件 codetr.scp 可采用如下方式生成: DOS 环境下进入到 wav 文件所在路径,用 dir/b/s > wav.scp 指令将所有的 wav 文件名写入到 wav.scp 文件中(注意删除多出的一行),然后在 Notepad++ 中构造 下图 所示的文件, coder.scp ( 注:生成的wav.scp 中的文件路径是绝对路径,可以手动改成相对路径)

 

codetr.scp 指定训练及输入和输出文件列表。执行结果, HCopy codetr.scp 文件左侧的语音数据 config 1 的配置提取特征并存入 codetr.scp 文件右侧特征文件中。

对于测试数据如法炮制。

HCopy -T 1 -C config/config 1 -S codet e .scp

 

2. 创建单音素 HMM 模型

6 )一致初始化法创建单音素模型

       定义一个原始模型 proto:

 

 

训练文件 train.scp 的生成也是在 DOS 环境下进入到 MFCC 特征的文件路径下,执行 dir/b/s> train.scp 。需要注意的是要在 Nodepad++ UltraEdit 下把多余的一行删除掉。

 

用全局均值和方差来初始化 HMM 模型的高斯参数:

HCompV -T 1 -C config/config1 -f 0.01 -m -S train.scp -M hmm s/hmm0   proto

       在目录 hmm0 下生成了更新后的 proto 和一个截至宏 vFloors 。基于 ./hmms/hmm0/ 下的两个文件,手工制作主宏文件 hmmdefs 和与 vFloors 相关的宏 macro, 具体制作过程参见 HTKbook

 

 

由于暂时不使用 sp 模型,删除 monophones 0 中的 sp, 构成 monophones 1 文件,重估参数:

HERest   -C config/config1 - I   labels/phone s 0.mlf   - t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm0/macros -H hmms/hmm0/hmmdefs   -M hmms/hmm1   lists/monophones 1

同上,重复估计两次:

HERes t   -C ./config/config1 -I ./labels/phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H ./hmms/hmm1/macros -H ./hmms//hmm1/hmmdefs -M ./hmms/hmm2 ./lists/monophones 1

 

HERest   -C ./config/config1 -I ./labels/phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H ./hmms/hmm2/macros -H ./hmms/hmm2/hmmdefs -M ./hmms/hmm3 ./lists/monophones1

 

(6)       修补哑音素模型

hmm3 中的 macros 复制到 hmm4 中, hmmdefs 中的 sil 复制到文件末尾并将 sil 改为 sp 及状态改为 3 放到 hmm4

 

(1) 利用 HHEd 加入回溯转移概率:

HHEd -T 1 -H hmms/hmm4/macros - H hmms/hmm4/hmmdefs -M hmms/hmm5 sil.hed   lists/monophone s0

修改 mkphones0.led, 去掉最后一行,存为 mkphones1.led ,利用 HLEd 工具得到包含 sp

的音素级真值文本:

HLEd -l * -d ./dict/dict1 -i ./labels/phones1.mlf mkphones1.led ./labels/trainwords.mlf

 

(2) 重估两次:

HERest -C config/config1 -I labels/phone s0 .mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm5/macros -H hmms/hmm5/hmmdefs -M hmms/hmm6   lists/monophones 0

 

HERest -C config/config1 -I labels/phone s0 .mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 6 /macros -H hmms/hmm 6 /hmmdefs -M hmms/hmm 7   lists/monophones 0

 

8 )重校准训练数据

确认 trainwords.mlf 中的路径为 ”*/S0 * .lab” 并且加上前面的 140 句话 ,修改 dict 1 加入 silence sil 一项,另存为 dict 2 ,执行 HVite 进行 Viterbi 校准:

HVite -l * -o SWT - b silence -C config/config1 -a -H hmms/hmm7/macros   -H hmms/hmm7/hmmdefs -i labels/aligned.mlf -m -t 350.0 -y lab -I labels/trainwords.mlf -S train.scp   dict/dict 2   lists/monophones 0

 

利用 HERest 重估两次 ,最后保存到 hmm9

HERest _3.4 -C config/config1 -I labels/aligned.mlf -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 7 /macros -H hmms/hmm 7 /hmmdefs -M hmms/hmm 8   lists/monophones 0

 

HERest _3.4 -C config/config1 -I labels/aligned.mlf   -t 250.0 150.0 1000.0 - S train.scp -H hmms/hmm 8 /macros -H hmms/hmm 8 /hmmdefs -M hmms/hmm 9   lists/monophones 0

来看看这时的识别率怎么样

HVite -H ./hmms/hmm 9 /macros -H ./hmms/hmm 9 /hmmdefs -S test.scp -l * -i ./results/recout_step 9 .mlf -w wdnet -p 0.0 -s 5.0 ./dict/dict 2 ./lists/monophones 0

HResults -I ./labels/testwords.mlf ./lists/monophones 0 results/recout_step 9 .mlf

转载于:https://my.oschina.net/dake/blog/196721

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL无法重启问题解决Warning: World-writable config file '/etc/my.cnf' is ignored

为什么80%的码农都做不了架构师?>>> 今天帮朋友维护服务器,在关闭数据库的命令发现mysql关不了,提示Warning: World-writable config file /etc/my.cnf is ignored ,大概意思是权限全局可写,任何一个用户都…

用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例

基于实例分析,体会用户体验设计的 7 条准则,分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得满意的地方(不少于2点);(20分),请陈述理由。 同样,分析…

JVM学习笔记(一):Java内存区域

由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)&am…

EdgeRouter X设置外网远程访问和HTTPS连接指定出口网关

EdgeRouter X虽然小巧,但功能强大,为方便远程管理,必须对防火墙进行设置,允许从外部进行访问,由于公网的80、443端口都已被运营商关闭,必须设置端口转发才能从外部访问。一、设置外网远程访问通过浏览器进入…

overflow妙用--去除默认滚动条,内容仍可滚动

在开发中我们往往要去除默认滚动条&#xff0c;但是其在竖直方向的滚动效果仍然需要。 <div id"parent"><div id"child"><h1>文本区</h1><h1>文本区</h1><h1>文本区</h1></div> </div> #pare…

数据仓库基础(二)ETL

本文转载自&#xff1a;http://www.cnblogs.com/evencao/archive/2013/06/14/3135529.html ETL在数据仓库中具有以下的几个特点&#xff1a; 数据流动具有周期性&#xff1a; 因为数据仓库中的数据量巨大&#xff0c;一般采用成熟的ETL工具去完成抽取、转换、加载&#xff0c;以…

CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]

为什么80%的码农都做不了架构师&#xff1f;>>> /// <summary> /// CSV出力ボタンラッパー。 /// </summary> public class CsvOutputButtonWrapper { /// <summary> /// CSV出力ボタン /// </summary> …

结构体变量字节填充

二&#xff1a; &#xff08;1&#xff09;sizeof也可以对一个函数调用求值&#xff0c;其结果是函数返回类型的大小&#xff0c;函数并不会被调用。 &#xff08;2&#xff09;终于搞懂struct结构体内存分配问题了&#xff0c;结构体中各个成员字节对齐遵循以下几个原则&#…

iOS GoldRaccoon第三方FTP文件夹下载失败原因

一、问题描述&#xff1a;1.下载失败报错&#xff1a; 文件写入失败Error DomainNSCocoaErrorDomain Code512 "未能将文件“jquery_1_10_2_min.js”存储到文件夹“Q20180104153006399”中。" 原因及解决方法&#xff1a;文件夹下均为文件&#xff0c;不包含子文件夹&…

项目UML设计(团队)

团队信息 队名&#xff1a;massivehard 组长&#xff1a;晓辉 队员&#xff1a;一飞&#xff0c;帅珍&#xff0c;斌豪&#xff0c;锦谋 团队分工 模块序号模块名模块具体内容1日记编辑添加随笔2照片选择选择照片识别3消息模块收发消息4个人信息账号&#xff0c;密码等负责人分…

安装asp.net mvc4后mvc3项目编译报错

为什么80%的码农都做不了架构师&#xff1f;>>> 安装asp.net mvc4之后&#xff0c;之前的mvc3项目编译时报这个错“The type System.Web.Mvc.ModelClientValidationRule exists in both c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.M…

SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)

这段时间在解决一个多个表需要同时插入大量数据的问题&#xff0c;于是在网上找了下&#xff0c;查到说用SqlBulkCopy效率很高&#xff0c;实验后确实很快&#xff0c;10万条数据只要4秒钟&#xff0c;用ef要用40秒。但是我的还需两张表同时插入&#xff0c;且需要用到事务&…

一介书生,仅此而已

喜欢写文章&#xff0c;所以很少发随笔。 嘛~其实是一开始就搞错随笔和文章的场景了&#xff0c;迁移太麻烦&#xff0c;有时间自己做个个人博客好了~~转载于:https://www.cnblogs.com/restartyang/p/7710907.html

POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

为什么80%的码农都做不了架构师&#xff1f;>>> POJ 3608 Bridge Across Islands跨岛大桥&#xff1a;在两个凸包小岛之间造桥&#xff0c;求最小距离&#xff1f;3.6与平面和空间打交道的计算几何 凸包 这题原始数据已经是凸包&#xff08;convex polygons&#x…

抓包(Charles工具入门)

一、charles工具简单使用 1、录制操作 录制请求、清空录制请求&#xff1a; 两种展示请求的视图方式&#xff1a; 2、录制请求的简单分析 &#xff08;1&#xff09;请求的总览页面Overview&#xff1a;可查看请求路径、请求方式、请求时间等有关该请求的内容 &#xff08;2&am…

探秘创造力

为什么80%的码农都做不了架构师&#xff1f;>>> 创造力&#xff0c;在很多行业和领域都被视为神奇的存在&#xff0c;大家都希望自己的创造力能够无限&#xff0c;感觉创造力已经被神话了。其实&#xff0c;一个简单问题可能很少人能够明确&#xff1a;”创造力是天…

2017.10.23解题报告

预计分数&#xff1a;100600160 实际分数&#xff1a;100800180 T1 题目描述 现在有一个字符串&#xff0c;每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线&#xff0c;第三次出现的和四次出现的字母a连一条线&#xff0c;第五次出现的和六…

Chrome Android 60.X+ 不能自动播放audio音频的解决办法

Chrome Android等一些浏览器默认限制了自动播放音频视频等&#xff0c;需要用户有点击的动作后才可以播放。这样的原因在于很多用户流量需要付费&#xff0c;而限制了自动播放可以避免用户在不知情的情况下产生高额的流量费用。 在60.X版本之前&#xff0c;chrome://flags中有一…

(水一下)Linux启动步骤(面试题)

1.加载并初始化Linux内核2.配置硬件设备3.内核创建自发进程4.由用户决定是否进入手工引导模式5.init进程执行系统启动脚本6.进入多用户模式转载于:https://blog.51cto.com/12942223/2408649

【WebGL】《WebGL编程指南》读书笔记——第5章

一、前言 终于到了第五章了&#xff0c;貌似开始越来越复杂了。 二、正文 Example1&#xff1a;使用一个缓冲区去赋值多个顶点数据&#xff08;包含坐标及点大小&#xff09; function initVertexBuffers(gl) {var verticesSizes new Float32Array([0.0, 0.5, 10.0, -0.5, …