基于HTK的语音拨号系统

基于 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章 jquery.validate使用攻略1 第二章 jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = 'ye wen jun';let ans = name.replace(/\s/g, '&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod("letters", function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) <script type="text/javascript"> function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from "@/utils/validate"; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: <!-- 表单 --> <el-form ref="rulesForm" :rules="formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 <input type="text" maxlength="5" /> //可以 <input type="number" maxlength="5" /> //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 <input type="text" onkeyup="value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf