Kaldiに関する処理を日本語のドキュメントでまとめてみた(学習編)4


前回

1:http://qiita.com/GushiSnow/items/cc1440e0a8ea199e78c5

2:http://qiita.com/GushiSnow/items/a24cad7231de341738ee

3:http://qiita.com/GushiSnow/items/e099baf9d1c2e72cb3d1

いよいよ学習のフェーズに入る。

データの振り分け

utils/subset_data_dir.sh data/train 1000 data/train.1k  || exit 1;

学習では上記スクリプトでデータの振り分けを行う。

引数は標準で3つ

1:下記のファイル及びディレクトリが保存されているファイルを指定

cmvn.scp | spk2gender | split20/ | utt2spk

feats.scp | spk2utt | text | wav.scp

2:学習するのに必要なデータ量を指定

3:出力先のディレクトリを指定

用意されているオプション

--per-spk  #それぞれの話者の発話数を指定
--speakers #ランダムに話者を選択
--shortest #発話をすべて小文字で用意
--first    #最初の発話のみ
--last     #最後の発話のみ
--spk-list #話者のリストを取得

モノフォン学習

1:初期モデルの学習を行っている

gmm-init-mono $shared_phones_opt "--train-feats=$feats subset-feats --n=    10 ark:- ark:-|" $lang/topo $feat_dim $dir/0.mdl $dir/tree || exit 1;

2:グラフの学習を行っている。(グラフの詳細はOpenFstを参照)

compile-train-graphs $dir/tree $dir/0.mdl  $lang/L.fst \                
"ark:sym2int.pl --map-oov $oov_sym -f 2- $lang/words.txt < $sdata/JOB/te    xt|" 

参照
http://qiita.com/GushiSnow/items/a24cad7231de341738ee

3:アライメントを行う

align-equal-compiled "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" ark,t:-      \| \                                                                   
gmm-acc-stats-ali --binary=true $dir/0.mdl "$feats" ark:- \  

4:アライメントが正しいか最尤推定を行う

gmm-est --min-gaussian-occupancy=3  --mix-up=$numgauss --power=$power \   

$dir/0.mdl "gmm-sum-accs - $dir/0.*.acc|" $dir/1.mdl 2> $dir/log/update.0.log || exit 1;

ビーム幅を大きくした探索を行う場合は下記のシェルが実行される。

x=1
while [ $x -lt $num_iters ]; do
  echo "$0: Pass $x"
  if [ $stage -le $x ]; then
    if echo $realign_iters | grep -w $x >/dev/null; then
      echo "$0: Aligning data"
      mdl="gmm-boost-silence --boost=$boost_silence `cat $lang/phones/optional_s
ilence.csl` $dir/$x.mdl - |"
      $cmd JOB=1:$nj $dir/log/align.$x.JOB.log \
        gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$[$beam*4] --ca
reful=$careful "$mdl" \
        "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" "ark,t:|gzip -c >$dir/ali.JOB
.gz" \
        || exit 1;
    fi
    $cmd JOB=1:$nj $dir/log/acc.$x.JOB.log \
      gmm-acc-stats-ali  $dir/$x.mdl "$feats" "ark:gunzip -c $dir/ali.JOB.gz|" \
      $dir/$x.JOB.acc || exit 1;

    $cmd $dir/log/update.$x.log \
      gmm-est --write-occs=$dir/$[$x+1].occs --mix-up=$numgauss --power=$power $
dir/$x.mdl \
      "gmm-sum-accs - $dir/$x.*.acc|" $dir/$[$x+1].mdl || exit 1;
    rm $dir/$x.mdl $dir/$x.*.acc $dir/$x.occs 2>/dev/null
  fi
  if [ $x -le $max_iter_inc ]; then
     numgauss=$[$numgauss+$incgauss];
  fi
  beam=10
  x=$[$x+1]
done

gmm-boost-silenceは

silienceモデルを他のGMMモデルにシェアすることですべてのモデルにおけるGMM重みがsilenceと一致する。