音声認識メモ(Kaldi)その19(Toolkitスクリプト(3))

前回の「Kaldi for Dummies tutorial」では、トライフォンの初期学習までであった。

TRI1 - simple triphone training (first triphone pass).

この後の処理を確認してみる。

「egs/rm/s5/RESULTS」には各実装(experiments)でのWERが出力されており、いくつかを書き並べてみると以下のとおり。

mono

Monophone, MFCC + delta + accel

tri1

MFCC + delta + accel

tri2a

MFCC + delta + accel (on top of better alignments)

tri2b

LDA + MLLT

tri3b

LDA + MLLT + SAT

tri3c

raw-fMLLR ( fMLLR on the raw MFCCs )

sgmm2_4[a-c]

SGMM2 is a new version of the code that has tying of the substates a bit like "state-clustered tied mixture" systems; and which has speaker-dependent mixture weights.

nnet4[a-e]

Deep neural net -- various types of hybrid system.

dnn4b

MFCC, LDA, fMLLR feaures, (Karel - 30.7.2015)

cnn4c

FBANK + pitch features, (Karel - 30.7.2015)


この中で、「nnet4d」(nnet2のプライマリレシピ)をターゲットとして、triphone初期モデル(tri1)までの流れを逆にたどってみる。
GPUを使わない環境で試しているので、GPUを使用しない条件下で確認)

公式サイトの説明より、「rm/s5/local/run_nnet2.sh」が起点となるスクリプトであることを確認。

The first place to look to get a top level overview of the neural net training is probably the scripts. In the standard example scripts in egs/rm/s5, egs/wsj/s5 and egs/swbd/s5b, the top-level script is run.sh. This script calls (sometimes commented out) a script called local/run_nnet2.sh. This is the top-level example script for Dan's setup.

rm/s5/local/run_nnet2.shより抜粋
# **THIS IS THE PRIMARY RECIPE (40-dim + fMLLR + p-norm neural net)**
local/nnet2/run_4d.sh --use-gpu false
egs/rm/s5/local/nnet2/run_4d.shより抜粋
steps/nnet2/train_pnorm_fast.sh
    data/train \
    data/lang \
    exp/tri3b_ali \
    exp/nnet4d

トレーニングのアウトプット「exp/nnet4d」を作成するには、インプットとしてアライメントデータ「exp/tri3b_ali」が必要。

egs/rm/s5/run.shより抜粋
# Align all data with LDA+MLLT+SAT system (tri3b)
steps/align_fmllr.sh \
    --use-graphs true \
    data/train \
    data/lang \
    exp/tri3b \
    exp/tri3b_ali

アライメントのアウトプット「exp/tri3b_ali」を作成するには、インプットとして「exp/tri3b」が必要。

egs/rm/s5/run.shより抜粋
## Do LDA+MLLT+SAT
steps/train_sat.sh \
	1800 \          # <#leaves>
	9000 \          # <#gauss>
	data/train \    # <data>
	data/lang \     # <lang>
	exp/tri2b_ali \ # <ali-dir>
	exp/tri3b       # <exp-dir>

トレーニングのアウトプット「exp/tri3b」を作成するには、インプットとしてアライメントデータ「exp/tri2b_ali」が必要。

egs/rm/s5/run.shより抜粋
# Align all data with LDA+MLLT system (tri2b)
steps/align_si.sh \
	--use-graphs true \
	data/train \
	data/lang \
	exp/tri2b \
	exp/tri2b_ali

アライメントデータ「exp/tri2b_ali」を作成するには、インプットとして「exp/tri2b」が必要。

egs/rm/s5/run.shより抜粋
# train and decode tri2b [LDA+MLLT]
steps/train_lda_mllt.sh \
	1800 \         # <#leaves>
	9000 \         # <#gauss>
	data/train \   # <data>
	data/lang \    # <lang>
	exp/tri1_ali \ # <ali-dir>
	exp/tri2b      # <exp-dir>

トレーニングデータ「exp/tri2b」を作成するには、インプットとしてアライメントデータ「exp/tri1_ali」が必要。

egs/rm/s5/run.shより抜粋
# align tri1
steps/align_si.sh \
	--use-graphs true \
	data/train \
	data/lang \
	exp/tri1 \
	exp/tri1_ali

アライメントデータ「exp/tri1_ali」を作成するには、インプットとしてトレーニングデータ「exp/tri1」が必要。

「exp/tri1」から[exp/nnet4d]までの流れを書き出してみると以下のとおり。

1. トライフォンモデル(MFCC + delta + accel)を使ったアライメント

アウトプットは「exp/tri1_ali」

2. トライフォンモデル(LDA + MLLT)の作成と学習

アウトプットは「exp/tri2b」

3. トライフォンモデル(LDA + MLLT)を使ったアライメント

アウトプットは「exp/tri2b_ali」

4. トライフォンモデル(LDA + MLLT + SAT)の作成と学習

アウトプットは「exp/tri3b」

5. トライフォンモデル(LDA + MLLT + SAT)を使ったアライメント

アウトプットは「exp/tri3b_ali」

6. Neural Networkモデルの作成と学習

アウトプットは「exp/tri4d」