Kaldi 语音识别工具使用记录

Kaldi 语音识别工具使用记录-日语数据集CSJ

前言

  • 众所周知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 ]; then
	echo "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, 训练集 corenoncore,core和noncore在这里可以不用区分,全当作训练集就行。如果当前的数据集不全,或者版本太老,可能会在划分测试集时报错,因为csj_autorun.sh这个脚本自己选了3*10组测试数据(1组1个讲话人),100行开始可以看到,根据自己的需求可以调整。我就只用了里面的1/3,多余的都删了。

    # Evaluation set ID
    eval1="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> 乳児+名詞 が+助詞/格助詞 音楽+名詞 を+助詞/格助詞 どの+連体詞 よう+形状詞 に+助動詞/連用形 聞い+動詞/カ行五段/連用形/イ音便 て
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值