kaldi 简介:
kaldi 是到目前为止,一款非常优秀的语音识别开源建模软件。顺带一下八卦,其作者,Dan Povey 也是来到了中国发展。
kaldi 是一个建模工具,而建出来什么样的模型,完全依赖于个人。kaldi 的底层是基于 C,用户可以通过钓调用各种样例脚本进行建模。因为是开源的,所以高级玩法是可以自己修改代码编译。初级玩法是调用现有脚本进行编译。这里说的,只是初级玩法。
这里参考github上的 https://github.com/kaldi-asr/kaldi,来说明。
kaldi 建模流程概述:
1.了解脚本位置
kaldi 里面建模一般是在 egs 目录下新建自己的项目,而后在里面新建 s5,而后将其相关脚本从其他项目的 s5 中拷贝到此目录下,进行修改,如从 cp -r kaldi/egs/wsj/s5 egs/test/ 拷贝之后,删除部分不相关数据,如 data, exp,mfcc 中的数据,只保留空文件夹。kaldi/egs/wsj/s5里面比较干净,所以只要新建这三个文件夹即可。其中data里面是待建模数据,exp里面是建模后的模型,mfcc是中间提取的特征。conf里面是配置参数。
2.音频数据准备
在data目录下面,一般是新建 train 和 test 两个文件夹,里面放的分别是建模训练数据和测试数据。其实,里面只要放数据目录和标记文本就好了。这两个文件夹里面放的数据的格式是一模一样的。下面以 train 为例。
train 要准备的是以下几个文件, wav.scp、utt2spk、text、segments、spk2utt、(utt2lang, utt2gender … )。括号里面的根据具体情况而定,前五个一般都需要。
wav.scp
里面的格式是:
音频名称 该音频对应路径
eg:
01.wav /a/b/c/01.wav
需要注意的是这里的左边一列音频名称 ID 必须唯一
此外,对应的该音频路径下的音频需要与conf配置参数一致,如采样率,否则会报错不匹配。
utt2spk
里面的格式是:
音频片段 对应音频片段+说话人ID
eg:
01.wav-1 01.wav-1-1
01.wav-2 01.wav-2-1
01.wav-3 01.wav-3-2
text
里面的格式是:
音频片段 音频标记文本
eg:
01.wav-1 昨天晚上下雪了
01.wav-2 我们去故宫玩吧
01.wav-3 好啊
segments
里面的格式是:
音频片段 音频名称 (时间节点等)
eg:
01.wav-1 01.wav 0.001 3.151
01.wav-2 01.wav 3.501 6.985
01.wav-3 01.wav 7.218 7.832
spk2utt
里面的格式是:
音频片段+说话人ID 对应音频片段
也就是 utt2spk 的相反
其他
如果说音频已经做过vad并切成片段,那么segments前两列写成一样即可。如果音频是长语音,那么segments中需要有时间节点。
产生这几个准备文件的脚本需要自己写,因为数据形式命名方式各不相同,所以就不详细写具体内容了。一般来说,音频名称就是存储的音频名字,音频片段是音频名字后面加上起止时间节点。
3.发音词典准备
发音词典是模型的核心,模型好坏取决于发音词典。建好的发音词典放置于与 s5/local/dict/lexicon.txt,
分成两列,如,拼音 音素
而后可用 s5/local 内的脚本(前人积累的脚本一般都在这里面了),在data/local/内生成相应文件。
生成的文件,主要包括 nonsilence_phones.txt silence_phones.txt
nonsilence_phones.txt
内包 lexicon.txt 中,除 sil 的全部内容
silence_phones.txt
内包 lexicon.txt 中,只有 sil 的内容
4.训练
根据想要的训练过程,选择对应的脚本进行训练即可。
小结
使用 kaldi 在于两点,一个是准备数据,另一个是熟悉脚本语音。实际操作中,因为数据和脚本不匹配的情况肯定会发生,根据真实情况,报错信息,修改相应脚本,才能使其能正常运行。在 kaldi/egs/wsj/s5 中,可以从先熟悉 run.sh 中开始,而后结合本文所述,了解其调用功能。