AIBigKaldi(一)| Kaldi的目录结构(源码解析)
本文来自公众号“AI大道理”。
Kaldi是使用c++写的传统语音识别的工具,是基于HMM架构的。
Kaldi的目标和范围与HTK相似。目标是拥有易于修改和扩展的用C++编写的现代而灵活的代码。
Kaldi的目标是为构建语音识别系统提供完整的配方,这些配方可从语言数据库(LDC)提供的数据库中获得。
Kaldi并不是一个深度学习框架,因此现在火热的端到端语音识别用kaldi并不是很好实现。
端到端语音识别的实现可以用PyTorch-Kaldi、ESPnet等。
1 Kaldi架构
Kaldi架构如所示。
顶层是外部的工具,包括用于线性代数库BLAS/LAPACK和加权有限状态转换器(FST)库OpenFst。
中间是Kaldi的C++库,包括传统语音识别相关算法的C++实现。
底层是编译出来的可执行程序。
最底层则是一下脚本,用于实现语音识别的不同步骤如数据准备、特征提取、训练单因子模型、结构解码图、解码等等。
2 Kaldi目录结构
在 Kaldi 的一级主目录中包括:egs、misc、scripts、src、tools、windows等文件夹。
一级目录 |
内容 |
egs |
Kaldi的实例,包含了语音识别,语种识别,声纹识别,关键字识别等。 |
misc |
包含了一些 pdf,以及相关 docker,htk 等资源。 |
scripts |
只用来存放 Rnnlm,以及相应的运行脚本。 |
src |
存放 Kaldi 的源代码,包括GMM,Ivector,Nnet等一系列的传统语音识别算法。 |
tools |
主要存放 Kaldi 依赖库的安装脚本。 |
windows |
在 Windows 平台运行所必须的脚本以及相关的执行程序。 |
Kaldi 目录 tools
tools目录主要存放Kaldi安装的软件包。
工具 |
内容 |
OpenFst |
加权有限状态转换器(FST)的库。 |
IRSTLM |
一种语言建模工具包。 可以将任何Arpa格式的语言模型转换为FST。 |
SRILM |
一种语言建模工具包。 它是比IRSTLM更好,更完整的语言建模工具包。 |
sph2pipe |
用于将sph格式文件转换为其他格式,例如wav使用LDC数据的示例脚本需要它。 |
sclite |
这是用于计分的。 |
ATLAS |
线性代数库。 |
CLAPACK |
线性代数库。 这仅在没有ATLAS且使用CLAPACK进行编译的系统上有用。 |
OpenBLAS |
这是ATLAS或CLAPACK的替代方案。 脚本默认情况下不使用它。 |
Kaldi 目录 egs
Egs 目录主要用于存放 Kaldi 的所有例程。
实例 |
描述 |
Aishell |
此目录为中文语音识别和声纹识别相关例子。 |
Aishell2 |
此目录主要为中文语音识别例子,但是针对 Aishell 在脚本方面更加规整。 |
ami |
此目录主要涉及到多信道语音识别的例子。 |
an4 |
此例子为 CMU 提供语音识别例子,并没有涉及神经网络。 |
apiai_decode |
此例子为解码器使用的例子,其中包含了如何使用预训练模型,这里主要针对的是 Nnet3 解码。 |
aspire |
此为ASpIRE 挑战赛的例子,其中包含了怎样使用噪声数据构建多条件数据的例子。 |
aurora4 |
此例子主要介绍 RBM 预训练。 |
babel |
此例子主要是用来训练 KWS (Key Word Search)。 |
babel_multilang |
此例子为训练多语音 KWS。 |
bentham |
手写笔识别的例子。 |
bn_music_speech |
音乐与语音区分的例子。 |
callhome_diarization |
说话人分割的例子。 |
callhome_etyptian |
埃及语语音识别例子。 |
chime1-5 |
主要针对 CHiME 竞赛开放的例子。 |
cigar |
图像分类的例子。 |
commonvoice |
Mozilla Common Voice 语音识别的例子。 |
csj |
日语 语音识别例子。 |
dihard_2018 |
DiHARD Speech Diarization CHALLENGE 的例子。 |
fame |
富里西语语音识别和声纹识别的例子。 |
farsdat |
主要用来声学语音研究和语音识别的例子。 |
fisher_callhome_spanish |
使用 Callhome 预料进行语音识别的例子 |
fisher_english |
英文双声道 8000 Hz 对话电话语音数据集的语音识别例子 |
fisher_swbd |
包含 fisher 数据集以及 swbd 数据集的语音识别例子。 |
gale_arabic: |
阿拉伯语语音识别例子。 |
gale_mandarin |
普通话语音识别例子。 |
gp |
全球电话语音识别例子(多语种语音识别例子)。 |
heroico |
西班牙语音识别例子。 |
houst |
普通话电话语音识别例子。 |
hub4_english |
英语新闻广播语音识别例子。 |
hub4_spanish |
西班牙新闻广播语音识别例子。 |
iam |
IAM 手写笔识别例子。 |
iban |
语音识别例子。 |
ifnenit |
阿拉伯语手写笔识别例子。 |
librispeech |
英语语音识别例子。 |
lre/lre07 |
语种识别例子。 |
madcat_ar |
手写笔识别例子。 |
madcat_zh |
中文手写笔识别例子。 |
mini_librispeech |
英语语音识别例子。 |
mult_en |
英语 LVCSR 例子。 |
pub |
RNNLM 模型构建例子。 |
reverb |
REVERB 挑战赛例子。 |
rimes |
法语手写笔识别例子。 |
rm |
英语语音识别例子,包含了如何进行迁移学习。 |
sitw |
sitw 说话人识别挑战赛的例子。 |
sprakbanken |
丹麦语语音识别例子。 |
sprakbanken_swe |
瑞典语语音识别例子。 |
sre08/10/16 |
说话人识别的例子。 |
svhn |
图像分类的例子。 |
swahili |
班图人语 语音识别例子。 |
swab |
双声道对电话语音识别例子。 |
tedium |
英语语音识别例子。 |
thchs30 |
普通话语音识别例子。 |
tidigits |
基础语音识别的例子。 |
timit |
主要是 GMM/HMM 语音识别例子。 |
tunisian_msa |
阿拉伯语音识别例子。 |
uw3 |
OCR 识别例子。 |
voxceleb |
说话人识别例子。 |
vystadial_cz |
捷克语语音识别例子。 |
voxforge |
基础语音识别例子,以及对应的在线 demo 的例子。 |
vystadial_en |
英文语音识别例子。 |
wsj |
wsj 英文语音识别例子。 |
yesno |
独立词语音识别例子。 |
yomdle_fa/korean/russian/tamil/zh |
OCR 识别例子。 |
zeroth_korean |
朝鲜语语音识别例子。 |
Kaldi 目录 src
src 目录为 Kaldi 的源码目录,主要保存了包括 GMM、HMM 等在内的大部分 Kaldi 语音项目源代码。
在 src 目录中,有两类文件夹,一类是算法原目录,一类为算法组合生成bin(可执行程序)目录。
目录 |
功能 |
base |
基础目录,主要包括与 Kaldi 项目相关的基础宏定义、类型定义等。 |
bin |
基础 bin 目录,主要是包括基础的执行程序。例如,查看 tree 信息、矩阵拷贝等基础操作。 |
cudamatrix |
矩阵计算相关 GPU 计算 |
matrix |
矩阵计算相关 CPU 计算 |
itf |
interface |
hmm |
隐马尔可夫算法的代码 |
utils |
语音算法无关的工具目录,例如,线程操作、io操作、文本操作等。 |
probe |
exp(指数) 测试 |
transform |
特征转换算法 |
fstext |
fst 相关的算法基础 |
fstbin |
fst 对应的算法执行文件夹 |
feat |
特征提取算法目录 |
featbin |
特征提取可执行目录 |
gmm |
GMM 算法 |
gmmbin |
GMM 算法可执行文件目录 |
ivector |
ivector 算法基础目录 |
ivectorbin |
ivector 算法的可执行目录,以及基于能量的 vad 执行目录。 |
kws |
关键字搜索基础算法目录 |
kwsbin |
关键字搜索执行目录 |
lat |
网格生成基础算法目录 |
latbin |
网格生成算法的可执行文件目录 |
lm |
自带的语言模型基础算法目录 |
lmbin |
语音模型的可执行文件目录 |
nnet |
nnet1 基础算法实现目录 |
nnetbin |
nnet1相关的算法可执行文件目录 |
nnet2 |
nnet2 相关的基础算法实现目录 |
nnet2bin |
nnet2 相关的算法可执行文件目录 |
nnet3 |
nnet3 相关基础算法实现目录 |
nnet3bin |
nnet3 相关实现算法的可执行文件目录 |
online |
online1 相关解码算法的实现目录 |
onlinebin |
online1 相关解码器算法的可执行目录 |
online2 |
online2 相关解码器算法的实现目录 |
online2bin |
online2 相关解码器算法的可执行目录 |
rnnlm |
rnnlm 相关的语音模型基础算法实现目录 |
rnnlmbin |
rnnlm 相关的语音模型的可执行目录 |
sgmm2 |
sgmm2 相关的子空间 GMM 基础算法实现目录 |
sgmm2bin |
sgmm2 相关的子空间 GMM 基础算法可执行目录 |
tfrnnlm |
Tensorflow rnnlm 基础算法目录 |
tfrnnlmbin |
Tensorflow rnnlm 基础算法实现的可执行目录 |
3 实例目录结构
kaldi实例在egs文件夹下面,主要文件在s5下面。
目录 |
功能 |
conf |
一些配置文件,例如MFCC的参数sample-frequency=8000,HMM的拓扑结构 |
data |
存放语言模型、发音字典和音素信息等等 |
exp |
包含相关log文件;模型训练完后,声学模型被存放在exp/mono0a里;解码测试输出到exp/mono0a/decode_test_yes |
input |
发音词典lexicon.txt、音素集phones.txt、语音模型task.arpabo |
local |
一些准备的数据脚本,供顶层的脚本run.sh调用,如prepare_data.sh、prepare_lm.sh等 |
mfcc |
特征提取,scp、ark文件 |
steps |
一些运行时调用的脚本,语音识别主要步骤,make_mfcc.sh、compute_cmvn_stats.sh、train_mono.sh、decode.sh |
utils |
一些运行时调用的脚本,协助处理,如任务管理、文件夹管理、数据复制等,prepare_lang.sh、fix_data_dir.sh、mkgraph.sh |
cmd.sh |
定义了训练任务提交的方式,SGE集群用queue.pl,单机用run.pl |
path.sh |
定义了训练脚本中所使用的若干环境变量的位置 |
run.sh |
最顶层的运行脚本,集成了从资源下载、数据准备、特征提取、模型训练、解码等全部脚本,并给出统计结果的方法。 |
词典文件夹
data/local/dict
文件名 |
功能 |
注释 |
nonsilence_phones.txt |
包含所有非静音的音素 |
音素 |
extra_questions.txt |
构建音素的声学上下文决策树时会遇到的基本问题,每行对应一个聚类问题。 |
音素 |
optional_silence.txt |
定义了用于填充词间静音的音素 |
SIL |
silence_phones.txt |
定义了所有可以表达无效语音内容的音素 SIL表示静音,SPN表示有声音但是无法识别的声音片段 |
集外词的发音被制定为SPN |
lexicon.txt |
发音词典(不带发音概率) |
WAS W AA1 Z |
lexiconp.txt |
发音词典(带发音概率) |
WAS 1.0 W AA1 Z |
语言文件夹
data/lang_nosp
phones.txt |
音素索引 |
|
words.txt |
词索引 |
|
L.fst |
发音词典生成的FST |
|
L_disambig.fst |
增加消歧义符之后的发音词典生成的FST |
|
oov.int |
集外词的索引 |
|
oov.txt |
集外词的标识 |
|
topo |
定义了每个音素的HMM拓扑结构 |
静音和噪音使用5个状态、 其他音素使用3状态 |
音素的属性文件夹
data/lang_nosp/phones
silence.txt |
存储了所有静音音素的列表 |
SIL、SPN |
align_lexicon.txt |
发音词典,第一列的词重复使用了 |
|
context_indep.txt |
所有上下文无关音素的列表 |
SIL、SPN |
disambig.txt |
所有消歧义符号的列表 |
#0、#1、#2.....#16 |
extra_questions.txt |
构建音素的声学上下文决策树时会遇到的基本问题,每行对应一个聚类问题。(增加了音素位置标记,对静音音素的聚类方法进行了修改,用于音素上下文聚类) |
|
nonsilence.txt |
所有非静音、非消歧义符号的音素列表 |
没有SIL、SPN |
optional_silence.txt |
定义了用于填充词间静音的音素 |
SIL |
sets.txt |
定义了音素组 |
B_B B_E B_I B_S |
roots.txt |
定义了哪些音素共享上下文决策树的一个根节点 |
|
wdisambig |
消歧义符号文本 |
#0 |
wdisambig_phones.int |
消歧义符号音素的索引 |
347 |
wdisambig_words.int |
消歧义符号词的索引 |
200004 |
word_boundary.txt |
定义了每个音素的词位置 |
下期预告
AIBigKaldi(二)| 输入输出机制
往期精选
AI大语音(十四)——区分性训练
AI大语音(十三)——DNN-HMM
AI大语音(十二)——WFST解码器(下)
AI大语音(十一)——WFST解码器(上)
AI大语音(十)——N-gram语言模型
AI大语音(九)——基于GMM-HMM的连续语音识别系统
AI大语音(八)——GMM-HMM声学模型
AI大语音(七)——基于GMM的0-9语音识别系统
AI大语音(六)——混合高斯模型(GMM)
AI大语音(五)——隐马尔科夫模型(HMM)
AI大语音(四)——MFCC特征提取
AI大语音(三)——傅里叶变换家族
AI大语音(二)——语音预处理
AI大语音(一)——语音识别基础
——————
浅谈则止,细致入微AI大道理
扫描下方“AI大道理”,选择“关注”公众号
—————————————————————
—————————————————————