sourceforge.jp の galatea プロジェクトの wiki サイトに、3月に配付される予定の Galatea Toolkit リリースノートとチュートリアルの草稿を公開しています。
チュートリアルでは Ruby on Rails を使う具体的な例を掲載しました。
sourceforge.jp の galatea プロジェクトの wiki サイトに、3月に配付される予定の Galatea Toolkit リリースノートとチュートリアルの草稿を公開しています。
チュートリアルでは Ruby on Rails を使う具体的な例を掲載しました。
音声対話ツールキット Galatea のプロジェクトに関わり、マルチモーダル対話記述・アーキテクチャの標準化に関わり、Ruby on Rails による VoiceXML アプリケーションの実装について考えた末、「階層化されたシステムの実装は、テンプレートエンジンの階層になる」と思うようになりました。
Webアプリケーションのフレームワークの多くがテンプレートエンジンを提供しています。いくつもの階層でそれぞれに記述の標準化を行っていることのメリットは十分にありますが、記述が冗長になるというデメリットもあります。テンプレートエンジンはこうした問題を解決する一つの手段です。
音声対話技術コンソーシアム(ISTC)では、音声入出力、GUI入出力などを有するインタフェースシステムについて、各階層でのインタラクション記述仕様の標準化について検討を行い、いわゆる Model/View/Controller の構造をさらに詳細化した6階層を提案しています。
私が開発を続けている Galatea Dialog Studio という対話制御エンジンについて考えると、いくつかの階層は Ruby on Rails のMVCフレームワークに対応していると考えられます。また、いわゆる Web アプリケーションをまず実装して、HTML に依存するレイヤーだけを VoiceXML に差し替える、という音声対話システムの実装も、妥当な手法になると思います。
Galatea Toolkit の Linux 版について、インストールや設定の難しさという課題が残っています。当初の設計によって各モジュールを統合することに成功しました。しかし、カスタマイズやデバイス設定が必要な場合に、現時点では、多くの箇所を矛盾なく変更する必要があります。
インタラクション記述ではないものの、各階層を動作させるためには、それぞれ必要なパラメータや設定情報があります。例えば音声合成であれば、言語処理や話者モデルのリストを与える必要があります。音声認識についてはオーディオ入力、音声検出、音響モデルなど数多くのパラメータが存在します。これらの設定を Galatea Toolkit で統合的に扱いたいと考えています。設計していくとこれはやはり「テンプレートの階層」になりそうです。
具体的には、以下のようなアーキテクチャで実装を進めています。
これらをできるだけ Ruby on Rails の作法に馴染むように設計を行っています。
私は Rails に触れる前に、Java で簡易テンプレートエンジンを実装してみたり、PHP や Perl のテンプレートエンジンを使ったりしましたが、インストールが面倒であったり、テンプレートエンジン独自の記述言語を使用していたり、といったところに不満を感じました。
Ruby が ERB というテンプレートエンジンを標準で備えていて、ERB の中で Ruby 言語そのものが使用できる、自作の Ruby スクリプトから簡単に ERB の機能が利用できる、ということに、好感を持っています。
VoiceXML ブラウザと HTML ブラウザは完全に等価な位置づけと見なせない部分がいくつかあります。またモダリティを使い分けるのではなく組み合わせる場合にはさらに考慮が必要となります。どの階層をどのように補っていくべきか、今後システム実装の経験を踏まえた提案をしていきたいと考えています。
合成音声や顔画像合成のカスタマイズができるのが Galatea の特長のひとつなのですが、カスタマイズされたモジュールを連携させて制御するためには、対話統合処理においても設定が必要です。これらの設定を統一的に管理する枠組みは、残された課題のひとつになっています。
昨日から今日にかけて Galatea for Linux (2008年8月版)をお使いの方と以下のやりとりをしました。
質問:
linux/bin/FSM/data/config.txt を下記のように myself を付け加えて、linux/bin/fsm を実行し、
set Mask = myself
と打てば、自前で作成した顔を表示してくれるのですが、
cd linux/bin/DM2 ./galatea tests/vxml/ticket.vxml
にて、
<native>to @FS-MCL set Background = myself bg1</native> <native>to @AM-MCL set Mask = myself HAPPY 100 0 0 0</native>
のように変更すると、
Exception in thread "main" java.lang.NullPointerException at galatea.agent.BehaviorManager._handleSet(BehaviorManager.java:319) at galatea.agent.BehaviorManager._iteration(BehaviorManager.java:425) at galatea.agent.BehaviorManager.run(BehaviorManager.java:453) at galatea.agent.BehaviorManager.main(BehaviorManager.java:531) finalize_CHLD at ./AgentManager-gdm.pl line 455. LOG: AM: finalize() finalize_PIPE at ./AgentManager-gdm.pl line 459. LOG: AM: finalize() print() on closed filehandle GEN7 at /usr/lib/perl5/5.8.6/i386-linux-thread-multi/IO/Handle.pm line 399. print() on closed filehandle GEN12 at /usr/lib/perl5/5.8.6/i386-linux-thread-multi/IO/Handle.pm line 399.
と、落ちてしまいます。
回答:
java.lang.NullPointerException で落ちてしまうのは明らかに不適切なので、実装の不備をお詫びしたいと思います。
また、本件に関連するシステムの実装を以下にご説明します:
まず
to @AM-MCL set Mask = myself HAPPY 100 0 0 0
を解釈しているのは AM-MCL.rb という Ruby スクリプトで、
の do_set_mask メソッドで FS-MCL に set Mask を送ります。
つぎに FS-MCL = BehaviorManager.java についてご説明します。
このモジュールは Galatea FSM の Autonomous 動作の自然性や頭部運動のなめらかさなどを補うために Java で実装されています。
jar ファイルとしては DialogManager クラスと同じですが、AgentManager からは別々の java インタプリタとして実行しています。
このモジュールに与える情報は Java のリソース形式で記述されており、
DM2/skel/gdm.conf
に以下のように記述されています。
# for BehaviorManager Behavior.DefaultAgent :woman01 Behavior.NumAgent :3 Behavior.Agent.1 :woman01 woman01 female01 bg03 1.2 Behavior.Agent.2 :man01 man01 male01 bg01 1.2 Behavior.Agent.3 :man02 man02 m001 bg02 1.6
引数の内容は Agent クラスのコンストラクタの引数に対応しています:
String mask, String speaker, String bg, double scale
= FSM の顔モデル名、SSM の音声話者モデル名、FSM の背景名、FSM の顔の大きさの正規化パラメータ
例えば Behavior.NumAgent : 4 にして、
Behavior.Agent.4 :myself myself myvoice bg01 1.0
のように追加記述していただくと、FS-MCL に新しいエージェントモデルを教えることができます。
FSM の config にモデルを追加する必要がありますが、これについては、DM2/skel の中にある雛形ファイル
を変更してください。これを実行時に ~/.galatea にコピーして使います。
あわせて DM2/Modules/AM-MCL.rb に、myself の追加が必要です。(この部分はスクリプトにハードコーディングされているので改善が必要です)
@agents["man01"] = Agent.new('man01', 'male01') @agents["man02"] = Agent.new('man02', 'm001') @agents["woman01"] = Agent.new('woman01', 'female01') @agents["myself"] = Agent.new('myself', 'male01')
なお、skel/gdm.conf は次期バージョンでは Ruby のテンプレートエンジン ERB を用いて
のように変更する予定です。
また、上記のカスタマイズに関してもシステム全体の入口である “galatea” スクリプトにて、各モジュールのコンフィグレーションを一元的に記述できるようにしたいと考えております。
具体的には ~/.galatea/config.yml のようなファイルに統一的な記述を行い、このファイルが存在しない場合は雛形ファイルを生成する、といった処理を導入する計画です。