HTK 是一个语音识别的工具包。
Julius 是一个语音处理的工具包,这里只用到它的语音任务语法和麦克风输入功能(HTK 不支持 Mac 上的麦克风输入)。
Audacity 是一个录制语音、制作音频文件的工具。
系统:macOS High Sierra(Version 10.13.2)
实验数据:https://github.com/ericzhong/learn-htk。
代码仓库中的一些脚本是从 HTK-samples-3.4.1.tar.gz
里面复制过来的,比如 makesp、maketrihed、mkclscript、prompts2mlf、prompts2wlist、quests.hed。它们都是一些辅助性的脚本,用来转换文本格式或生成一些模板。
到官方注册后下载源码包和《The HTK Book》。
如果是 macOS,先安装 XQuartz
,然后配置环境如下:
ln -s /opt/X11/include/X11 /usr/local/include/X11
export LIBRARY_PATH="/opt/X11:/opt/X11/lib"
编译:
tar xvf HTK-3.4.1.tar.gz
cd htk
./configure --prefix=`pwd`
make all
make install
设置环境变量:
export PATH=`pwd`/bin:$PATH
在 macOS 平台建议用 HomeBrew 安装,因为从源码编译需要安装很多依赖:
brew install julius
到 Audacity 官网下载安装包后手动安装。
执行如下命令应该输出正常软件信息:
HVite -V
julius
创建文件 sample.grammar
:
S : NS_B SENT NS_E
SENT: CALL_V NAME_N
SENT: DIAL_V DIGIT
创建文件 sample.voca
:
% NS_B
<s> sil
% NS_E
</s> sil
% CALL_V
PHONE f ow n
CALL k ao l
% DIAL_V
DIAL d ay ah l
% NAME_N
STEVE s t iy v
YOUNG y ah ng
% DIGIT
FIVE f ay v
FOUR f ao r
NINE n ay n
EIGHT ey t
OH ow
ONE w ah n
SEVEN s eh v ah n
SIX s ih k s
THREE th r iy
TWO t uw
ZERO z iy r ow
上面两个文件的前缀必须相同(仅后缀不同),然后执行:
mkdfa.pl sample
生成三个文件 sample.dfa
、sample.term
、sample.dict
。
最后,随机生成一些符合语法的句子看看:
$ generate sample
Stat: init_voca: read 18 words
Reading in term file (optional)...done
6 categories, 18 words
DFA has 6 nodes and 6 arcs
-----
<s> DIAL THREE </s>
<s> DIAL SEVEN </s>
<s> DIAL FIVE </s>
<s> DIAL SIX </s>
<s> DIAL ZERO </s>
<s> DIAL OH </s>
<s> CALL YOUNG </s>
<s> PHONE STEVE </s>
<s> CALL STEVE </s>
<s> DIAL TWO </s>
.grammar
是语法文件,类似 BNF 格式。固定符号S
表示开始,其它左边的都可看做变量。右边剩下的(即没有出现在左边的)都叫做单词分类(word category),它们必须在.voca
文件中定义。
.voca
是一个字典文件。比如上面的% NAME_N
表示人名分类,接着每一行是一个人名,右边是单词的发音(可以到后面会提到的发音字典VoxForgeDict.txt
中查找)。如果一个单词有多个发音,可以定义多行。NS_B
和NS_E
表示语音开始和结束时的静音(silence)。
mkdfa.pl
是一个语法编译器,将.grammar
和.voca
文件编译成.dfa
、.term
(包含有限自动机信息)和.dict
(包含所有单词的发音)文件。
创建 prompts.txt
:
*/S001 DIAL ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE OH ZERO
*/S002 DIAL ONE THREE FIVE SEVEN NINE ZERO TWO FOUR SIX EIGHT OH
*/S003 DIAL ZERO NINE SEVEN FIVE THREE ONE OH EIGHT SIX FOUR TWO
*/S004 DIAL ONE ONE TWO TWO THREE THREE FOUR FOUR FIVE FIVE
*/S005 DIAL SIX SIX SEVEN SEVEN EIGHT EIGHT NINE NINE OH OH ZERO ZERO
*/S006 PHONE STEVE YOUNG CALL STEVE YOUNG
*/S007 PHONE STEVE CALL STEVE PHONE YOUNG CALL YOUNG
*/S008 PHONE PHONE STEVE STEVE CALL CALL YOUNG YOUNG
*/S009 MEASURE LEISURE AND LEISURE MEASURE
*/S010 COMPLAIN CHAMPLAIN AIRPLANE ELAINE EXPLAIN
*/S011 BOOKENDS KENNEL KENNETH KENYA WEEKEND
*/S012 BELT BELOW BEND AEROBIC DASHBOARD DATABASE
*/S013 GATEWAY GATORADE GAZEBO AFGHAN AGAINST AGATHA
*/S014 ABALON ABDOMINALS BODY ABOLISH
*/S015 ABOUNDING ABOUT ACCOUNT ALLENTOWN
*/S016 ACHIEVE ACTUAL ACUPUNCTURE ADVENTURE
*/S017 ALGORITHM ALTHOUGH ALTOGETHER ANOTHER
*/S018 BATTLE BEATLE LITTLE METAL
*/S019 BITTEN BLATANT BRIGHTEN BRITAIN
*/S020 BROOKHAVEN HOOD BROUHAHA BULLHEADS
*/S021 BUSBOYS CHOICE COILS COIN
*/S022 COLLECTION COLORATION COMBINATION COMMERCIAL
*/S023 MIDDLE NEEDLE POODLE SADDLE
*/S024 ALRIGHT ARTHRITIS BRIGHT COPYRIGHT CRITERIA RIGHT
*/S025 COUPLE CRADLE CRUMBLE
*/S026 CUBA CUBE CUMULATIVE
*/S027 CURING CURLING CYCLING
*/S028 CYNTHIA DANFORTH DEPTH
*/S029 DIGEST DIGITAL DILIGENT
*/S030 AMNESIA ASIA AVERSION BEIGE BEIJING
*/S031 HELP HELLO HELMET HELPLESS AHEAD HELP
*/S032 VOXFORGE HOME READ LISTEN FORUMS DEVELOPER ABOUT HOWTO TUTORIAL
*/S033 RHYTHMBOX PLAY START NEXT SKIP FORWARD PREVIOUS BACK
*/S034 MUSIC SHOW WHO ABOUT INFORMATION UP LOUDER DOWN LOWER
*/S035 PLAYER SOFTER SILENCE STOP QUIET
*/S036 COMPUTER WEATHER EMAIL VOLUME LOUDER SOFTER
*/S037 COMPUTERIZE AMPUTATE MINICOMPUTER PUMA'S PEWTER
*/S038 ACUTE AMPUTATION BOOTERS CONTRIBUTOR'S ALOUETTE GIFTWARE GLADWELL
*/S039 MAYWEATHER WHETHER WOODSTREAM ARTILLERYMAN CREMATION DAIRYMAID FEMALE
*/S040 ISHMAEL'S LANCEDALE LAVAL VOLATILE SCALIA SOLUBLE SUPERVALUE VALUATION
执行如下命令,将上面文件中的单词排序并去重,并插入起止符号:
./prompts2wlist prompts.txt wlist.tmp
echo -e "SENT-END\nSENT-START" >> wlist.tmp
sort wlist.tmp > wlist
rm wlist.tmp
创建配置文件 global.ded
:
AS sp
RS cmu
MP sil sil sp
AS
= Append Silence,在每个发音后面追加sp
。RS
= Remove Stress,cmu
= Carnegie Melon University,这是当前唯一会在字典中使用重音标记的系统。MP
= Merge Phones,即 sil = sil + sp。
sil
表示每个标注(transcription,即prompts.txt
中的每行)前后的静音,sp
表示每个单词后的停顿(short pause)。
执行如下命令,生成文件 dict
(单词的发音)、monophones1
(单词涉及的音素)和 dlog
(日志):
wget https://raw.githubusercontent.com/VoxForge/develop/master/lexicon/VoxForgeDict.txt
HDMan -m -w wlist -n monophones1 -i -l dlog dict VoxForgeDict.txt
# 创建一个没有 sp 的副本
cp monophones1 monophones0
sed -i "" '/^sp$/d' monophones0
《HTK Book》建议所有命令使用标准选项
-A -D -V -T 1
,表示打印所有参数、打印配置信息、打印工具版本信息和工具使用的模块信息、打印 Trace 信息。
VoxForgeDict.txt
是一个源字典文件(source dictionary),它包含所有常用单词及发音。HDMan
以它为参照,为wlist
中的单词生成相同格式的字典文件dict
。monophones1
包含wlist
中的单词涉及到的所有音素。
设置 Audacity
如下,然后重启生效:
Audacity -> Preferences... -> Quality -> Default Sample Rate -> 16000 HZ
Audacity -> Preferences... -> Quality -> Default Sample Format -> 16-bit
Audacity -> Preferences... -> Devices -> Recording -> Channels -> 1(Mono)
为 prompts.txt
中的文本录音。每行对应一个音频文件,第一列是文件名前缀。
比如第一个文件 S001.wav
的录音内容为:
DIAL ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE OH ZERO
波形应该在 -1.0~1.0 之间。
保存时选择:
File -> Export -> Export as WAV
然后将这些文件放到 waves/
目录下面。
生成文件 words.mlf
(注意参数顺序):
./prompts2mlf words.mlf prompts.txt
创建配置文件 mkphones0.led
:
EX
IS sil sil
DE sp
创建配置文件 mkphones1.led
:
EX
IS sil sil
EX
= expand,将单词扩展为音素。IS
= Insert,在每行标注的开始和结束插入sil
。DE
= Delete,删除所有sp
。
生成标注文件(一个有 sp
,一个没有):
HLEd -l '*' -d dict -i phones0.mlf mkphones0.led words.mlf
HLEd -l '*' -d dict -i phones1.mlf mkphones1.led words.mlf
MLF
文件格式可集多个标注文件为一个。phones.mlf
是基于音素的多个标注文件集合。HLEd
= Label Editor,用于编辑标注文件,可将其中的单词扩展为音素,并做一些修改。标注文件(label file):就是语音文件的一个目录,类似 CD 中的歌曲目录一样,在这里就变成了单词或音素。
创建文件 codetrain.scp
:
./waves/S001.wav ./train/S001.mfc
./waves/S002.wav ./train/S002.mfc
./waves/S003.wav ./train/S003.mfc
./waves/S004.wav ./train/S004.mfc
./waves/S005.wav ./train/S005.mfc
./waves/S006.wav ./train/S006.mfc
./waves/S007.wav ./train/S007.mfc
./waves/S008.wav ./train/S008.mfc
./waves/S009.wav ./train/S009.mfc
./waves/S010.wav ./train/S010.mfc
./waves/S011.wav ./train/S011.mfc
./waves/S012.wav ./train/S012.mfc
./waves/S013.wav ./train/S013.mfc
./waves/S014.wav ./train/S014.mfc
./waves/S015.wav ./train/S015.mfc
./waves/S016.wav ./train/S016.mfc
./waves/S017.wav ./train/S017.mfc
./waves/S018.wav ./train/S018.mfc
./waves/S019.wav ./train/S019.mfc
./waves/S020.wav ./train/S020.mfc
./waves/S021.wav ./train/S021.mfc
./waves/S022.wav ./train/S022.mfc
./waves/S023.wav ./train/S023.mfc
./waves/S024.wav ./train/S024.mfc
./waves/S025.wav ./train/S025.mfc
./waves/S026.wav ./train/S026.mfc
./waves/S027.wav ./train/S027.mfc
./waves/S028.wav ./train/S028.mfc
./waves/S029.wav ./train/S029.mfc
./waves/S030.wav ./train/S030.mfc
./waves/S031.wav ./train/S031.mfc
./waves/S032.wav ./train/S032.mfc
./waves/S033.wav ./train/S033.mfc
./waves/S034.wav ./train/S034.mfc
./waves/S035.wav ./train/S035.mfc
./waves/S036.wav ./train/S036.mfc
./waves/S037.wav ./train/S037.mfc
./waves/S038.wav ./train/S038.mfc
./waves/S039.wav ./train/S039.mfc
./waves/S040.wav ./train/S040.mfc
创建配置文件 wav_config
(配置含义见《HTK Book》的 Chapter 5 - Speech Input/Output 章节):
SOURCEFORMAT = WAV
TARGETKIND = MFCC_0_D
TARGETRATE = 100000.0
SAVECOMPRESSED = T
SAVEWITHCRC = T
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
NUMCEPS = 12
生成向量:
mkdir train
HCopy -C wav_config -S codetrain.scp
创建模板文件 proto
:
~o <VecSize> 25 <MFCC_0_D_N_Z>
~h "proto"
<BeginHMM>
<NumStates> 5
<State> 2
<Mean> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<State> 3
<Mean> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<State> 4
<Mean> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<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>
创建配置文件 config
:
TARGETKIND = MFCC_0_D_N_Z
TARGETRATE = 100000.0
SAVECOMPRESSED = T
SAVEWITHCRC = T
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
NUMCEPS = 12
注意,上面两个文件中的 MFCC_0_D_N_Z
是相匹配的。
创建配置文件 train.scp
:
./train/S001.mfc
./train/S002.mfc
./train/S003.mfc
./train/S004.mfc
./train/S005.mfc
./train/S006.mfc
./train/S007.mfc
./train/S008.mfc
./train/S009.mfc
./train/S010.mfc
./train/S011.mfc
./train/S012.mfc
./train/S013.mfc
./train/S014.mfc
./train/S015.mfc
./train/S016.mfc
./train/S017.mfc
./train/S018.mfc
./train/S019.mfc
./train/S020.mfc
./train/S021.mfc
./train/S022.mfc
./train/S023.mfc
./train/S024.mfc
./train/S025.mfc
./train/S026.mfc
./train/S027.mfc
./train/S028.mfc
./train/S029.mfc
./train/S030.mfc
./train/S031.mfc
./train/S032.mfc
./train/S033.mfc
./train/S034.mfc
./train/S035.mfc
./train/S036.mfc
./train/S037.mfc
./train/S038.mfc
./train/S039.mfc
./train/S040.mfc
执行如下命令,计算训练数据(即 MFCC 向量)的均值和协方差:
mkdir hmm0
HCompV -C config -f 0.01 -m -S train.scp -M hmm0 proto
执行如下脚本,为音素 + sil
创建模板:
text="$(sed -n '/<BEGINHMM>/,/<ENDHMM>/'p hmm0/proto)"
for ln in `cat monophones0` sil; do echo -e "~h \"${ln}\"\n${text}" >> hmm0/hmmdefs; done
head -n3 hmm0/proto > hmm0/macros
cat hmm0/vFloors >> hmm0/macros
然后,重估:
mkdir hmm1 hmm2 hmm3
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm0/macros -H hmm0/hmmdefs -M hmm1 monophones0
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm1/macros -H hmm1/hmmdefs -M hmm2 monophones0
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm2/macros -H hmm2/hmmdefs -M hmm3 monophones0
HERest
= Embedded Re-estimation,计算 HMMs 的参数。
在模板中增加 sp
:
mkdir hmm4
cp hmm3/* hmm4
./makesp hmm4/hmmdefs >> hmm4/hmmdefs
创建配置文件 sil.hed
:
AT 2 4 0.2 {sil.transP}
AT 4 2 0.2 {sil.transP}
AT 1 3 0.3 {sp.transP}
TI silst {sil.state[3],sp.state[2]}
执行如下命令,重估:
mkdir hmm5 hmm6 hmm7
HHEd -H hmm4/macros -H hmm4/hmmdefs -M hmm5 sil.hed monophones1
HERest -C config -I phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm5/macros -H hmm5/hmmdefs -M hmm6 monophones1
HERest -C config -I phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm6/macros -H hmm6/hmmdefs -M hmm7 monophones1
HHEd
= HMM Editor,用来修改 HMM 定义。
执行如下命令,然后检查日志否有报错:
HVite -l '*' -o SWT -b SENT-END -C config -a -H hmm7/macros -H hmm7/hmmdefs -i aligned.mlf -m -t 250.0 -y lab -I words.mlf -S train.scp dict monophones1 > HVite_log
HVite
= Viterbi (word recogniser)。利用 HMM 网络将语音文件转换成音素。
执行如下命令:
mkdir hmm8 hmm9
HERest -C config -I phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm7/macros -H hmm7/hmmdefs -M hmm8 monophones1
HERest -C config -I phones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm8/macros -H hmm8/hmmdefs -M hmm9 monophones1
创建配置文件 mktri.led
:
WB sp
WB sil
TC
WB
= Word Between,定义sp
和sil
为单词之间的标注(inter-word label)。TC
= Triphones Convert,表示将所有单音素转为三音素。
执行如下命令:
HLEd -n triphones1 -l '*' -i wintri.mlf mktri.led aligned.mlf
./maketrihed monophones1 triphones1
mkdir hmm10
HHEd -B -H hmm9/macros -H hmm9/hmmdefs -M hmm10 mktri.hed monophones1
mkdir hmm11 hmm12
HERest -C config -I wintri.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm10/macros -H hmm10/hmmdefs -M hmm11 triphones1
HERest -C config -I wintri.mlf -t 250.0 150.0 1000.0 -s stats -S train.scp -H hmm11/macros -H hmm11/hmmdefs -M hmm12 triphones1
警告信息
WARNING [-2331]
表示训练数据不够多,可以忽略它。执行最后一条命令会在当前目录下生成文件
stats
,后面会用到。
创建配置文件 maketriphones.ded
:
AS sp
MP sil sil sp
TC
执行如下命令,生成 tree.hed
和 fulllist
:
echo -e 'RO 100 "stats"\nTR 0\n' > tree.hed
cat quests.hed >> tree.hed
echo -e '\nTR 2\n' >> tree.hed
./mkclscript TB 350 monophones0 >> tree.hed
echo -e '\nTR 1\n\nAU "./fulllist"\nCO "./tiedlist"\n\nST "./trees"' >> tree.hed
HDMan -b sp -n fulllist -g maketriphones.ded -l flog dict-tri VoxForgeDict.txt
for p in `cat monophones0`; do grep "^${p}$" fulllist > /dev/null; [ $? -eq 1 ] && echo $p >> fulllist; done
检查文件 tree.hed
的末尾应该会看到如下内容,这几个文件会被后面的指令用到:
TR 1
AU "./fulllist"
CO "./tiedlist"
ST "./trees"
执行如下命令:
mkdir hmm13 hmm14 hmm15
HHEd -B -H hmm12/macros -H hmm12/hmmdefs -M hmm13 tree.hed triphones1
HERest -C config -I wintri.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm13/macros -H hmm13/hmmdefs -M hmm14 tiedlist
HERest -C config -I wintri.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm14/macros -H hmm14/hmmdefs -M hmm15 tiedlist
创建配置文件 sample.jconf
:
#
# Sample Jconf configuration file
# for Julius library rev.4.3
######################################################################
####
#### misc.
####
# !!!!!! VoxForge change
# -outprobout filename # save computed outprob vectors to HTK file (for debug)
# !!!!!!
# VoxForge configurations:
-dfa sample.dfa # finite state automaton grammar file
-v sample.dict # pronunciation dictionary
-h hmm15/hmmdefs # acoustic HMM (ascii or Julius binary)
-hlist tiedlist # HMMList to map logical phone to physical
-smpFreq 16000 # sampling rate (Hz)
-spmodel "sp" # name of a short-pause silence model
-multipath # force enable MULTI-PATH model handling
-gprune safe # Gaussian pruning method
-iwcd1 max # Inter-word triphone approximation method
-iwsppenalty -70.0 # transition penalty for the appended sp models
-iwsp # append a skippable sp model at all word ends
-penalty1 5.0 # word insertion penalty for grammar (pass1)
-penalty2 20.0 # word insertion penalty for grammar (pass2)
-b2 200 # beam width on 2nd pass (#words)
-sb 200.0 # score beam envelope threshold
-n 1 # num of sentences to find
# you may need to adjust your "-lv" value to prevent the recognizer inadvertently
# recognizing non-speech sounds:
-lv 4000 # level threshold (0-32767)
# comment these out for debugging:
-logfile julius.log
-quiet
# !!!!!!
执行:
julius -input mic -C sample.jconf
稍等一会儿,然后根据提示用麦克风输入语音,如下:
STAT: include config: sample.jconf
<<< please speak >>>
pass1_best: <s> CALL STEVE
sentence1: <s> CALL STEVE </s>
<<< please speak >>>
pass1_best: <s> CALL
sentence1: <s> CALL YOUNG </s>
<<< please speak >>>
pass1_best: <s> DIAL ONE
sentence1: <s> DIAL ONE </s>
<<< please speak >>>
运行细节查看日志 julius.log
。
ln -s /opt/X11/include/X11 /usr/local/include/X11
修改 HTKLib/strarr.c
:
//#include <malloc.h>
#include <stdlib.h>
export LIBRARY_PATH="/opt/X11/:/opt/X11/lib"
如果 monophones1
中的最后一行不是 sil
,可能是 wlist
中没有加入:
SENT-END
SENT-START
然后重新生成 monophones1
和 dict
。
最后,hmmdefs
也要重新生成。
wlist
文件中需要手动加入:
SENT-END
SENT-START
注意排序。
警告,没关系。
"When running the HHEd command you will get warnings about trying to tie transition matrices for the sil an sp models. Since neither model is context-dependet there aren't actually any matrices to tie"——《HTK-Book》。
beep-1.0
不行,用 VoxForgeDict.txt
可以。
配置文件 wav_config
里面缺少:
SOURCEFORMAT = WAV
mkdir train
假设 proto
中是 <Mean> 39
,那么后一行就应该有 39 个 0.0
。<Variance> 39
同理。
首个 proto
中的 <Mean>
和 <Variance>
参数只是用来占位的,可以全部设为 0.0
。
首个 proto
中的 <TransP>
的参数应该如下:
<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
config
文件文件中的如下配置不对(删除该行即可):
SOURCEFORMAT = xxx
在重新校正训练数据时 HVite
命令会用到 words.mlf
。因此 prompts.txt
中的开头必须包含 */
:
*/S001
然后重新生成 words.mlf
。
语音数据里面没有这个音,需要增加更多的单词——包含这个音。
fulllist
里面有多个 ah
,删除后面的那一个即可。
配置文件中用 MFCC_0_D_N_Z
可以,用 MFCC_0_D_A
就会报错。
而且,proto
中的 VecSize
、Mean
、Variance
都必须是 25。
HTK 貌似不支持 Mac 的 CoreAudio API。
transcription:(语音的)标注。
label file:标注文件。标注一个音频文件中的单词或音素。
robust:健壮的。也译为鲁棒性。
token passing model
Viterbi
lattice(网格 ['lætis]
)
rescore lattice
force alignment
word loop(词环)
bigram 概率
HTK 标准网格格式(SLF):《HTK Book》的样例中生成的 wdnet
文件就是该格式。
backed-off bigram
HMM
Baum-Welch
Embedded Training(嵌入式训练)
Word Link Record
N-best
TIMIT acoustic-phonetic
训练数据:训练数据是由和电话拨号任务无关的英文句子组成。若想建立一个健壮的模型,就需要使用一个包含很多词的并且音素更均衡的大的句子集合。
British English BEEP:发音词典,有重音标记。
cmu 重音:Carnegie Melon University,这是当前唯一会在字典中使用重音标记的系统。比如 eh2 表示 eh 为重音且 level=2。
flat-start:两种语音文本,一个没有 sp,一个有。
Master Label File (MLF):将多个 label 文件合并到一个文件中。
Monophone:单音素
vFloors:代表方差下限(variance floor)的宏。
Master Macro File (MMF):比如 hmmdefs
。类似 MLF 文件,它是将多个 HMM 定义文件合并到一个文件。
tee-model
realign:重新校正