音声認識メモ(Kaldi)その3(WFST)

Kaldiで使うモデルを作成してみる。

ターゲットは、「もしもし」という発話。

流れとしては、下図4つのモデルを作って合成する。
f:id:ichou1:20180304094851p:plain

合成は以下の順番。
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

f:id:ichou1:20180304100954j:plain

続いて、GrammarとLexiconの合成(compose)。

Lexiconは、音響モデルを作る過程でできたものを使う。

data/lang/L_disambig.fst

f:id:ichou1:20180304102456j:plain

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

f:id:ichou1:20180304102640j:plain

続いて、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

f:id:ichou1:20180304105332j:plain

続いて、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

f:id:ichou1:20180304110200j:plain