2019년 7월 13일 토요일

음성인식 메모(kaldi) 3 - WFST

「原作者へ」

連絡先を存じ上げませんでしたので、不本意ながら無断で翻訳しました。 
正式に翻訳を許可されたいです。 
gogyzzz@gmail.comでご連絡ください。

아래 포스트의 번역입니다.

http://work-in-progress.hatenablog.com/entry/2018/03/04/110331


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

phonesexcludedisambig_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

댓글 없음:

댓글 쓰기