应用HTK搭建语音拨号系统2:创建单音素HMM模型
选自:http://maotong.blog.hexun.com/6204849_d.html
苏统华
哈尔滨工业大学人工智能研究室
2006年10月30日
声明:版权所有,转载请注明作者和来源
该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词(sub-word, eg. 音素),具有一定的可扩充性。当加入一个新名字时,只需修改发音词典和任务语法即可。模型为连续混合高斯输出,运用语音决策树聚类形成的绑定状态式三音素。
2. 创建单音素HMM模型
涉及创建一系列单高斯单音素HMM的过程。
[step 6]一致初始法创建单音素模型
定义一个原始模型proto:
|
文件名:proto |
|
~o <VecSize> 39 <MFCC_0_D_A> ~h "proto" <BeginHMM> <NumStates> 5 <State> 2 <Mean> 39 0.0 (x39) <Variance> 39 1.0 (x39) <State> 3 <Mean> 39 0.0 (x39) <Variance> 39 1.0 (x39) <State> 4 <Mean> 39 0.0 (x39) <Variance> 39 1.0 (x39) <TransP> 5 0.0 1.0 0.0 0.0 0.0 0.0 0.6 0.4 0.0 0.0 0.0 0.0 0.6 0.4 0.0 0.0 0.0 0.0 0.7 0.3 0.0 0.0 0.0 0.0 0.0 <EndHMM> |
训练文件存于train.scp中,用全局均值和方差来初始化HMM模型的高斯参数:
HCompV -C .\config\config1 -f 0.01 -m -S train.scp -M .\hmms\hmm0 proto
注4:也可以省掉-C参数,只要train.scp里是特征文件列表,并且特征是MFCC_0_D_A
在目录hmm0下生成了更新后的proto和一个截至宏vFloors。基于.\hmms\hmm0\下的两个文件,手工制作主宏文件(Master Macro File)hmmdefs和与vFloors相关的宏macro,具体制作过程见HTK book,压缩包中有实例。
由于暂时不用sp模型,删去monophones1中的sp,构成monophones0文件,重估参数:
HERest -C .\config\config1 -I .\labels\phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm0\macros -H .\hmms\hmm0\hmmdefs -M .\hmms\hmm1 .\lists\monophones0
同上,重复估计两次:
HERest -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\monophones0
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\monophones0
注5:为节省空间,也因为上面三步很简单(想出错都难),hmm1和hmm2下的模型文件并没有包含在压缩包里。但hmm3下的模型文件包含在压缩包里了(因为下一步要用到)。
[step 7]修补哑音素模型
对sil模型加入回溯链,对sp绑定到sil的中间状态上。具体的,哑音素模型按下面两步执行。首先,修改hmm3\hmmdef,复制sil的中间状态为sp模型的唯一状态,另存到\hmms\hmm4目录下。然后,指明sp绑定到sil中间状态,利用HHEd加入回溯转移概率:
HHEd -H .\hmms\hmm4\macros -H .\hmms\hmm4\hmmdefs -M .\hmms\hmm5 sil.hed .\lists\monophones1
修改mkphones0.led,去掉最后一行,存为mkphones1.led,利用HLEd工具得到包含sp的音素级真值文本:
HLEd -l * -d .\dict\dict1 -i .\labels\phones1.mlf mkphones1.led .\labels\trainwords.mlf
重估两次:
HERest -C .\config\config1 -I .\labels\phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm5\macros -H .\hmms\hmm5\hmmdefs -M .\hmms\hmm6 .\lists\monophones1
HERest -C .\config\config1 -I .\labels\phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm6\macros -H .\hmms\hmm6\hmmdefs -M .\hmms\hmm7 .\lists\monophones1
注6:hmm5和hmm6下的模型文件并没有包含在压缩包里。为了进行下面的阶段性测试,hmm7下的模型文件包含在压缩包里了。
这么没头没尾的干下去,太枯燥了!我们先看看这时的识别率如何吧,也能增加一点成就感。执行如下命令:
HVite -H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -S test.scp -l * -i .\results\recout_step7.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict1 .\lists\monophones1
HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7.mlf
输出结果如下:
|
====================== HTK Results Analysis ======================= Date: Mon Oct 30 20:20:52 2006 Ref : .\labels\testwords.mlf Rec : .\results\recout_step7.mlf ------------------------ Overall Results -------------------------- SENT: %Correct=0.00 [H=0, S=15, N=15] WORD: %Corr=94.12, Acc=41.18 [H=64, D=0, S=4, I=36, N=68] ============================================================== |
看着上面的结果,你不感到奇怪么?话语级识别正确率怎么是零!通过分析识别输出文件recout_step7.mlf,发现在每一句上都加上了SENT-START和SENT-END。这是与标注真值文本无法完全吻合的黑手呀!一个解决办法是在运行HResults时加入-e选项来忽略掉SENT-START和SENT-END,如下所示:
HResults -e ??? SENT-START -e ??? SENT-END -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7.mlf
这时的输出结果:
|
====================== HTK Results Analysis ======================= Date: Mon Oct 30 20:33:27 2006 Ref : .\labels\testwords.mlf Rec : .\results\recout_step7.mlf ------------------------ Overall Results -------------------------- SENT: %Correct=66.67 [H=10, S=5, N=15] WORD: %Corr=94.12, Acc=85.29 [H=64, D=0, S=4, I=6, N=68] =============================================================== |
上面的方案可以解决问题,但不是很完美。应该在获得的识别结果中(recount_step7.mlf)不产生SENT-START和SENT-END才好。分析dict1字典发现,对应SENT-START和SENT-END的相关信息如下:
SENT-END sil
SENT-START sil
应该加入[]以表示他们并不输出任何东西。把dict1字典另存为dict2并替换上面两行成如下形式:
SENT-END [] sil
SENT-START [] sil
重新运行问题解决。相应的,HResults的参数可以省掉-e了:
HVite -H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -S test.scp -l * -i .\results\recout_step7_2.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict2 .\lists\monophones1
HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step7_2.mlf
[step 8]重校准训练数据
确认trainwords.mlf中的路径为”*/S0???.lab”,修改dict2 加入silence sil一项,另存为dict3,执行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\dict3 .\lists\monophones1
重估两次:
HERest -C .\config\config1 -I .\labels\aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm7\macros -H .\hmms\hmm7\hmmdefs -M .\hmms\hmm8 .\lists\monophones1
HERest -C .\config\config1 -I .\labels\aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm8\macros -H .\hmms\hmm8\hmmdefs -M .\hmms\hmm9 .\lists\monophones1
我们再来看看这时的识别率怎么样。
HVite -H .\hmms\hmm9\macros -H .\hmms\hmm9\hmmdefs -S test.scp -l * -i .\results\recout_step8.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict2 .\lists\monophones1
HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step8.mlf
这时的输出结果:
|
====================== HTK Results Analysis ======================= Date: Mon Oct 30 21:06:51 2006 Ref : .\labels\testwords.mlf Rec : .\results\recout_step8.mlf ------------------------ Overall Results -------------------------- SENT: %Correct=73.33 [H=11, S=4, N=15] WORD: %Corr=97.06, Acc=88.24 [H=66, D=0, S=2, I=6, N=68] =============================================================== |
可以看出,识别结果比校准前有不小的提高。我们继续重估两次测试一下结果,看看会出现什么情况:
HERest -C .\config\config1 -I .\labels\aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm9\macros -H .\hmms\hmm9\hmmdefs -M .\hmms\hmm9_1 .\lists\monophones1
HERest -C .\config\config1 -I .\labels\aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmms\hmm9_1\macros -H .\hmms\hmm9_1\hmmdefs -M .\hmms\hmm9_2 .\lists\monophones1
HVite -H .\hmms\hmm9\macros -H .\hmms\hmm9\hmmdefs -S test.scp -l * -i .\results\recout_step8_2.mlf -w wdnet -p 0.0 -s 5.0 .\dict\dict2 .\lists\monophones1
HResults -I .\labels\testwords.mlf .\lists\monophones1 .\results\recout_step8_2.mlf
识别结果如下:
|
====================== HTK Results Analysis ======================= Date: Mon Oct 30 21:18:34 2006 Ref : .\labels\testwords.mlf Rec : .\results\recout_step8_2.mlf ------------------------ Overall Results -------------------------- SENT: %Correct=73.33 [H=11, S=4, N=15] WORD: %Corr=97.06, Acc=88.24 [H=66, D=0, S=2, I=6, N=68] ============================================================== |
发现识别结果提高有限!下面通过绑定状态的三音素模型来进一步提高识别效果。
注7:hmm8和hmm9_1下的模型文件并没有包含在压缩包里。
应用HTK搭建语音拨号系统2:创建单音素HMM模型的更多相关文章
- 应用HTK搭建语音拨号系统1:数据准备
选自:http://maotong.blog.hexun.com/6204849_d.html 应用HTK搭建语音拨号系统--数据准备 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声 ...
- 应用HTK搭建语音拨号系统3:创建绑定状态的三音素HMM模型
选自:http://maotong.blog.hexun.com/6261873_d.html 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声明:版权所有,转载请注明作者和来源 该系 ...
- 应用HTK搭建语音拨号系统4: 识别器评估
选自:http://maotong.blog.hexun.com/6261890_d.html 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声明:版权所有,转载请注明作者和来源 该系 ...
- HTK搭建语音拨号系统实验材料下载
选自:http://maotong.blog.hexun.com/6267266_d.html 压缩包包括全部的配置文件,脚本文件,必备的模型文件和实验手册. 全部实验材料的下载链接: 1 http: ...
- SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04
摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...
- 如何使用laravel搭建后台登录系统
今天想用laravel搭建一个后台系统,就需要最简单的那种,有用户登录系统,试用了下,觉得laravel的用户登录这块做的还真happy.当然,前提就是,你要的用户管理系统是最简单的那种,就是没有用户 ...
- 超强教程:如何搭建一个 iOS 系统的视频直播 App?
现今,直播市场热火朝天,不少人喜欢在手机端安装各类直播 App,便于随时随地观看直播或者自己当主播.作为开发者来说,搭建一个稳定性强.延迟率低.可用性强的直播平台,需要考虑到部署视频源.搭建聊天室.优 ...
- C#采用rabbitMQ搭建分布式日志系统
网上对于java有很多开源的组件可以搭建分布式日志系统,我参考一些组件自己开发一套简单的分布式日志系 全部使用采用.NET进行开发,所用技术:MVC.EF.RabbitMq.MySql.Autofac ...
- 搭建前端监控系统(四)Js截图上报篇
===================================================================== 前端监控系统: DEMO地址 GIT代码仓库地址 ==== ...
随机推荐
- 学海无涯的整理Ing..........
1.文章:Understanding JavaScript Function Invocation and “this” http://yehudakatz.com/2011/08/11/unders ...
- EF 索引
public class CustomerMap : EntityTypeConfiguration<Customer> { public CustomerMap() { this.Pro ...
- .net利用NPOI导入导出Excel
NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...
- mac安装mongodb
一,安装方法1 ,下载mongodb 1,官网下载mongodb程序 https://www.mongodb.org/downloads#production 2,解压后启动mongodb服务 下载 ...
- C++ Const引用详解
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...
- ASP.NET Web数据控件
ASP.NET Web数据控件 1.数据控件简介 这包括数据源控件和格式设置控件,前者使您可以使用 Web 控件访问数据库中的数据,后者使您可以显示和操作ASP.NET 网页上的数据. 2.数据控件 ...
- Eclipse经常报Unhandled event loop exception的原因
在公司的电脑上,Eclipse经常报Unhandled event loop exception 错误,非常频繁,通过搜索发现是因为电脑上安装了百度杀毒导致的.... 无语 另外 teamviewer ...
- 71 mac boook pro 无 gpu 下caffe 安装
71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...
- 【C语言入门教程】2.3 整型数据
没有小数位或指数的数据类型被称为整型数据,根据使用方法的分类,整型数据可分为整型常量和整型变量.根据定义或显示的数制分类,可分为十进制.八进制和十六进制. 2.3.1 整型常量 整型常量是在运算中不可 ...
- EF接触03
emdx文件解读: