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

#Kaldiの音声認識まとめ

KaldiはDNN(Deep Neural Network)を用いた音声認識システムである。
学習からデコーダーまで可能だが日本語のドキュメントが整備されていないので備忘録も兼ねて記述しておきます。
冗長な部分および筆者が理解できない部分は除いております。

voxforgeを例に順にスクリプトに沿って見ていきます。

##事前準備

1:空き領域は最低でも20〜25GBは用意しておく
2:kaldi-trunk/egs/voxforge/s5の直下dir_test.txtに

```shell
getdata.sh
```
上記のシェルがある。
データの保存先が分かっていないので、

```shell
path.sh
```
上記のスクリプトを開く。


```shell
#export KALDI_ROOT=`pwd`/../../..
export KALDI_ROOT=/home/tie303523/kaldi-trunk
export PATH=$PWD/utils/:$KALDI_ROOT/src/bin:$KALDI_ROOT/tools/openfst/bin:$KALDI_ROOT/src/fstbin/:$KALDI_ROOT/src/gmmbin/:$KALDI_ROOT/src/featbin/:$KALDI_ROOT/src/lm/:$KALDI_ROOT/src/sgmmbin/:$KALDI_ROOT/src/sgmm2bin/:$KALDI_ROOT/src/fgmmbin/:$KALDI_ROOT/src/latbin/:$PWD:$PATH

# VoxForge data will be stored in:
export DATA_ROOT="/home/dpovey/kaldi-clean/egs/voxforge/s5/voxforge"    # e.g. something like /media/secondary/voxforge

if [ -z $DATA_ROOT ]; then
  echo "You need to set \"DATA_ROOT\" variable in path.sh to point to the directory to host VoxForge's data"
  exit 1
fi

# Make sure that MITLM shared libs are found by the dynamic linker/loader
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/tools/mitlm-svn/lib

# Needed for "correct" sorting
export LC_ALL=C

```
上記のようなスクリプトが出てくるので、自身の環境に合わせて修正を行う。

設定したPATHに対して、voxforgeのデータが取得されてくる。

クラスターマシンの設定があればその設定が可能だが、今はスルー

データセットを選択するシェルが実行される。
下記のような種類に分類が可能（英語を対象としている場合）

American
British
Australia
Zealand

```shell
local/voxforge_select.sh
```

次に匿名ユーザーにおけるデータセットとユーザーIDをマッピングするシェルを実行

```shell
local/voxforge_map_anonymous.sh
```

データ準備用のスクリプトが実行される
データを学習用と評価用に分割

```shell
local/voxforge_data_prep.sh
```
###１：最初の"-"の記号まで抜き出し、その名前speakers_all.txtに出力

```pl
perl -ane ' s:.*/((.+)\-[0-9]{8,10}[a-z]*([_\-].*)?):$2: && print; ' | sort -u > $loctmp/speakers_all.txt 
```

###２：その中からテスト用に使用するデータを抽出


```pl
utils/shuffle_list.pl <$loctmp/speakers_all.txt | head -n $nspk_test | sort -u >$loctmp/speakers_test.txtfor indirect one, use twice the learning rate
```

###３：学習用データを抽出

```shell
awk 'NR==FNR{spk[$0]; next} !($0 in spk)' \ 
$loctmp/speakers_test.txt $loctmp/speakers_all.txt |\
sort -u > $loctmp/speakers_train.txt
```

###４：話者の名前をディレクトリ名で生成する

```shell
data/local/tmp/dir_train.txt
data/local/tmp/dir_test.txtfor indirect one, use twice the learning rate
```

###５：下記のファイルを作成する

-waveファイルの場所とwaveファイル名を記述したwav.scp
-音声データと音声データに対応した書き起こし文が記述されたtrans.txt
-音声データと話者の対応が記述されたutt2spk
-話者に対応する音声データが記述されたspk2utt

が作成される。

エラーを確認したい場合は”make_trans.log”に記述されているので、そこを確認する。

###６：言語モデルを作成する。

```shell-session
ngram-count -order $order -write-vocab $locdata/vocab-full.txt -wbdiscount -text $loctmp/corpus.txt -lm $locdata/lm.arpa
```

バイグラム言語モデルが作成される。

###７：単語に対して音素を付与する。ただし英語のみなので、日本語の場合はこの部分の改良が必要！！！

```shell-session
local/voxforge_prepare_dict.sh
```
このスクリプトで辞書を作成（英語のみ）

```pl
perl $locdict/cmudict/scripts/make_baseform.pl

```

vocab-oov.txt 
lexicon-iv.txt

上記のファイルを作成し<sil>.</sil>を音素辞書とプレーンテキストから排除したファイルを作成

###８：単語、辞書内の出力確率、音素の対応があるファイルを作成

```shell-session
utils/prepare_lang.sh
```

####９：perlで下記の必要なファイルが存在し、適切なフォーマットかをチェックする。

lexicon.txt
silence_phones.txt
nonsilence_phones.txt
optional_silence.txt
for indirect one, use twice the learning rate
```pl
utils/validate_dict_dir.pl
```

####10：音素に位置ごとのラベル付を行う

_B：はじめ
_E：終わり
_S：単一の 
_I：内部の


lexiconp_disambig.txtフォーマットで出力する処理を見る。

フォーマットは下記

!EXCLAMATION-POINT    1.0  EH2_B K_I S_I K_I L_I AH0_I M_I EY1_I SH_I AH0_I N_I P_I OY2_I N_I T_E

単語　辞書に出現しているかどうか　単語に対応する音素という形にっている。

音素と音素の位置の対応関係が記述されたword_boundary.txtを作成する。

単語と単語番号を記述した”words.txt”を作成

lixicon.txtの辞書の出現確率を文字に置き換えた”align_lexicon.txt”に出力する。

ここからはOpenFstの話も含まれてくるので別記事に投稿します。

続きができたらリンクを貼ります。