语音识别工具使用记录"/>
Kaldi 语音识别工具使用记录
Kaldi 语音识别工具使用记录-日语数据集CSJ
目录
- Kaldi 语音识别工具使用记录-日语数据集CSJ
- 前言
- 数据下载
- 数据前处理
- 1.数据准备
- 2. 生成训练集
- 3. 生成phone.txt 和 lexcion.txt
- 4. 语言模型
- 5. 特征提取
- 模型训练
- 模型使用
- 参考+推荐教程
前言
- 众所周知Kaldi是一个对新手很不友好的工具,特别是他的官方文档,非常硬核,所以我想把自己的Kaldi学习过程和大家分享一下,当然我也是刚入门,很多理论基础都还没搞清楚,也算是一个和大家交流的过程。
- 首先该记录重在操作流程,其中涉及到的一些有关语言模型,HMM和tri-phone的问题,在这里先不深入讲解,因为比较复杂,暂时不影响模型的训练和使用,所以我会在后面的博客中单独讲解。总体来说本文的受众群体是能看懂shell并刚开始接触kaldi的同学。
- 后面还会有英文数据集的记录,因为最近正好在用CSJ,就先记录一下,中文数据集最后再看看,貌似比较困难。
数据下载
CSJ是收费数据集,具体价格不记得了,我这边是教授用科研经费从官网购买,个人购买不是很推荐。所以最好是已经入手了数据集再来看这篇记录。
在这里我把数据集构成用表格列出来,参考的是内部的说明附件
语音类型 | 讲话人数量 | 文件数量 | 总时间 / h |
---|---|---|---|
学会演讲 | 819 | 987 | 274.4 |
模拟演讲 | 594 | 1715 | 329.9 |
其他 | 16 | 19 | 24.1 |
学会演讲对话 | 10 | 10 | 2.1 |
模拟演讲对话 | 16 | 16 | 3.4 |
基于课题对话 | 16 | 16 | 3.1 |
自由对话 | 16 | 16 | 3.6 |
重复朗读 | 16 | 16 | 5.5 |
朗读 | 428 | 507 | 15.5 |
总计 | 1417 | 3302 | 661.6 |
数据前处理
首先进入 kaldi-master/egs/csj/s5
- conf\
- local\ 一些针对数据集专用的脚本都放在local下面
- steps\
- utils\ steps/ 和 utils/ 是所有数据集通用的脚本,用ls -alh ./ 可以看出来是wsj数据集软链接过来的
- cmd.sh 只有一台机器的话,就把所有queue.pl 换成 run.pl
export train_cmd="run.pl"
export decode_cmd="run.pl"
export cuda_cmd="run.pl"
export mkgraph_cmd="run.pl"
- path.sh 根据自己的环境修改,一般不用动
- run.sh 启动脚本,不建议一次直接运行,最好是按照里面的stage分块注释运行,下面分块对该脚本进行讲解:
开头两行是让脚本能定位到需要的目录
. ./cmd.sh
. ./path.sh
1.数据准备
这几行都是在把下载好的数据进行分类整理
use_dev=false
CSJDATATOP=CSJDATA
CSJVER=usb
if [ ! -e data/csj-data/.done_make_all ]; thenecho "CSJ transcription file does not exist"local/csj_make_trans/csj_autorun.sh $CSJDATATOP data/csj-data $CSJVER
fi
wait[ ! -e data/csj-data/.done_make_all ]\&& echo "Not finished processing CSJ data" && exit 1;local/csj-data_prep.sh data/csj-data 3
基本每行都有注释,理解起来也不困难,我在这里就做一些进一步的说明吧。
use_dev 这里我没用,因为自己手上数据集不太全,分不出来开发集,所以下面的记录都是基于训练+测试集。
下载好的数据集应该有这么几个目录:
- DOC/
- PLABEL/
- WAV/
- MORPH/
然后在当前目录下新建一个CSJDATA目录,把这几个目录复制过来,或者软链接进来,如果是上面的目录构成,CSJVER就用usb, 其他版本的数据集构成我不太清楚。
运行 local/csj_make_trans/csj_autorun.sh 之后会生成新的目录 data/csj-data, 该目录包含测试集eval, 训练集 core 和 noncore,core和noncore在这里可以不用区分,全当作训练集就行。如果当前的数据集不全,或者版本太老,可能会在划分测试集时报错,因为csj_autorun.sh这个脚本自己选了3*10组测试数据(1组1个讲话人),100行开始可以看到,根据自己的需求可以调整。我就只用了里面的1/3,多余的都删了。
# Evaluation set IDeval1="A01M0110 A01M0137 A01M0097 A04M0123 A04M0121 A04M0051 A03M0156 A03M0112 A03M0106 A05M0011"eval2="A01M0056 A03F0072 A02M0012 A03M0016 A06M0064 A06F0135 A01F0034 A01F0063 A01F0001 A01M0141"eval3="S00M0112 S00F0066 S00M0213 S00F0019 S00M0079 S01F0105 S00F0152 S00M0070 S00M0008 S00F0148"
到这里为止是把CSJ里面的音频文件和对应的转录文件按讲话人归到一起,一个讲话人一个文件夹,并分出测试集。例如:
data/csj-data/eval/eval1/A01M0097/
A01M0097-trans.text
A01M0097-wav.list
A01M0097-trans.4lex
2. 生成训练集
local/csj_data_prep.sh data/csj-data 3
这里的参数用3,就是选择处理所有种类的数据,默认是0,只处理学术演讲和其他类型的数据。脚本会提取出训练集生成新的目录:
- data/local/train
- data/train
第一个是临时目录,可以不用考虑,训练集的信息都保存在第二个目录下。这个train目录下面保存了4个(或者5个)重要的文本,kaldi的所有数据集在训练之前,他们的信息都会保存在这几个文件中。
segments
spk2utt
utt2spk
text
wav.scp
其中segments里面保存了语音和文本片段对应的wav文件中的时间片段,格式如下
speaker_time1_time2 speaker time1 time2
后面的文本转录都是以speaker_time1_time2为基本单位记录下来的。
例:
A01F0055_0005549_0015595 A01F0055 5.549 15.595
A01F0055_0015945_0027184 A01F0055 15.945 27.184
A01F0055_0036727_0047453 A01F0055 36.727 47.453
A01F0055_0047680_0059865 A01F0055 47.68 59.865
spk2utt 就和文件名一样,speaker to utterence,保存的是一个讲话人所有的讲话片段,格式如下:
speaker speaker_time1_time2 speaker_time3_time4 …
utt2spk 和上面相反, utterence to speaker, 每个语音片段对应的讲话人, 格式如下:
speaker_time1_time2 speaker
下面是text, 最重要的文件,保存了每个语音片段对应的文本内容,格式如下:
speaker_time1_time2 文本
例:
A01F0055_0005549_0015595 発表+名詞 し+動詞/サ行変格/連用形 ます+助動詞/終止形 <sp> えー+感動詞 私+代名詞 共+接尾辞 は+助詞/係助詞 <sp> 乳児
更多推荐
Kaldi 语音识别工具使用记录
发布评论