ユーザ用ツール

サイト用ツール


project:dmcpp

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 で配付しているパッケージ

西本による勝手ビルド

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 などはスレッド間の情報のやりとりに使う予定。

顔検出

opencv の顔検出を組み合わせてみた。

新たなworkerスレッド cv_worker() 関数にて顔検出のループを回している。

対話制御に反映させるのはこれから。

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 に書いても、うまく動かない。

project/dmcpp.txt · 最終更新: 2010/07/07 07:26 (外部編集)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki