in English: http://en.nishimotz.com/project:dmcpp
DMCPP
dialog manager for galatea, using libjulius and opencv, written in C++
ソースはこちら http://github.com/nishimotz/dmcpp
galatea-generate されるアプリケーションの DM を C++ で書かれたアプリに差し替える、という実験。 この中で(dialogstudioのJava版DMと同様に)音声認識エンジンjuliusのハンドリングも行う。 opencv 顔検出も統合する。
テストは Ubuntu 9.04 および Ubuntu 10.04 で行っている。 このプロジェクトの中では文字コードは UTF-8 に統一している。
セットアップ
開発途上なので重複するものが多い。御容赦を。
i386 でしか動作確認していない。
Ubuntu 公式の aptitude で入るパッケージ
$ sudo aptitude install ruby $ sudo aptitude install rake $ sudo aptitude install freeglut3 $ sudo aptitude install openjdk-6-jre $ sudo aptitude install chasen $ sudo aptitude install rhino $ sudo aptitude install libreadline5 $ sudo aptitude install ttf-sazanami-gothic
$ sudo aptitude install libasound2-dev $ sudo aptitude install libavcodec52 $ sudo aptitude install libavformat52
sourceforge.jp で配付しているパッケージ
-
- galatea-dialog-20100530
- galatea-engine-20090604
- galatea-ja-chaone-1.3.2
- galatea-ja-unidic-1.3.9
西本による勝手ビルド
-
- julius を見てください
-
- opencv 1.x 系は試していない
N-gram とネットワーク文法の複数インスタンスのために
- julius のサイトから ditcation-kit-v4.0 を落として /usr/local/dictation-kit-v4.0 として展開する
Linux で認識できる USB カメラをつないでおく必要がある。
コンパイルと実行
git からレポジトリを複製する。
$ git clone git://github.com/nishimotz/dmcpp.git $ cd dmcpp
または dmcpp のソースをダウンロードする。 github で右上の download source をクリックして tar を選ぶ。
nishimotz-dmcpp-ec191ea.tar.gz みたいな感じのファイルになる。(末尾の数字はバージョンによって異なる)
$ tar xvfz nishimotz-dmcpp-ec191ea.tar.gz $ cd nishimotz-dmcpp-ec191ea
コンパイルして実行。
$ make $ ./app/script/runner
make でエラーが出たらどこか失敗している。
マイクに「安田講堂」と喋ると「安田講堂ですね」という応答が得られるはず。
音声認識文法
gram.txt には「やすだこうどう 安田講堂」のように「読み」「表記」をスペース区切りで列挙。
make の中で gram の生成が行われるが、この処理は rakefile.rb に書かれており、 Java 版 Dialog Studio のクラスが呼び出されている。
文法を書き換えたら make してください。
gram.txt の2つの要素の間には半角スペースが必要。
dm.cpp
http://github.com/nishimotz/dmcpp/blob/master/dm.cpp
main() のスレッドで stdin を読んで処理する。
julius_worker と cv_worker と main の3つの関数が マルチスレッドで同時に動く。
構造体 thread_info_t を使ってスレッド間で変数を共有できるので、 これを使って顔検出と音声入力の状態の組み合わせから 対話状態を切り替えたり音声応答をしたりすることができるはず。
音声認識と応答
オウム返しタスク。 output_result() コールバックの中で標準出力に "to @AM-MCL set Speak = %sですね" という文字列を送っている。
INTERIM julius_progout は stderr に出力だけして、現在は使っていない。
julius_worker() は pthread で create & detach されている。
workorder_t, thread_info_t などはスレッド間の情報のやりとりに使う予定。
顔検出
app
どうやって dialogstudio の対話マネージャを入れ替えているか。
app/skel/am.conf.txt
# module:DM commands: <%= am_commands_dm %> module:DM commands: cd <%= File.join($runner_dir, '..') %>; ./dm
拡張子が txt になっているが ERB である。
$runner_dir は app/script/runner で代入されるグローバル変数。
複数インスタンス
julius.conf を下記のように書けば、複数インスタンスの同時入力も動く。
-AM am1 -hlist /usr/local/galatea-engine/SRM/AcousticModel/logicalTri -h /usr/local/galatea-engine/SRM/AcousticModel/hmmdefs,ptm,gid.binhmm -LM lm1 -dfa gram/gram.dfa -v gram/gram.dict -SR search1 am1 lm1 -AM am2 -h /usr/local/dictation-kit-v4.0/model/phone_m/hmmdefs_ptm_gid.binhmm -hlist /usr/local/dictation-kit-v4.0/model/phone_m/logicalTri -LM lm2 -d /usr/local/dictation-kit-v4.0/model/lang_m/web.60k.8-8.bingramv4.gz -v /usr/local/dictation-kit-v4.0/model/lang_m/web.60k.htkdic -SR search2 am2 lm2 -GLOBAL -input alsa -gmm /usr/local/galatea-engine/SRM/AcousticModel/gmmdefs.binhmm -gmmreject "noise,laugh,cough"
このとき -charconv EUC-JP UTF-8 のような文字コード変換オプションは SR の中に書いても、GLOBAL に書いても、うまく動かない。