投稿者: nishimotz

  • 顔モデルのカスタマイズ

    合成音声や顔画像合成のカスタマイズができるのが 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 のようなファイルに統一的な記述を行い、このファイルが存在しない場合は雛形ファイルを生成する、といった処理を導入する計画です。

  • Julius の「デコーダに基づくVAD」

    音声認識エンジン Julius 4.1 に関する記録。

    「デコーダに基づく VAD は,デフォルトでは無効化されており,使用するにはコンパイル時に configure オプションで –enable-decoder-vad を指定し,実行時に -spsegmentを指定する」だそうです。

    $ sudo apt-get install cvs flex libdb-dev
    $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
    $ cd julius4
    $ sh configure  --enable-decoder-vad
    $ make
    

    ということで現在 Galatea Dialog Studio にて評価中です。

  • ERBとインスタンス変数

    Rails の View のようなテンプレートエンジンを ERB 単体で使う例。

    詳しい説明はあちこちで見かけたのですが私が確認したかったポイントに絞ってみました。

    #!/usr/bin/ruby
    require 'erb'
    erb_doc = <<EOS
    hello world 1
    <% 1.upto(3) do |i| -%>
    <%= @hoge %>:<%= i %>
    <% end -%>
    hello world 2
    EOS
    class MyTemplate
    def initialize
    @hoge = 123
    end
    def result(script)
    ERB.new(script, nil, '-').result(binding)
    end
    end
    puts MyTemplate.new.result(erb_doc)
    # hello world 1
    # 123:1
    # 123:2
    # 123:3
    # hello world 2