音声認識メモ(Kaldi)その4(学習 その1)

Kaldiにおけるモデルの学習過程を追ってみる。

モデルを更新するにあたっては「gmmbin/gmm-est」コマンドを使う。

Do Maximum Likelihood re-estimation of GMM-based acoustic model
Usage:  gmm-est [options] <model-in> <stats-in> <model-out>
e.g.: gmm-est 1.mdl 1.acc 2.mdl

学習の際のインプットとしては、

  • モデル(更新前)
  • 統計量

が必要。

統計量の作成には、「gmmbin/gmm-acc-stats-ali」コマンドを使う。

Usage:  gmm-acc-stats-ali [options] <model-in> <feature-rspecifier> <alignments-rspecifier> <stats-out>
e.g.: gmm-acc-stats-ali 1.mdl scp:train.scp ark:1.ali 1.acc

インプットとして、

  • 初期モデル
  • 特徴量ファイル
  • 均等分割アライメント

が必要。

均等分割アライメントの作成は「bin/align‐equal‐compiled」コマンドを使う。

Write an equally spaced alignment (for getting training started)
Usage:  align-equal-compiled <graphs-rspecifier> <features-rspecifier> <alignments-wspecifier>
e.g.:  align-equal-compiled 1.fsts scp:train.scp ark:equal.ali

ここで、インプットとして学習用グラフ(FST)が必要になる。
グラフ作成には「bin/compile-train-graphs」コマンドを使うが、今回はグラフ生成部分に関するメモ。

Creates training graphs (without transition-probabilities, by default)
Usage:   compile-train-graphs [options] <tree-in> <model-in> <lexicon-fst-in> <transcriptions-rspecifier> <graphs-wspecifier>
e.g.:  compile-train-graphs tree 1.mdl lex.fst 'ark:sym2int.pl -f 2- words.txt text|' ark:graphs.fsts

学習用グラフ作成のインプット

  • tree
  • 初期モデル
  • グラフ(LexiconのFST)
  • text(int形式)

が必要。

text(int形式)
utterance_id_001 2
(参考)text(symbol形式)
utterance_id_001 MOSIMOSI
モデルのトポロジ(non-silence phone)
<TopologyEntry> 
<ForPhones> 
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
</ForPhones> 
<State> 0 <PdfClass> 0 <Transition> 0 0.75 <Transition> 1 0.25 </State> 
<State> 1 <PdfClass> 1 <Transition> 1 0.75 <Transition> 2 0.25 </State> 
<State> 2 <PdfClass> 2 <Transition> 2 0.75 <Transition> 3 0.25 </State> 
<State> 3 </State> 
</TopologyEntry> 
モデルのトポロジ(silence phone)
<ForPhones> 
1 2 3 4 5 6 7 8 9 10 
</ForPhones> 
<State> 0 <PdfClass> 0 <Transition> 0 0.25 <Transition> 1 0.25 <Transition> 2 0.25 <Transition> 3 0.25 </State> 
<State> 1 <PdfClass> 1 <Transition> 1 0.25 <Transition> 2 0.25 <Transition> 3 0.25 <Transition> 4 0.25 </State> 
<State> 2 <PdfClass> 2 <Transition> 1 0.25 <Transition> 2 0.25 <Transition> 3 0.25 <Transition> 4 0.25 </State> 
<State> 3 <PdfClass> 3 <Transition> 1 0.25 <Transition> 2 0.25 <Transition> 3 0.25 <Transition> 4 0.25 </State> 
<State> 4 <PdfClass> 4 <Transition> 4 0.75 <Transition> 5 0.25 </State> 
<State> 5 </State> 
</TopologyEntry> 
モデルをFSTに変換したもの

f:id:ichou1:20180322083845p:plain

図中緑字の意味は以下のとおり。
"_"の前 : phone(音素)
"_"の後 : phone(音素)内部の位置

_B begin   
_I internal
_E end
FST(Context to word)

f:id:ichou1:20180322083857p:plain

この2つを合成する。

    VectorFst<StdArc> *H;
    VectorFst<StdArc> &ctx2word_fst;
    VectorFst<StdArc> trans2word_fst;
    TableCompose(*H, ctx2word_fst, &trans2word_fst);
FST(合成後)

f:id:ichou1:20180321105153j:plain
青字はweight

続けて、determinize、miniminize、self-loop追加を行い、学習用FSTを生成する。f:id:ichou1:20180321111451j:plain