音声認識メモ(Kaldi)その3(WFST)
Kaldiで使うモデルを作成してみる。
ターゲットは、「もしもし」という発話。
流れとしては、下図4つのモデルを作って合成する。
合成は以下の順番。
L ○ G
↓
C ○ (L ○ G)
↓
H ○ (C ○ (L ○ G))
まず、Grammar。これはARPAファイルから生成する。
src/lmbin/arpa2fst \ --disambig-symbol=#0 \ --read-symbol-table=data/lang/words.txt \ 2gram.arpa \ G.fst
G.fst
続いて、GrammarとLexiconの合成(compose)。
Lexiconは、音響モデルを作る過程でできたものを使う。
data/lang/L_disambig.fst
determinizeとminimizeも併せて実行。
src/fstbin/fsttablecompose \ data/lang/L_disambig.fst \ G.fst | \ src/fstbin/fstdeterminizestar --use-log=true | \ src/fstbin/fstminimizeencoded | \ src/fstbin/fstpushspecial | \ fstarcsort --sort_type=ilabel > LG.fst
LG.fst
続いて、Contextとの合成。
Contextは、音素をもとにコマンドで生成する。
src/fstbin/fstmakecontextfst \ --read-disambig-syms=disambig_phones.list \ phones_exclude_disambig_phones.list 29 ilabels.sym | \ fstarcsort --sort_type=olabel > C.fst
phones_exclude_disambig_phones.list
<eps> 0 sil 1 sil_B 2 sil_E 3 sil_I 4 sil_S 5 spn 6 spn_B 7 spn_E 8 spn_I 9 spn_S 10 I_B 11 I_E 12 I_I 13 I_S 14 M_B 15 M_E 16 M_I 17 M_S 18 O_B 19 O_E 20 O_I 21 O_S 22 S_B 23 S_E 24 S_I 25 S_S 26
disambig_phones.list
27 28
(参考)data/lang/phones.txt(disambigのみ抜粋)
#0 27 #1 28
「make-ilabel-transducer」、「fstdeterminizestar」、「fstminimizeencoded」コマンドを実行して、「CLG2.fst」を作る。
CLG2.fst
続いて、HMMとの合成。
(「Ha.fst」は「make-h-transducer」コマンドで生成)
src/fstbin/fsttablecompose Ha.fst \ CLG2.fst | \ src/fstbin/fstdeterminizestar --use-log=true | \ src/fstbin/fstrmsymbols disambig_tstate.list | \ src/fstbin/fstrmepslocal | \ src/fstbin/fstminimizeencoded > HCLGa.fst
続けて、self-loopsを追加して、「HCLG.fst」を生成する。
HCLG.fst