1.数据准备
[command] HSLab one.wav
[Rec ] 开始录音
[Stop ] 录音结束
[Mark ] 选择需要标注的区域
[Labelas] 输入标注 回车确定
[Save ] 保存
孤立词标注3个部分:起始静音(sil) 词语音(one) 结束静音(sil)
按照上述步骤,录制训练集和测试集
编写EBNF文法,并生成最终的解码网络
[command] HParse -T 1 gram.txt net.sf
[gram.txt]
# WORD = one | two | three;
# ({start_sil}[$WORD]{end_sil})
2.特征提取
[command ] HCopy -C hcopy.conf -S train.mfcc.list -A -D -T 1
-C 配置文件
-S 特征提取的列表文件
-A 显示命令行参数
-D 显示配置设置
-T 1 显示算法动作的相关信息
[hcopy.conf]
OURCEFORMAT = HTK
SOURCERATE = 625
TARGETKIND = MFCC_0_D_A
TARGETRATE = 100000
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCEPS = 12
注:
SOURCERATE = 625
#T = 62500ns = 0.0625ms = 0.0000625s, sample = 1/T = 1/0.0000625 = 16000 = 16kHz
#T = 1250ns = 0.1250ms = 0.0001250s, sample = 1/T = 1/0.0001250 = 8000 = 8kHz
TARGETRATE = 100000
#T = 10ms
WINDOWSIZE = 250000
#T = 25ms
# |_ _ _ _ _|
# | |_ _ _ _ _|
# | | |
# A B C
# A-->B: TARGETRATE(frame move)
# A-->C: WINDOWSIZE(frame length)
[train.mfcc.list]
/disk2/data/train/one.wav /disk2/data/train/one.mfcc
....
3.初始化hmm模型
[command] HInit -A -D -T 1 -i 10 -L data/train/lab/one/ -C data/hinit.conf -M hmm/hmm.0/ proto/one data/train/wav/one_*.mfcc
[proto/one] 需要人工生成hmm的基础结构文件
4.多次迭代hmm模型
[command] HRest -A -D -T 1 -i 10 -L data/train/lab/one/ -C data/hrest.conf -M hmm/hmm.1/ hmm/hmm.0/one data/train/wav/one_*.mfcc
训练hmm模型,其实就是训练每个孤立词的hmm,和字典的的内容的对应关系如下:
[dict]
#S_SIL sil
#E_SIL sil
#one ON
#two TW
#three TH
假如字典如上,那么我们训练的hmm模型就是sil,ON,TW,TH的hmm模型,然后多次迭代,产生每个音素的hmm模型
然后将所有的音素的hmm模型合并,并去除其中的
#~o
#<STREAMINFO> 1 39
#<VECSIZE> 39<NULLD><MFCC_D_A_0><DIAGC>
只在开始的位置保留一次,这样就产生了所有音素的一个hmm模型
5.解码及测试
[command] HVite -A -D -T 1 -H hmm/hmm.3/hmmdef -l test/ -w netlattce/net.sf netlattce/dict netlattce/hmmlist data/test/wav/*.mfcc
[hmmlist] 每个音素自成一行
[command] HResults -A -D -T 1 -I ref.mlf lab.lst rec.mlf
[ref.mlf]
# #!MLF!#
# "*/one.lab"
# 2300 4500000 one
# .
[rec.mlf]
# #!MLF!#
# "*/one.lab"
# 2300 4500000 one -1245
# .
屏幕会输出最终的识别结果