本文来自公众号“AI大道理”。
这里既有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大道理”,选择“关注”公众号
—————————————————————
—————————————————————