基于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端口都已被运营商关闭,必须设置端口转发才能从外部访问。一、设置外网远程访问通过浏览器进入…

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

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

项目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…

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;”创造力是天…

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

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

框架设计:实现数据的按需更新与插入的改进--用数据对比进一步说明

2019独角兽企业重金招聘Python工程师标准>>> 在发布完&#xff1a;框架设计&#xff1a;实现数据的按需更新与插入的改进 之后&#xff1a; 有网友表示不理解&#xff0c;于是这里给出一篇简单的说明对比&#xff0c;表示下改进后好处。 一&#xff1a;场景一&#…

Java异常详解及如何处理

来源&#xff1a;Java异常详解及如何处理 简介 程序运行时&#xff0c;发生的不被期望的事件&#xff0c;它阻止了程序按照程序员的预期正常执行&#xff0c;这就是异常。异常发生时&#xff0c;是任程序自生自灭&#xff0c;立刻退出终止&#xff0c;还是输出错误给用户&…

TransactionScope 的基本原理简介

C# 的事务编程 1 Db事务 DbConnection 中创建基于当前连接的 DbTransaction 2 使用TransactionScope ,创建环境事务 一旦创建&#xff0c;在这个环境包含的DbConnection 实例 都会根据连接字符串中的 Sqlserver 连接字符串支持&#xff0c;是否自动附加当前环境事务. 连接字符…

Canvas 生成交互动画

2019独角兽企业重金招聘Python工程师标准>>> 今天介绍的是一个HTML5交互动画效果&#xff0c;难以置信。HTML5虽说还有很多东西在改进&#xff0c;但现在所能实现的 效果的程度我想是诸位很难想象得到的&#xff0c;实在是发展得太快了。 查看详情 转载于:https://m…

二分搜索技术

2019独角兽企业重金招聘Python工程师标准>>> 分治法的基本思想&#xff1a;将一个规模为n的问题&#xff0c;分解为k个规模较小的子问题&#xff0c;这些子问题互相独立且与原问题相同。递归的解这些子问题&#xff0c;然后将各个子问题的解合并得到原问题的解。 经…

apachacxf项目使用@WebService报错

首先去除已经导入的包那是因为我们要导入javaee的api,首先点击最下面这个选择自己电脑上的路径然后就会自动导入上面的包,同时在jar库上也会出现转载于:https://www.cnblogs.com/fengnan/p/9311949.html

Java中的属性和方法

题目 实体类 测试类 转载于:https://www.cnblogs.com/maoxiuying/p/9130361.html

2019-06-13 Java学习日记之MySql

数据库概述&#xff1a; 1、什么是数据库&#xff0c;数据库有什么作用&#xff1f; 数据库就是存储数据的仓库&#xff0c;气本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&#xff0c;删除及…

windows下手动安装composer

1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件&#xff0c;写入“php "%~dp0composer.phar" %*” 3.把composer.bat composer.phar 两个文件放入 4.向环境变量里面写人“;D:\phpStudy\php\php-5.4.45;D:\phpStudy\php\php-5…