Kaldiに関する処理を日本語のドキュメントでまとめてみた（データ準備編）2

#前回

１：http://qiita.com/GushiSnow/items/cc1440e0a8ea199e78c5

#データ準備編後編

####11：OpenFstを用いてsilにおける重み付き状態変換器を作成しておく。

重み付き状態変換器について軽く説明

重み付き状態変換器は音声認識、機械学習、文字認識など幅広く使用されている。Kaldiも使用している。

詳細
http://www.openfst.org/twiki/bin/view/FST/FstQuickTour

下記のように入力と出力のペアがあり、そのペアに対して重みがついており、初期の状態からの変遷を表す。

![symbolicfst.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/3d7192ac-393c-7918-deb1-4e728b412447.jpeg)

今回の場合は

入力が音素
出力が単語

となり、下記コマンドで作成される

```shelll
#silのみ出力
utils/make_lexicon_fst_silprob.pl $tmpdir/lexiconp_silprob_disambig.txt $s    rcdir/silprob.txt $silphone '#'$ndisambig | \

#置き換え処理                               
sed 's=\#[0-9][0-9]*=<eps>=g' | \for indirect one, use twice the learning rate

#音素を入力、単語を出力として重み付き状態変換器の作成                                      
fstcompile --isymbols=$dir/phones.txt --osymbols=$dir/words.txt \      
--keep_isymbols=false --keep_osymbols=false |   \ 

#１４：重み付き状態変換器をソート：下記に例を示す                     
fstarcsort --sort_type=olabel > $dir/L.fst || exit 1
```
ソートの例

ソート前

![arcsort1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/f35d33ec-64c4-e69b-4206-3fcd0ad3a119.jpeg)

ソート後
![arcsort3.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/73c3d570-b20f-2d87-09d3-692568a0cfbd.jpeg)


ソート前とソート後で出力ラベルの昇順に並んでいることがわかる。
上図では重みは表示されていない。

上記のコマンドで出力されたfstファイルの中身を確認する方法

```shell-session
fstprint --isymbols=./data/lang/phones.txt（音素ファイル） --osymbols=./data/lang/words.txt（単語ファイル） ../../../test_japanese/data/lang_test_tg/L.fst（fstファイル） test.txt（出力されるファイル）
```
出力されたファイルの中身

|  ラベル |次に遷移するラベル| 音素|単語|重み |
|:-----------|------------:|:------------:|:------------:|:------------:|
|0 |      1| <eps> |  <eps> |  0.693147182
|0 |      1| SIL   |  <eps> |  0.693147182
|1 |      1| SIL   |  !SIL|
|1 |      1| SIL_E |  'EM |    0.693147182
|1 |      2| SIL_E |  'EM |    0.693147182
|1 |      1| SIL_B |  A   |    0.693147182
|1 |      2| SIL_B |  A   |    0.693147182
|1|||
|2 |      1 |SIL   |  <eps>|

これらを図に直してみたい場合
```shell-session
fstdraw --isymbols=./data/lang/phones.txt（音素ファイル） --osymbols=./data/lang/words.txt（単語ファイル） ../../../test_japanese/data/lang_test_tg/L.fst(fstファイル) test.dot（dot記述式ファイル）
```

dotファイルを画像ファイルに変換して開く

```shell-session
dot -Tjpg test.dot > test.jpg
xli test.jpg
```
下記のように出力される

![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/8dcf4a6f-06ff-7a52-2732-010eca18b099.jpeg)

表で示したラベル、次に遷移するラベル、音素、単語、重みと対応することが分かる。

####１２：utils/sym2int.plを用いて、下記のファイルをint形式に変換する。

oov.txt
phones.txt
roots.txt
word_boundary.txt

####１３：disambiguation symbolsのfstファイルを作成する。

####１４：出力されたディレクトリをチェックする。

##言語モデルに対して重み付き状態変換器の作成を行う

```shell-session
cat $lmdir/lm.arpa | \                                                                 
grep -v '
 
' | \                                                                
grep -v '
 
' | \                                                               
grep -v '
 
' | \                                                              
arpa2fst - | fstprint | \                                                            
utils/remove_oovs.pl $tmpdir/oovs.txt | \                                            
utils/eps2disambig.pl | utils/s2eps.pl | fstcompile --isymbols=$test/words.txt \     
--osymbols=$test/words.txt  --keep_isymbols=false --keep_osymbols=false | \        
fstrmepsilon | fstarcsort --sort_type=ilabel > $test/G.fst                           

fstisstochastic $test/G.fst

```

###空文字に対してもfstファイルを作成する

```shell-session
awk '{if(NF==1){ printf("0 0 %s %s\n", $1,$1); }} END{print "0 0 #0 #0"; print "0";}' \
   < "$lexicon"  >$tmpdir/g/select_empty.fst.txt                               
         
 fstcompile --isymbols=$test/words.txt --osymbols=$test/words.txt \                     
  $tmpdir/g/select_empty.fst.txt | \
                                                   
 fstarcsort --sort_type=olabel | fstcompose - $test/G.fst > $tmpdir/g/empty_words.fst   

 fstinfo $tmpdir/g/empty_words.fst | grep cyclic | grep -w 'y' &&                       
 echo "Language model has cycles with empty words" && exit 1                          

 rm -rf $tmpdir    
```

これでデータ準備は終了です。
次からはデータからの特徴量抽出に入ります。