Kaldi 语音识别工具使用记录

编程入门 行业动态 更新时间:2024-10-08 02:18:09

Kaldi <a href=https://www.elefans.com/category/jswz/34/1768560.html style=语音识别工具使用记录"/>

Kaldi 语音识别工具使用记录

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

目录

  • Kaldi 语音识别工具使用记录-日语数据集CSJ
  • 前言
  • 数据下载
  • 数据前处理
      • 1.数据准备
      • 2. 生成训练集
      • 3. 生成phone.txt 和 lexcion.txt
      • 4. 语言模型
      • 5. 特征提取
  • 模型训练
  • 模型使用
  • 参考+推荐教程

前言

  • 众所周知Kaldi是一个对新手很不友好的工具,特别是他的官方文档,非常硬核,所以我想把自己的Kaldi学习过程和大家分享一下,当然我也是刚入门,很多理论基础都还没搞清楚,也算是一个和大家交流的过程。
  • 首先该记录重在操作流程,其中涉及到的一些有关语言模型,HMM和tri-phone的问题,在这里先不深入讲解,因为比较复杂,暂时不影响模型的训练和使用,所以我会在后面的博客中单独讲解。总体来说本文的受众群体是能看懂shell并刚开始接触kaldi的同学
  • 后面还会有英文数据集的记录,因为最近正好在用CSJ,就先记录一下,中文数据集最后再看看,貌似比较困难。

数据下载

CSJ是收费数据集,具体价格不记得了,我这边是教授用科研经费从官网购买,个人购买不是很推荐。所以最好是已经入手了数据集再来看这篇记录。

在这里我把数据集构成用表格列出来,参考的是内部的说明附件

语音类型讲话人数量文件数量总时间 / h
学会演讲819987274.4
模拟演讲5941715329.9
其他161924.1
学会演讲对话10102.1
模拟演讲对话16163.4
基于课题对话16163.1
自由对话16163.6
重复朗读16165.5
朗读42850715.5
总计14173302661.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, 训练集 corenoncore,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 语音识别工具使用记录

本文发布于:2024-03-23 19:41:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742048.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:语音识别   工具   Kaldi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!