音声認識メモ(Julius)その4(連続単語認識(DFA))

Juliusでは、連続単語の言語モデルとして、「N-gram」と「DFA」をサポートしている。

ここでのDFA(Deterministic finite automaton、決定性有限オートマトン)はMealy型有限オートマトンのことで、出力が現在状態と入力に決定されるモデル。
遷移は一方通行で、ある特定の状態のみに遷移する。

DFAは、「XXをYY個」のように、定型的なパターンの音声の認識に適している。

今回、「もしもし」と「もしも もしも」("もしも"の2回繰り返し)の2つの文で試してみた。

まずは2つの記述文法ファイルを用意する

test.grammar
S : NS_B DOUBLE NOISE DOUBLE NS_E
S : NS_B SINGLE NS_E
test.voca
% DOUBLE
MOSIMO	m o s i m o
% SINGLE
MOSIMOSI	m o s i m o s i
% NS_B
<s>	silB
% NS_E
</s>	silE
% NOISE
<sp>	sp


この2つを付属のツール(Perlスクリプト)に渡すと、3つのファイルが生成される。

test.dfa
0 3 1 0 0
1 0 2 0 0
1 1 3 0 0
2 4 4 0 0
3 2 5 0 0
4 0 3 0 0
5 -1 -1 1 0

1列目 : 状態(From、遷移元)
2列目 : terminal(カテゴリ番号、単語にあたるもの)
3列目 : 状態(TO、遷移先)
4列目 : 文の終わりなら「1」
5列目 : 未使用

test.dict
0	[MOSIMO]	m o s i m o
1	[MOSIMOSI]	m o s i m o s i
2	[<s>]	silB
3	[</s>]	silE
4	[<sp>]	sp

1列目 : カテゴリ番号

test.term
0	DOUBLE
1	SINGLE
2	NS_B
3	NS_E
4	NOISE

1列目 : カテゴリ番号

図にすると以下のとおり。
f:id:ichou1:20180114113033p:plain

丸枠:状態番号
赤 : 文を構成する単語
緑 : カテゴリ番号

Juliusでは、連続単語の場合、第1パスと第2パスの2回分、計算する。
第2パスでは、後ろから(right -> left)計算するため、DFAも後ろからになっている。