基于HTK语音工具包进行孤立词识别的使用教程
选自:http://my.oschina.net/jamesju/blog/116151
1前言
最近一直在研究HTK语音识别工具包,前几天完成了工具包的安装编译和测试,这几天又按耐不住好奇,决定自己动手搞一搞,尝试一下用这个工具包,进行简单的孤立词识别,看了几天的文档,做了各种尝试,总算跌跌撞撞的实现了,把步骤记录下来,以后作为参考。
2孤立词识别系统
在本系统中我们将要实现三个词的识别系统,词汇集为:{brightness, channel,color}。
2.1搭建步骤
A:创建语料库,brightness, channel,color各录制5次。
B:声学分析,把wavform的声音文件转换为mfcc格式。
C:模型定义,为词典里面的每一个词建立一个HMM原型。
D:模型训练,HMM模型初始化和迭代。
E:问题定义,即语法定义。
F:对测试结合进行识别
G:评测
2.2 工作环境搭建
创建如下目录结构:
(1) data/:存储训练和测试数据(语音文件、语音标签、特征矢量文件)。子目录:data/train/lab data/train/wav data/train/mfcc data/test/lab data/test/wav data/test/mfcc
(2) analysis/: 存储声学分析步骤的文件
(3) training/: 存储初始化和训练步骤的文件
(4) model/: 存储识别系统的模型(HMMs)的相关文件。子目录:model/proto
(5) def/: 存储任务定义的相关文件
(6) test:/ 存储测试相关文件

2.3 标准HTK工具选项
一些标准选项对于每个HTK工具都是通用的。
(1) -A: 显示命令行参数
(2) -D: 显示配置设置
(3) -T 1: 显示算法动作的相关信息
完整的选项列表请参见:htkbook
3 语料库的准备
我们来录制{brightness, channel,color}这个三个词的读音。同时每个录音都要进行标注,也就是有一个文
本文件与其对应描述它的内容。
3.1 录音
我们将上述三个词各录制5次,保存为wav格式。并存放 在data/train/wav/brightness data/train/wav/channel data/train/wav/channel中。

3.2 标注
我们可以用相关的语音处理软件进行标注。并把标注的文件放到 data/train/lab/brightness data/train/lab/brightness data/train/lab/color中。

标注.lab文件的格式如下:

4 声学分析
从原始的声音文件转换为特征矢量文件:
需要创建的文件:
(1) analysis.conf
创建目录:training/
说明:配置文件,说明了特征矢量的特性
内容:

注:参数意义详见:htkbook
(1) targetlist_train.txt
创建目录:training/
说明:列出源文件和目的的文件的位置,即声音文件和特征文件
内容:

指令:Hcopy -A -D -C training/analysis.conf -S training/targetlist_train.txt
运行结果:

我们会看到:

5 HMM定义
需要创建的文件:hmm_brightness hmm_channel hmm_color hmm_silb hmm_sile
创建目录:model/proto
说明:用来定义单词的HMM模型
内容:
hmm_brightness:
~o <VecSize> 39 <MFCC_0_D_A>
~h "brightness"
<BeginHMM>
<NumStates> 10
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 3
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 4
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 5
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 6
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 7
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 8
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 9
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 10
0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<EndHMM>
注:hmm_channel hmm_color同hmm_brightness,不过最上面的名字要分别换成channel和color
hmm_silb:
~o <VecSize> 39 <MFCC_0_D_A>
~h "silb"
<BeginHMM>
<NumStates> 3
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 3
0.0 1.0 0.0
0.0 0.5 0.5
0.0 0.0 0.0
<EndHMM>
注:hmm_sile同hmm_silb,只修改名字就好。
6 HMM训练
6.1 初始化
需要创建的文件:
(1) trainlist_brightness.txt trainlist_channel.txt trainlist_color.txt trainlist_silb.txt trainlist_sile.txt
创建目录:training/
说明:特征矢量文件路径
内容:




(2) hmm0目录
创建目录:model/
说明:初始化后的HMM模型存放的位置
指令:
Hinit -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm0 -H model/proto/hmm_brightness -l brightness -L data/train/lab/brightness brightness
Hinit -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm0 -H model/proto/hmm_channel -l channel -L data/train/lab/channel channel
Hinit -A -D -T 1 -S training/trainlist_color.txt -M model/hmm0 -H model/proto/hmm_color -l color -L data/train/lab/color color
Hinit -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm0 -H model/proto/hmm_silb -l silb -L data/train/lab/brightness silb
Hinit -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm0 -H model/proto/hmm_sile -l sile -L data/train/lab/brightness sile
初始化之后我们可以再hmm0文件夹中看到:

6.2 训练
需要创建的目录:hmm1 hmm2 hmm3
创建位置: model/
每次,HRest迭代(即当前再估计迭代中的迭代)显示在屏幕上,通过change
量度标示收敛性。一旦这个量度值不再从一个HRest迭代到下个迭代减少(绝对值),过程就该停止了,迭代一般2-3次就可以了。
指令:
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm1 -H model/hmm0/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm2 -H model/hmm1/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_brightness.txt -M model/hmm3 -H model/hmm2/hmm_brightness -l brightness -L data/train/lab/brightness brightness
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm1 -H model/hmm0/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm2 -H model/hmm1/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_channel.txt -M model/hmm3 -H model/hmm2/hmm_channel -l channel -L data/train/lab/channel channel
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm1 -H model/hmm0/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm2 -H model/hmm1/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_color.txt -M model/hmm3 -H model/hmm2/hmm_color -l color -L data/train/lab/color color
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm1 -H model/hmm0/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm2 -H model/hmm1/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_silb.txt -M model/hmm3 -H model/hmm2/hmm_silb -l silb -L data/train/lab/brightness silb
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm1 -H model/hmm0/hmm_sile -l sile -L data/train/lab/brightness sile
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm2 -H model/hmm1/hmm_sile -l sile -L data/train/lab/brightness sile
HRest -A -D -T 1 -S training/trainlist_sile.txt -M model/hmm3 -H model/hmm2/hmm_sile -l sile -L data/train/lab/brightness sile

7.任务定义
7.1 建立语法规则和字典
需要创建的文件:
(1) gram.txt
创建的目录:def
说明:在使用我们的单词模型之前,要定义识别器的基本结构(任务语法)。我们首先定义最简单的语法:开始停顿、接着简单单词(这里指brightness, channel, color)、结束停顿。
内容:

注:用括号{}括住START_SIL和END_SIL表示其可不存在或者重复多次(允许在单词之前或之后长时间的停顿,或者根本没有停顿)。括号[]括住$WORD表示零个或一次出现(如果没有单词,可能只是识别停顿)。
(2) dict.txt
创建的目录:def
说明:系统要知道HMM模型与语法变量BRIGHTNESS、CHANNEL、COLOR、START_SIL和END_SIL的对应关系。这种信息存储在文本文件中,命名为任务字典。
内容:

7.2 网络
建立任务网络:
生成的文件:net.slf
命令:Hparse -A -D -T 1 def/gram.txt def/net.slf
运行结果:

8 识别
8.1 准备测试数据
需要准备的文件:
(1) hmmlist.txt
创建的目录:test/
说明:列出了要使用的模型的名字(brightness, channel,color,silb,sile) ,每个一行,最后要加一个空行。
内容:

(2) targetlist_test.txt
创建的目录:test/
内容:

命令:
Hcopy -A -D -C test/analysis.conf -S test/targetlist_test.txt
8.2 识别
基本方法:
需要创建的文件:
(1) result文件夹
(2) reco.mlf
创建的目录:result/
初始内容:
#!MLF!#
(3) hmmsdef.mmf
创建的目录:test
命令等同于:-H model/hmm3/hmm_brightness -H model/hmm3/hmm_channel -H model/hmm3/hmm_color -H model/hmm_silb -H model/hmm3/hmm_sile
内容:hmm3中的所有文件的内容一起粘贴。
注意:只保留一个"~O"
命令:
Hvite -A -D -T 1 -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt data/test/mfcc/brightness/brightness1.mfcc
结果会在reco.mlf中显示:

交互方式:
需要创建的文件:
directin.conf
创建的目录:test
说明:是Hvite的配置文件,允许使用直接音频输入,为了允许从输入信号中直接提取声学系数,这个文件必须包含前面训练数据使用的声学分析配置参数。
内容:

指令:
Hvite -A -D -T 1 -C test/directin.conf -g -H test/hmmsedf.mmf -w def/net.mlf def/dict.txt test/hmmlist.txt
9 性能测试
9.1 主标签文件
在性能评测之前,我们需要创建两个文件,命名为主标签文件,扩展名是.mlf:
·第一个文件包含整个训练集的正确副本,即是通过手工标注的副本。把ref.mlf记作参考副本。
·第二个文件包含整个测试集的识别副本,即识别器产生的假设副本。把reco.mlf记为识别副本。
通过比较每项数据的参考副本和识别假设,进行性能评测。
内容:
ref.mlf

需要创建的文件:testlist.txt
说明:测试路径
内容:

命令:
Hvite -A -D -T 1 -S test/testlist.txt -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt
运行之后会看到:
reco.mlf中:

9.2 错误率
需要创建的文件:
labellist.txt
说明:出现在副本文件中的标签列表
创建的目录:result
内容:

results.txt
创建的目录:result
说明:存放错误率结果
命令:
HResults -A -D -T 1 -e ??? sil -
I result/ref.mlf result/labellist.txt result/reco.mlf > result/results.txt
最后显示结果为:

注:由于选取的数据集很小只有9个词,非常有限,所以识别率是100%。
第一行(SENT)给出句子的识别率(%Correct=100.00),第二行(WORD)给出的是单词的识别率(%Corr=100.00)。上图中,这两个比率是相同的,这是因为我们的任务语法仅使用一个单词(除了停顿之外)作为句子。这是孤立词识别任务。这里只要考虑第一行(SENT)就够了。H=9 给出的是测试数据被正确识别的数量,S=0,表示识别相反的数量。N=0表示测试数据总数。
10 总结
经过了几天的学习和测试,终于完成了基于HTK工具包进行孤立词识别的工作,掌握了孤立词识别的基本使用方法,具体的细节参数使用在日后的工作中还需要再斟酌。
基于HTK语音工具包进行孤立词识别的使用教程的更多相关文章
- 机器学习&数据挖掘笔记_13(用htk完成简单的孤立词识别)
最近在看图模型中著名的HMM算法,对应的一些理论公式也能看懂个大概,就是不太明白怎样在一个具体的机器学习问题(比如分类,回归)中使用HMM,特别是一些有关状态变量.观察变量和实际问题中变量的对应关系, ...
- 亲自动手用HTK实现YES NO孤立词识别
很久以前的发在研学论坛的帖子了,再重新整理了一下,希望对新手有用. 完整版链接:http://yun.baidu.com/s/1hapcE 第一步 创建语音文件 录音 命令:HSLab any_nam ...
- 如何用kaldi做孤立词识别-初版
---------------------------------------------------------------------------------------------------- ...
- yesno孤立词识别kaldi脚本
path.sh主要设定路径等 export KALDI_ROOT=`pwd`/../../.. [ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ ...
- 如何用kaldi做孤立词识别三
这次wer由15%下降到0%了,后面跑更多的模型 LOG (apply-cmvn[5.2.124~1396-70748]:main():apply-cmvn.cc:162) Applied cepst ...
- 如何用kaldi做孤立词识别二
基本模型没有变化,主要是调参,配置: %WER 65% 下降到了 15% 后面再继续优化... Graph compilation finish!steps/decode.sh -- ...
- [转]Kaldi命令词识别
转自: http://www.jianshu.com/p/5b19605792ab?utm_campaign=maleskine&utm_content=note&utm_medium ...
- ros下基于百度语音的,语音识别和语音合成
代码地址如下:http://www.demodashi.com/demo/13153.html 概述: 本demo是ros下基于百度语音的,语音识别和语音合成,能够实现文字转语音,语音转文字的功能. ...
- PHP:基于百度大脑api实现OCR文字识别
有个项目要用到文字识别,网上找了很多资料,效果不是很好,偶然的机会,接触到百度大脑.百度大脑提供了很多解决方案,其中一个就是文字识别,百度提供了三种文字识别,分别是银行卡识别.身份证识别和通用文字识别 ...
随机推荐
- Game Programming Pattern
http://gameprogrammingpatterns.com/contents.html
- php生成excle
方法一: 新建index.php,代码如下 <?php header("Content-type:application/vnd.ms-excel"); header(&qu ...
- 扩展服务 修改新增Service的默认主题
问题描述:想要在F:\PHPnow-1.5.6\htdocs\yt\Yourphp\Tpl\ 目录下新增一个Service\Default(A) 和Service\new(B) 两个主题 ...
- Xcode文档安装
找到所需文档的下载地址,搜索.dmg 安装位置
- RobotFramework——介绍篇
1.简介Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行.主要用于轮次很多的验 ...
- Crontab的格式
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...
- python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...
- asp.net mvc 4 高级编程学习笔记:第四章 模型
数据模型 数据模型及O/R转化,采用EntityFramework实现. 可以采用firstCode模型,首先定义模型,通过模型生成数据库,也可以通过安装EFPowerTools,通过数据库自动生成对 ...
- VisualStudio基本使用(2)-使用VS2013来编译C语言程序
切换到C语言程序所有目录,执行cl test.c
- [译]git init
git init git init命令用来创建一个新的Git仓储.可以用在一个已经存在的但是没有受Git版本控制的项目,或者用来初始化一个全新的没有任何文件的空仓储.git init通常是你开始一个新 ...