変更履歴:

1. はじめに

本実習は,日本語話言葉コーパスCSJを用いたKaldi用大語彙日本語音声認識レシピ(CSJ Kaldi レシピ)の動作を理解することを目的としています. Kaldiのレポジトリから一般公開している実際のレシピの実行にはGPUを用いた大規模な計算が必要となるため, 本実習では手軽に試せるよう軽量版レシピを用意しました. 本実習に取り組むことで,
1)CSJデータベースのデータを音声認識システムの学習に適したフォーマットに変換し,
2)GMMを用いた状態共有triphoneを学習し,
3)さらにDNNを用いた音響モデルを作成し,
4)それらを用いた音声認識を実行し,
5)評価スコアとして単語誤り率を計算する
までの手順について理解することができます. 軽量版レシピを実行するためには, 下記の1,2章で説明するようにKaldiがインストールされたパソコン(ノートパソコン可)とCSJのサブセットを事前に用意してください. また3章で説明するように, 軽量版レシピのダウンロードも必要です.

2. 実行環境のセットアップ

実習は,Linuxディストリビューションの一種である64bit版CentOS6にKaldiがインストールされている環境を前提にしています (他のLinux環境でも動くかもしれませんが,充分確認していません). 実習用軽量版レシピの実行ではGPUは不要であり,Core i5程度のCPUと1.5Gbyte程度のメモリが利用 できるLinuxがあれば動作します. WindowsやMacOSがインストールされたノートパソコン上で本レシピを試す場合は, VirtualBoxをホストOS上にインストールしそのゲストOSとしてLinuxをインストールするのが手軽です. WindowsやMacOSが動作するホストPC上にVirtualBoxをインストールしてその中でLinuxを動作させる場合は, ホストPCのスペックとして4GByte程度以上のメモリと30GByte以上のディスク空き容量が必要です.
以下では,VirtualBox上に実行環境をセットアップする方法について説明します. ゲストOSのインストール手順以降については,PCに直接Linuxをインストールする場合と同じです. また実習で用いる軽量版レシピでは,音響モデルや言語モデルの学習および認識評価を行うため, CSJのデータのうち表1に示す5講演分の音声データとそれら5講演を含む200講演分程度の書き起こしデータを利用します. CSJの利用にはライセンスの購入が必要なため, CSJレシピには含まれていません.CSJレシピが対応しているのは,CSJの第3刷以降です. スクリプトを動作させる場合,これらのデータを事前に別途用意してください. CSJを第3刷DVDからインストールしている場合は,表にあげた音声ファイルはDVD3に,sdbファイルはDVD1に入っています.

表1 実習で使用するCSJデータ(要別途入手)
音声 書き起こし
A01F0055.wav CSJ{DVD1 or MORPH}/SDB/coreに含まれる全短単位長単位混合形式形態論テータ*.sdbファイル 201講演
(左記の音声データに対応する講演のsdbを包含すれば,言語モデルが学習できる数の講演があればよい)
A01F0067.wav
A01M0097.wav
A01F0122.wav
A01F0132.wav

2.1 VirtualBoxとVirtualBox内へのCentOSのインストール(所要時間:約1時間)

パソコン上にVirtualBoxをインストールし,さらにVirtualBox内にCentOSを インストールする手順は以下のとおりです. Kaldiの実行に必要なライブラリ等についてもインストールが必要です.
  1. 念のため,事前にパソコンのバックアップを行います.
  2. VirtualBoxをダウンロードし インストーラの指示に従いインストールします.
  3. 64bit版CentOS6のインストール用ISOイメージをダウンロードします.
  4. VirtualBoxの「仮想マシン」メニューから「新規」を選択し,指示に従って仮想マシンを作成します. 仮想マシンの名前は任意ですが,以下ではvbkalditestとします. OSタイプはLinux,バージョンはRedHat(64bit)を選択します. 仮想マシンに割り当てるメモリサイズは1.5Gbyte以上を指定します.ディスクサイズは30Gbyte以上を指定します.
  5. VirtualBoxのメイン画面で作成した仮想マシンvbkalditestを選択し, 「光学ドライブ」で「ディスクイメージを選択」を選択し,先ほどダウンロードしたCentOSのISOイメージファイルを指定します. 起動ボタンを押して,仮想マシンを起動します.
  6. 仮想マシン内で,CentOSのインストーラが起動するので,指示に従ってインストールします. ストレージデバイスのデータについて警告がでますが,仮想ディスクはブランク状態なのでデータの廃棄を選択します. (ディスクサイズが仮想マシン作成時に指定したものと同じであることを確認すること). ホスト名は任意ですが,以下ではsuzukakeとします.追加ソフトウエアの選択では, Software Development Workstationなどを選択します. インストールが終わると再起動を求められるので,CentOSのインストーラに表示されている再起動ボタンを押します.
  7. インストールしたCentOSが起動します.初回起動時,ライセンスの同意や,初期設定画面が表示されるので,指示に従い進みます. 作成するユーザー名は任意ですが,以下ではkalditestとします.
  8. ログイン画面が表示されたら,先ほど作成したアカウント(kalditest)でログインします.
  9. ネットワーク接続を有効化するため,CentOS内で「システム」-->「設定」-->「ネットワーク接続」を選択します. system eth0を選択し,「編集」ボタンを押して「自動接続する(A)」にチェックを入れ,「適用」ボタンを押す.
  10. 端末を立ち上げ,以下のコマンドを入力してOSを最新版に更新します.
    [kalditest@suzukake ~]$ su
    [root@suzukake]$ yum upgrade
    
  11. OSのアップデートが完了したら,一回リブートします. OSが再起動したら,再度kalditestでログインし端末を立ち上げsuコマンドを実行してrootユーザーになり, Kaldiで必要な数値計算ライブラリをインストールします. 数値計算ライブラリにはいくつか選択肢があるが,以下ではSSE3に対応したatlasをインストールする例を示します. その他,g++コンパイラ等が未インストールであればインストールします.
    [root@suzukake]$ yum install atlas-sse3-devel
    
  12. CSJレシピを使用する際は日本語のテキスト処理のためにnkfが必要になるため,インストールします.
    [root@suzukake]$ yum install nkf
    
  13. もしGPUを使用する場合は, cudaをインストールします. (cudaに対応したGPUが必要です)

2.2 CentOSへのKaldiのインストール(所要時間:約1時間)

CentOSにKaldiをインストールする手順は以下のとおりです. Kaldiのインストールはユーザー権限またはroot権限で行います. 以下ではユーザー権限でホームディレクトリの下にインストールする場合について示します.
  1. ユーザーアカウント(kalditest)でログインし,端末を立ち上げます. gitコマンドにより,kaldiのソースレポジトリからソースコード一式をダウンロードします.
    [kalditest@suzukake ~]$ cd ~
    [kalditest@suzukake ~]$ git clone https://github.com/kaldi-asr/kaldi.git
    
    インストール手順の詳細は各ディレクトリにあるINSTALLファイルに書かれています.
  2. kaldiをコンパイルします.
    [kalditest@suzukake ~]$ cd kaldi
    [kalditest@suzukake kaldi]$ cd tools
    [kalditest@suzukake tools]$ make
    [kalditest@suzukake src]$ cd ../src
    [kalditest@suzukake src]$ ./configure
    [kalditest@suzukake src]$ make depend
    [kalditest@suzukake src]$ make
    
  3. 以上の操作でkaldiが依存しているツール群も大部分自動でインストールされますが, 一部ライセンスの制約等により手動インストールが必要なものもあります. CSJレシピではSRILMツールキット を使用するので,別途パッケージを入手した上でインストールします. SRILMのパッケージをkaldi/toolsディレクトリにコピーし, kaldi/tools以下に用意されているSRILM用のインストーラを実行すればよいです.
    [kalditest@suzukake tools]$ cd ~/kaldi/tools
    [kalditest@suzukake tools]$ ./install_srilm.sh
    
  4. tools/openfst-1.3.4のディレクトリの設定が, デフォルトでは他人(other)がアクセスできない設定になっている場合があります.必要に応じてパーミッションを変更します.
    [kalditest@suzukake tools]$ chmod o+rx openfst-1.3.4
    
  5. インストールが正しく行えたか,いくつかコマンドを引数なしで実行して動くことを確認します. 各コマンドにpathを通すため,最初にpath.shを読み込みます.
    [kalditest@suzukake ~]$ cd ~/kaldi/egs/csj/s5/
    [kalditest@suzukake s5]$ source path.sh
    [kalditest@suzukake s5]$ copy-feats
    [kalditest@suzukake s5]$ nnet-copy
    

3. 軽量版CSJレシピのインストールと学習・評価用データの準備

軽量版CSJ用Kaldiレシピと,CSJデータ(サブセット)を用意します.

3.1 レシピの展開

下記軽量版レシピをダウンロードして展開し,kaldiのegs/csjの下に置きます.
[kalditest@suzukake ~]$ tar zxf s5_demo.tgz
[kalditest@suzukake ~]$ mv s5_demo ~/kaldi/egs/csj

3.2 CSJデータのセットアップ

s5_demoの下にCSJという名前の空のディレクトリがあるので,表1に示すデータ(*.wav,*.sdb)をその中にコピーします.
[kalditest@suzukake ~]$ cd ~/kaldi/egs/csj/s5_demo
[kalditest@suzukake s5_demo]$ cp -ip "CSJのサブセット/{*.wav,*.sdb}" CSJ

4. 軽量版カスタムレシピを用いた実習(所要時間:約1時間)


図1 CSJ kaldi レシピの構成

図1にCSJレシピの構成を示します. 一般公開版のレシピでは,run.shがトップレベルのスクリプトで,これを一つ起動するだけで全ての処理が自動で行われます. しかし中身を理解しようとする際は,各部分を切り出して実行できると便利です. 一般公開版のレシピでもスクリプトを編集して部分実行することは難しくありませんが, 軽量版カスタムレシピでははじめからスクリプトを番号順に実行することで学習の各ステップを一つずつ 確認しながら試せるように作ってあります. さらに,名前に_synopsがついたスクリプトは各ステップで中心的な役割を担うコマンドを抜き出して独立して試せるようにしています. コマンドラインから一行毎に入力して,動作を試してみてください.

4.0 モデルを作成するデータの準備[00_*.sh]

始めにCSJの短単位長単位混合形式形態論データ(sdbファイル)の時間ラベルと形態素情報をもとに, 発話単位の書き起こしラベルと語彙リストを作成します. これらの処理はすべてlocal/csj_make_trans内のスクリプトで行っています. 得られた書き起こしラベルと語彙リストをもとに,3-gram言語モデルを学習します. 音素は3状態のleft-to-right 型HMMであり,無音は4状態でモデル化しています. 音素と無音の各状態数はutils/prepare_lang.shのオプションで変更できます. 最後にWAV形式の音声データからMFCC特徴量を抽出し,Kaldi独自のアーカイブ形式で保存します. 特徴量はMFCCの他にFBANKとPLPも選択可能です.

4.1 モノフォンGMM-HMMの最尤学習[01_mono]

はじめに13次元のMFCCとその動的特徴量(ΔとΔΔ)を用いてモノフォンGMM-HMMを最尤学習します.

4.2 トライフォンGMM-HMMの最尤学習[02_delta]

モノフォンを元にトライフォンを学習します. トライフォンの状態共有を行うための質問リストは,Kaldiのプログラムにより自動生成されます.

4.3 特徴量変換を適用したトライフォンGMM-HMMの最尤学習[03_feats_trans]

特徴量にLDAとMLLTを適用します.変換した特徴量を用いてトライフォンを再推定します.

4.4 話者適応学習[04_sat]

fMLLRを用いた話者適応学習(SAT)を行います.

4.5 MMI識別学習[05_mmi]

ラティスの生成が必要なため時間がかかります.後段のDNN学習に影響しないため省略できます. (DNN-HMMの学習は最尤学習したトライフォンを元にするため)

4.6 fMMI識別学習[06_fmmi]

ラティスの生成が必要なため時間がかかります.後段のDNN学習に影響しないため省略できます. (DNN-HMMの学習は最尤学習したトライフォンを元にするため)

4.7 [07_prep_dnn.sh]

DNNの学習で使用するデータを用意します.

4.8 DNN-HMMの学習[08_dnn]

まずRBMによるプレトレーニングを行います.最初に入力層(GB-RBM)の学習を行い,ついで中間層(BB-RBM)の学習を行います. プレトレーニングの後ネットワークをDNNに変換し,バックプロパゲーションによるファインチューニングを行います.

4.9 DNN-HMMの系列学習[09_dnn_s]

系列学習はラティスの生成に時間がかかりますが,実行すれば認識性能の向上が期待できます.

5. Kaldi CSJ レシピについて

東工大篠崎研究室とMERL渡部の協力のもと開発しました. レシピの各種メタパラメタは,東工大のスーパーコンピューターTSUBAME2.5を用いて進化的アルゴリズムにより最適化しています [1].
[1] T. Moriya, T. Tanaka, T. Shinozaki, S. Watanabe, and K. Duh, "Automation of system building for state-of-the-art large vocabulary speech recognition using evolution strategy," Proc. IEEE ASRU, 2015.
東工大の研究はJSPS 科研費26280055の助成を受けたものです.渡部晋治はMERLより支援を得ました.
[back to home]