参考链接
简介
- 文中内容均以最新s5脚本为例
- s5/local目录通常适合数据库相关的脚本
- 除了网上下载语言模型外,local目录中还有很多和本地训练语言模型相关的脚本
- 数据准备阶段主要涉及两部分:
data Part
text
包含每个句子的标注文本
|
|
- 每行第一部分是句子ID(utterance-id),如果有不同发音人,为方便排序,发音人ID(speaker-id)作为句子ID前缀
- 第二部分是每个句子的标注文本,对于字典意外的词,会自动在data/lang/oov.txt中记录
wav.scp
wav.scp举例内容如下:
|
|
文件的固定格式:
|
|
- extended-filename:可以指向一个真实文件,也可以是一条可以生成wav文件的命令(注意最后的|为linux管道)
- recording-id指录音文件id,如果没有segments文件,也就是说一个录音文件对于一句话,那么recording-id也就是utterance-id
- wav.scp指向的录音文件必须是单声道,多声道文件必须通过命令制定某一具体声道
segments(非必需)
segments举例内容如下:
|
|
文件的固定格式:
|
|
- 非必须,标记录音文件中的句子位置,如果每个录音文件只有一句话,则不需要segments文件
- 标记一句话在录音文件中的开始和结束为止,单位:秒
reco2file_and_channel(非必需)
reco2file_and_channel只用来计算错误率评分,用到的工具是NIST的“sclite”
reco2file_and_channel举例内容如下:
|
|
文件的固定格式:
|
|
- filename指.sph文件名(不包括后缀)(也可以指示stm文件中的内容)
- recording-side特别用于电话录音等文件中存在双方的情况,如果只有一方说话,可以直接标记为A
utt2spk:
utt2spk文件指明每一句话的发言人
utt2spk举例内容如下:
|
|
文件的固定格式:
|
|
- speaker-id指示大致标注不同发音人,比如区分电话录音双方,并不要求特别准确
- 在不清楚发音人情况下,可以使用让speaker-id和utterance-id相同
注意
- 以上所有文件都必须进行排序,一边支持在管道等命令中的正确读取。
在排序时应该定义变量LC_ALL为C,让排序按照C++字符串排序方式进行,否则会找出Kaldi运行出错
1export LC_ALL=C如果数据包括测试集,可以以stm或glm命名,相应的计算错误率的脚本位于local/score.sh
其它文件
以下文件都能根据上面提供的文件,使用Kaldi提供的命令生成
spk2utt
spk2utt使用utt2spk_to_spk2utt.pl脚本,依据utt2spk文件生成
1utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
feats.scp
feats.scp指示计算得到的句子MFCC特征,其内容太如下:
|
|
文件的固定格式:
|
|
- 每个feature文件包括一个Kaldi能够识别的矩阵
- 通常这个特征矩阵以10ms位单位,每个单位为13维特征向量
- “/home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/raw_mfcc_train.1.ark:24”意思是在文件“/home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/raw_mfcc_train.1.ark”中调用fseek()定位到位置24,并读取当前数据
feats.scp文件由以下命令生成
1steps/make_mfcc.sh --nj 20 --cmd "$train_cmd" data/train exp/make_mfcc/train $mfccdir
$mfccdir是用户指定的用于生成ark文件的目录
cmvn.scp:
cmvn.scp文件以speaker-id为index,包含统计得到的倒谱均值和方差归一化。每一个统计为一个2x15的矩阵。
1234
s5# head -3 data/train/cmvn.scp2001-A /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:72001-B /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:2532005-A /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:499
cmvn.scp文件通过以下命令生成:
|
|
其它
为防止数据准备错误,可以使用以下脚本检查数据格式是否正确
1utils/validate_data_dir.sh data/train以下脚本会检查并解决排序错误,并删除掉确实特征文件或标注文本的utterance
1utils/fix_data_dir.sh data/train
lang Part
phones.txt, words.txt
这两个文件都是OpenFst格式的表文件,每行包含一个符号和一个整数
|
|
这两个文件用于Kaldi在整数和符号之间进行对应,通常在utils/int2sym.pl和utils/sym2int.pl、以及OpenFst的fstcompile和fstprint中用到
L.fst
- L.fst是字典的FST存储格式。 “Speech Recognition with Weighted Finite-State Transducers”
- L.fst表示的FST,接收音素作为输入,并得到词作为输出
L_disambig.fst
- L_disambig.fst和L.fst一样是字典的FST,另外还包括一些特殊符号用于消除词与词之间容易产生混淆的连接关系
oov.txt
oov.txt只有一行,这一行表面,对于字典中没有收录的词,将会用这一行中的符号进行替代
|
|
- UNK在字典必须只具有一个音素发音,通常为SPN(spoken noise)
|
|
oov.int
oov.int中包含oov.txt中未收录词的整数符号
topo
topo文件是用的HMM模型,内容如下:
|
|
phones
data/lang/phone/目录中有多个和音素相关的文件,通常具有三个文件版本:
“.txt”
1234s5# head -3 data/lang/phones/context_indep.txtSILSIL_BSIL_E“.int”
1234s5# head -3 data/lang/phones/context_indep.int123“.csl”
12s5# cat data/lang/phones/context_indep.csl1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20
这三种文件格式通常包含相同的信息,context_indep.txt包含一些不算真正发音的音素,如silence(SIL),spoken noise(SPN),non-spoken noise(NSN),laughter(LAU)
|
|
- sets.txt
包含所有音素的集合
- roots.txt
roots.txt中包含建立音素相关的决策树所需的信息,示例内容如下:
|
|
同一样的shared split SIL SIL_B SIL_E SIL_I SIL_S表示SIL SIL_B SIL_E SIL_I SIL_S五个音素在决策树中具有同一个根节点
建立lang目录
|
|
- 输入data/local/dict
- “\
”,替换OOV - data/local/lang/脚本需要用得到临时输出文件夹
- data/lang/结果输出文件夹
- 其中需要人工创建的是data/local/dict/目录下的内容