Skip to content

Instantly share code, notes, and snippets.

@ericzhong
Last active October 8, 2023 03:29
Show Gist options
  • Save ericzhong/c9d900712651fe58de7c993ff8a19ac7 to your computer and use it in GitHub Desktop.
Save ericzhong/c9d900712651fe58de7c993ff8a19ac7 to your computer and use it in GitHub Desktop.

介绍

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。它们都是一些辅助性的脚本,用来转换文本格式或生成一些模板。

安装

安装 HTK

到官方注册后下载源码包和《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

安装 Julius

在 macOS 平台建议用 HomeBrew 安装,因为从源码编译需要安装很多依赖:

brew install julius

安装 Audacity

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.dfasample.termsample.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_BNS_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,在每个发音后面追加 spRS = 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 中的单词生成相同格式的字典文件 dictmonophones1 包含 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,在每行标注的开始和结束插入 silDE = 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 中的歌曲目录一样,在这里就变成了单词或音素。

音频数据转 MFCC 向量

创建文件 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,定义 spsil 为单词之间的标注(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.hedfulllist

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

用 Julius 进行实时语音识别

创建配置文件 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

Troubleshooting

[macOS] 'X11/Xlib.h' file not found

ln -s /opt/X11/include/X11 /usr/local/include/X11

[macOS] 'malloc.h' file not found

修改 HTKLib/strarr.c

//#include <malloc.h>
#include <stdlib.h>

[macOS] not found for option '-L/usr/X11R6/lib'

export LIBRARY_PATH="/opt/X11/:/opt/X11/lib"

CreateInsts: Unknown label sil

如果 monophones1 中的最后一行不是 sil,可能是 wlist 中没有加入:

SENT-END 
SENT-START

然后重新生成 monophones1dict

最后,hmmdefs 也要重新生成。

LatticeFromLabels: Word SENT-END not defined in dictionary

wlist 文件中需要手动加入:

SENT-END 
SENT-START

注意排序。

ApplyTie: Macro T_sil has nothing to tie of type t in HHEd

警告,没关系。

"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》。

word DOUBLE-QUOTE out of order in dict beep-1.0

beep-1.0 不行,用 VoxForgeDict.txt 可以。

OpenParmChannel: cannot read HTK Header in File ./waves/S0001.wav

配置文件 wav_config 里面缺少:

SOURCEFORMAT = WAV

SaveBuffer: cannot create file ./train/S0001.mfc

mkdir train

Mean Vector expected at line 8/col 1/char 97 in proto

假设 proto 中是 <Mean> 39,那么后一行就应该有 39 个 0.0<Variance> 39 同理。

首个 proto 中的 <Mean><Variance> 参数只是用来占位的,可以全部设为 0.0

GetTransMat: Bad Trans Mat Sum in Row 1

首个 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

Input file is not in RIFF format

config 文件文件中的如下配置不对(删除该行即可):

SOURCEFORMAT = xxx

Unable to open label file ./train/S001.lab

在重新校正训练数据时 HVite 命令会用到 words.mlf。因此 prompts.txt 中的开头必须包含 */

*/S001

然后重新生成 words.mlf

FindProtoModel: no proto for th-hh+eh in hSet

语音数据里面没有这个音,需要增加更多的单词——包含这个音。

CreateHMM: multiple use of logical HMM name ah

fulllist 里面有多个 ah,删除后面的那一个即可。

Unable to open label file ./train/S022.lab

配置文件中用 MFCC_0_D_N_Z 可以,用 MFCC_0_D_A 就会报错。

而且,proto 中的 VecSizeMeanVariance 都必须是 25。

OpenAsChannel: Audio input not supported

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:重新校正

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment