kaidi之AISHELL2脚本阅读

前言

utils和steps文件夹是共享脚本,通用流程

数据集简介

AISHELL-2 is by far the largest free speech corpus available for Mandarin ASR research.

1. DATA

Training data

  • 1000 hours of speech data (around 1 million utterances)
  • 1991 speakers (845 male and 1146 female)
  • clean recording environment (studio or quiet living room)
  • read speech
  • reading prompts from various domain: entertainment, finance, technology, sports, control command, place of interest etc.
  • near field recording via 3 parallel channels (iOS, Android, Microphone).
  • iOS data is free for non-commercial research and education use (e.g. universities and non-commercial institutes)

Evaluation data:

Currently we release AISHELL2-2018A-EVAL, containing:

  • dev: 2500 utterances from 5 speakers
  • test: 5000 utterances from 10 speakers

Both sets are available across the three channel conditions.

2. RECIPE

Based on Kaldi standard system, AISHELL-2 provides a self-contained Mandarin ASR recipe, with:

  • a word segmentation module, which is a must-have component for Chinese ASR systems
  • an open-sourced Mandarin lexicon (DaCiDian, open-sourced at here)
  • Simplified GMM training & alignment generating recipe (we stopped at speaker independent stage)
  • LFMMI TDNN training and decoding recipe

脚本大纲

  • run.sh
    ** local/prepare_all.sh
    **local/run_gmm.sh
    **local/chain/run_tdnn.sh

run.sh 脚本解析

1. 数据准备

local/prepare_all.sh ${trn_set} ${dev_set} ${tst_set} || exit 1;

input: trn_set /dev_set / tst_set
三个参数分别对应训练集、验证集和测试集的文件路径,该步骤分别对训练集,验证集和测试集做数据准备。

2. 训练GMM-HMM

local/run_gmm.sh --nj $nj --stage $gmm_stage

3. 训练chain模型

local/chain/run_tdnn.sh --nj $nj

4. 解码结果

local/show_results.sh

aishell的run.sh风格和wsj不太一样,在run.sh中只展示了三个主框架流程:

  • 数据准备(特征提取,词典,语言模型等)
  • 训练基本的HMM-GMM模型,得到一个初步的对齐
  • 根据GMM-HMM的对齐训练MMI-TDNN模型
    私以为这种代码形式更加清晰易懂,下面逐一进行分析

prepare_all.sh 脚本解读

1. 词典准备

从github上下载《大辞典》原始数据,转化为kaldi的词典格式

local/prepare_dict.sh data/local/dict || exit 1
  • input
    download_dir = data/local/DaCiDian(从github上下载)
  • output
    dir = data/local/dict
    dir/lexicon.txt
    dir/nonsilence_phones.txt
    dir/optional_silence.txt
    dir/extra_questions.txt

2. 生成wav.scp, txt(word-segmented),utt2spk,spk2utt

 local/prepare_data.sh ${trn_set} data/local/dict data/local/train data/train || exit 1;
 local/prepare_data.sh ${dev_set} data/local/dict data/local/dev   data/dev   || exit 1;
 local/prepare_data.sh ${tst_set} data/local/dict data/local/test  data/test  || exit 1;

(以下以一个数据集为例)

  • input
    trn_set(训练集所在文件路径)
    data/local/dict(步骤1生成的词典文件路径,保存kaldi格式的lexicon)
  • output
    data/local/train(tmp-dir)
    data/train(output-dir)

3. 生成词典L.fst文件

utils/prepare_lang.sh --position-dependent-phones false \
  data/local/dict "<UNK>" data/local/lang data/lang || exit 1;
  • input
    data/local/dict(步骤1生成的词典文件路径,保存kaldi格式的lexicon)
    “UNK”(out of vocabulary word)
  • output
    data/local/lang(临时文件)
    data/lang/phones(目标文件)

4. 语言模型准备

local/train_lms.sh \
     data/local/dict/lexicon.txt data/local/train/text data/local/lm || exit 1;
  • input
    data/local/dict/lexicon.txt(步骤1生成的词典文件)
    data/local/train/text(步骤2生成的数据)
  • output
    data/local/lm(生成的LM)
    data/local/lm/3gram-mincount/lm_unpruned.gz
  • extras
    用SRILM做的工作
    输出:data/local/lm/srilm

5. 生成语言模型G.fst文件

该程序的主要目标就是根据语言模型生成G.fst文件。方便与之前的L.fst结合,发挥fst的优势。

utils/format_lm.sh data/lang data/local/lm/3gram-mincount/lm_unpruned.gz \
    data/local/dict/lexicon.txt data/lang_test || exit 1;
  • input
    data/lang(步骤3生成的词典L.fst)
    data/local/lm/3gram-mincount/lm_unpruned.gz (步骤4生成的LM)
    data/local/dict/lexicon.txt(步骤1生成的词典文件)
  • output
    data/lang_test (G.fst文件所在位置)

local/run_gmm.sh脚本解读

1. 特征提取MFCC&CMVN

mfccdir should be some place with a largish disk where you want to store MFCC features.

1.1 MFCC特征提取

Combine MFCC and pitch features together
Note: This file is based on make_mfcc.sh and make_pitch_kaldi.sh

steps/make_mfcc_pitch.sh --pitch-config conf/pitch.conf --cmd "$train_cmd" --nj $nj \
      data/$x exp/make_mfcc/$x mfcc || exit 1;
  • input
    data/train(dev test)(步骤2生成的数据文件)
  • output
    exp/make_mfcc/train(dev test)(log文件)
    mfcc or data/train(dev test)/data(mfcc_pitch_dir)

1.2 CMVN特征提取

steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc || exit 1;
  • input
    data/train(dev test)(步骤2生成的数据文件)
  • output
    exp/make_mfcc/train(dev test)(log文件)
    mfcc or data/train(dev test)/data(mfcc_pitch_dir)

?和mfcc在一个文件夹里?

1.3 检查数据

This script makes sure that only the segments present in all of "feats.scp", "wav.scp" [if present], segments [if present] text, and utt2spk are present in any of them. It puts the original contents of data-dir into data-dir/.backup

utils/fix_data_dir.sh data/$x
  • input
    data/train(dev test)(步骤2生成的数据文件)

2. 划分训练子集

subset the training data for fast startup

utils/subset_data_dir.sh data/train ${x}000 data/train_${x}k

3. 单音素模型训练

3.1 训练步骤

主要输出为final.mdl和tree。训练的核心流程就是迭代对齐-统计算GMM与HMM信息-更新参数

steps/train_mono.sh --cmd "$train_cmd" --nj $nj \
    data/train_100k data/lang exp/mono || exit 1;
  • input
    data/train_100k(数据准备步骤2中生成的数据文件子集)
    data/lang(数据准备步骤3中生成的L.fst)
  • output
    exp/mono

3.2 解码步骤

采用刚刚训练得到的模型来对测试数据集进行解码并计算准确率等信息

3.2.1 构造解码图

构造一个完全扩展的解码图(HLCG.FST),能表示语言模型、词典、上下文相关性和HMM解构。
脚本原注释如下:
This script creates a fully expanded decoding graph (HCLG) that represents all the language-model, pronunciation dictionary (lexicon), context-dependency,and HMM structure in our model. The output is a Finite State Transducer that has word-ids on the output, and pdf-ids on the input (these are indexes that resolve to Gaussian Mixture Models).
See
http://kaldi-asr.org/doc/graph_recipe_test.html
(this is compiled from this repository using Doxygen,
the source for this part is in src/doc/graph_recipe_test.dox)

utils/mkgraph.sh data/lang_test exp/mono exp/mono/graph || exit 1;
  • input
    data/lang_test——lang-dir
    exp/mono——model-dir(tree&final.mdl)
  • output
    exp/mono/graph——graph-dir

3.2.2 解码测试

通过调用gmm-latgen-faster或gmm-latgen-faster-parallel进行解码,生成lat.JOB.gz

  steps/decode.sh --cmd "$decode_cmd" --config conf/decode.conf --nj ${dev_nj} \    exp/mono/graph data/dev exp/mono/decode_dev
#for dev
  steps/decode.sh --cmd "$decode_cmd" --config conf/decode.conf --nj ${test_nj} \
    exp/mono/graph data/test exp/mono/decode_test
#for test

以训练集为例:

  • input
    exp/mono/graph——graph-dir
    data/test——data-dir
  • output
    exp/mono/decode_test——decode-dir

3.3 对齐步骤

用训练好的模型将数据进行强制对齐方便以后使用

steps/align_si.sh --cmd "$train_cmd" --nj $nj \
    data/train_300k data/lang exp/mono exp/mono_ali || exit 1;
  • input
    data/train_300k——data-dir
    data/lang——lang-dir
    exp/mono——src-dir
  • output
    exp/mono_ali——align-dir

4. 三因子模型训练

4.1 训练步骤

4.2 解码步骤

4.3 对齐步骤

local/chain/run_tdnn.sh脚本解读

关于kaldi的chain模型目前没有完全了解,后续进行补充

Reference

张涵沛的博客

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容