学习HTK,安装过后便进入第一个实例dial application
网上步骤写的很清楚,但是有一些没写到的,会报错的,我用红笔修改了,FYI。
整个系统分为四大部分,共有11步组成:
(一)数据准备
Step 1: The Task Grammar
Step 2: The Dictionary
Step 3: Recording the Data
Step 4: Creating theTranscription Files
Step 5: Coding the Data
(二)建立单音素的HMM模型
Step 6: Creating Flat Start Monophone
Step 7: Fixing the Silence Models
Step 8: Realigning the TrainingData
(三)创建绑定状态的三音素HMM模型
Step 9: Making Triphones fromMonophones
Step 10: Making Tied-StateTriphones
(四)识别器的评估
Step 11: Recognizing the TestData
下面是详细的实验步骤:
0.HTK的安装
网上很多教程了,可以参考http://blog.sina.com.cn/s/blog_436992740102uw1j.html
不过,额外需要做的是:
x11 在window下不能用,不能用HGraf.X.c 和 HGraf.null.c,用HGraf_WIN32.c
于是乎,自己动手,修改htk_htklib_nt.mkf(两处),将HGraf.null.obj替换为HGraf_WIN32.obj,HGraf.null.olv替换为 HGraf_WIN32.olv。
再按照README的步骤安装即可。
1.数据准备
需要录制训练数据和测试数据。为进行校准,还需要数据的标注文本。这里用任务语法(task grammar)产生真值文本(ground truth)。为了处理训练数据,需要定义一个语音集合和一个字典用以涵盖训练和测试数据中涉及的单词。
[step 1]任务语法定义
创建文件:gram
创建位置:根目录下
文件内容:
上面的语法是高层表示,必须通过HParse转成HTK可用的底层表示。
运行:
HParse gram wdnet
生成:wdnet
生成位置:根目录
生成内容:
[step 2]字典定义
创建文件夹:dict lists
创建文件:BEEP语音字典(网上可以下载)beep beep.ded(空) names(手工制作的专有人名的发音,包括SEND-START,SEND-END) name.ded
放入位置:dict
创建文件:global.ded
创建位置:根目录下
文件内容:
此例中利用BEEP语音字典,除去其中的重音符,并在每个发音后加入sp(short pause,小停顿)。如果有哑音标志,就用MP命令把sil和sp合并成sil。
创建文件:wlist
创建位置:lists
创建内容:
执行:
HDMan -m -w .\lists\wlist -g global.ded -n .\lists\monophones1 -l dlog .\dict\dict1 .\dict\beep .\dict\names
执行此句命令之前需要做到:
1、已下载beep词典,且已利用perl脚本将其排序
2、手写好names词典(因为beep不包括人名这些的发音,所以要自己手写)
3、wlist写好,(wlist是所有会出现的词的列表)
4、注意:每个词典都要在最后加一行blank line,不然会出现迷之报错。(本人就在这里卡住了几个小时,FYI)
生成文件:monophones1 (用于用到的音素列表)
生成位置:lists
生成文件:dlog(参数文件记录过程)
生成位置:根目录
生成文件:dict1
生成位置:dict
注1 :实际上,这里应该手工修改 dict1 ,为SENT-END 和SENT-START 加上无输出标志,
为了展示队后面步骤地影响,这里故意不添加。
注:HDMan工具的具体详细解释以及使用可以参看HTK BOOK P262
[step 3]录制语音数据
创建文件夹:labels
HSGen工具可以生成符合task grammar的句子,用来指导录音(HTK BOOK里叫sentence prompts):
执行:
HSGen -l -n 140 wdnet .\dict\dict1> .\labels\trainprompts(注意空格不能省略,不然会报错)
执行:
HSGen -l -n 15 wdnet .\dict\dict1> .\labels\testprompts(注意空格不能省略,不然会报错)
根据上述指令文件,录制相应的140个训练用语音数据文件和15个测试用语音数据文件。
生成文件:trainprompts testprompts
一个录制的例子如下:
HSLab .\data\Train\speech\S0001
[step 4]标注数据,得到真值文件
创建文件夹:scripts labels
创建文件:prompts2mlf(HTK scripts目录下自带)
创建位置:scripts
Perl脚本prompts2mlf(在scripts目录下HTK自带)可以把录音文本截成单词级真值文件。
执行:
perl .\scripts\prompts2mlf .\labels\trainwords.mlf .\labels\trainprompts
perl .\scripts\prompts2mlf .\labels\testwords.mlf .\labels\testprompts
注:要在每个lab路径之前加上“*/”
生成文件:trainwords.mlf testwords.mlf
生成位置:labels
标注编辑器HLEd可把单词级真值文本(wordlevel MLF)转成音素级真值文本(phonelevel MLF):
创建文件:mkphones0.led(注意末尾加一行blank line,不然会报错)
创建位置:根目录
创建内容:
EX命令表示按照字典dict1进行展开,IS表示在每个话语的前后插入标志,DE一行表示phones0.mlf中单词间不用sp隔开。
执行: HLEd -l * -d .\dict\dict1 -i .\labels\phones0.mlf mkphones0.led .\labels\trainwords.mlf
生成文件:phones0.mlf
生成位置:labels
注:HLEd工具的详细讲解可以参考HTK BOOK P284
Step 5: Coding the Data
创建文件夹:config
创建文件:config1(要设置的参数)
创建位置:config
这一步搞了好久,下面写几点理解:
1.step5这一步的目的是: to parameterise the raw speech waveforms into sequences of feature vectors
就是提取raw语料的mfcc特征参数,工具为:HCopy
2. wav格式的文件?
①如何得到? 如果使用Windows录音工具,那么是m4a格式的文件。注意,直接改后缀是不行的,虽然可以播放但是格式不正确,会报错not RIFF format(error6251)。所以正确的方式是使用编辑音频的软件或者转换格式的软件去改后缀,我用的是轻量级傻瓜编辑软件goldenwave,直接存为wav格式即可。
②如果input file是wav格式,那么需要在config文件中加上一行 SOURCEFORMAT = WAV ,因为默认是sig格式(也就是hslab可以录制出的一种格式)。
3.scp文件
To run HCopy, a list of each source file and its corresponding output file is needed. -------htkbook
我新建了hcopy.scp,内容为:
./sjy/waves/mine1.wav ./sjy/train/mine1.mfc
./sjy/waves/mine2.wav ./sjy/train/mine2.mfc
./sjy/waves/mine3.wav ./sjy/train/mine3.mfc
4.运行
HCopy -C .\config\config_wav -S hcopy.scp
即可看到生成了mfc文件且无报错
(但是目前我看到的mfc文件是乱码,所以后面继续做下去才能figure out是否正确)