源码目录结构分析
egs/ 开放数据集合,主要目录 wsj, rm
|- README.txt
src/ 代码主目录
|- configure 构建 kaldi.mk 文件(c库,编译优化参数等)
|- Makefile 组织整体代码依赖相关内容
|- ……
tools/ 基础工具包
|- atlas 数学算法库
|- clpack cl线代库加速包
|- srilm 语言模型生成工具
|- openfst 加权有限状态机(Makefile文件中自动下载并编译)
|- sctk Speech Recognition Scoring Toolkit(Makefile文件中自动下载并编译)
|- sph2pipe SPHERE 文件转换(其他音频)工具(Makefile文件中自动下载并编译)
|- openblas 开源blas库(Makefile文件中自动下载并编译)
|- extras 扩展工具包
常见文件格式
常见内容标记说明
标记名称 | 说明 |
---|---|
utterance-id | 发音编号, 可以是任意的文本字符串 |
speaker-id | 说话人编号, 常作为发音编号的前缀 |
record-id | 和在“wav.scp”中使用的是同一个标识字符串, 与 uttid 一样 |
word | 单词列表 |
segment-begin/segment-end | 以秒为单位。它们指明了一段发音在一段录音中的时间偏移量 |
比如:
文件名称 | 内容格式 |
---|---|
text | < uttid > < word > |
wav.scp | < uttid > < utter_file_path > |
utt2spk | < uttid > < speakid > |
spk2utt | < speakid > < uttid > |
segments | <uttid> <recid> <segbegin> <segend> |
feats.scp | < uttid > <extended-filename-of-features> |
注意:
对于 text 中不一定要保证每个单词都必须出现在词汇表中,若词汇表中没有则被映射到 lang/oov.txt 文件中(lang/oov.int 文件为其 SPN 的数字形式,从 words.txt 中提取)。
在每一个 feats.scp 特征文件中保存的都是Kaldi格式的矩阵。在这个例子中,矩阵的维度是13(译者注:即列数;行数则 和你的文件长度有关,标准情况下帧长20ms,帧移10ms,所以一行特征数据对应10ms的音频数据)。比如:
s5# head -3 data/train/cmvn.scp
// 表示 2001-A 对应的特征从 cmvn_train.ark 文件的 7 字节开始读取数据
2001-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:7
// 表示 2001-B 对应的特征从 cmvn_train.ark 文件的 253 字节开始读取数据
2001-B /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:253
// 表示 2005-A 对应的特征从 cmvn_train.ark 文件的 499 字节开始读取数据
2005-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:499
对于 phones.txt 和 words.txt 分别存放词典, 比如:
s5$ head -3 data/lang/phones.txt
<eps> 0
SIL 1
SIL_B 2
s5$ head -3 data/lang/words.txt
<eps> 0
!SIL 1
-'S 2
这些为符号标 (symbol-table) 文件,符合 OpenFst 的格式定义。
在 kaldi 中, 这些文件被用于音素符号的文本形式和数字形式之间进行转换。大多数情况下,只有脚本 utils/int2sym.pl 和 utils/sym2int.pl 及 OpenFst 中 fstcompile 和 fstprint 会读取这些文件。
文件 L.fst 是 FST 形式的发音词典, 其中输入是音素,输出为词汇。
文件 L_disambig.fst 也为发音词典,但还包含为消歧而引入的符号(比如 #1, #2 等,以及自环(self-loop) 而引入的 #0)。
lang/topo 文件指明 HMM 模型拓扑结构
lang/G.fst 文件中存放了语言模型(语法),FST 格式表示,解码时使用,根据使用的语言模型的不同,生产 G.fst 的步骤会不同。比如:
# 在 rm 中使用 local/rm_data_prep.sh 文件里面
# 生成 G.txt 语法文件
local/make_rm_lm.pl $RMROOT/rm1_audio1/rm1/doc/wp_gram.txt > $tmpdir/G.txt || exit 1;
# 在 local/rm_prepare_grammar.sh 会将文本格式语法文件转换为二进制 G.fst 文件
fstcompile --isymbols=data/lang/words.txt --osymbols=data/lang/words.txt --keep_isymbols=false \
--keep_osymbols=false $tmpdir/G.txt > data/lang/G.fst