YAML+ERB

前回の続きで、ERB に埋め込む情報を YAML で記述する実験。

# config.yml
books:
-
title: あいうえお
author: かきくけこ
price: 400
-
title: さしすせそ
author: たちつてと
price: 800
#!/usr/bin/ruby -Ku
require 'erb'
require 'yaml'
erb_doc = <<EOS
hello world 1
<% config['books'].each_with_index do |i,n| -%>
[<%= n %>] title:<%= i['title'] %> / author:<%= i['author'] %>
<% end -%>
hello world 2
EOS
class MyTemplate
def initialize
@config = YAML.load(File.new('config.yml'))
end
def config
@config
end
def result(script)
ERB.new(script, nil, '-').result(binding)
end
end
puts MyTemplate.new.result(erb_doc)
# hello world 1
# [0] title:あいうえお / author:かきくけこ
# [1] title:さしすせそ / author:たちつてと
# hello world 2

顔モデルのカスタマイズ

合成音声や顔画像合成のカスタマイズができるのが 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

オープンソースソフトウェアとWebアクセシビリティ

上記に関連して、次回WIT研究会/HI学会研究会の企画として、ITRC UAI(Universal Access to the Internet)研究会と共催の特別企画を行います。

  • テーマ:オープンソースソフトウェアとWebアクセシビリティ
  • 共催:ITRC UAI(Universal Access to the Internet・高齢者と障害者のインターネット利用)研究会
  • 司会:西本卓也(東京大学・WIT企画幹事)
  • 特別企画の日時:2008年12月4日(木) 15:15~17:15
  • 会場:産総研臨海副都心センター別館バイオ・IT融合研究棟11階会議室

登壇者(敬称略):

  • 渡辺隆行(東京女子大学・UAI研究会 主査)
  • 中村精親・辻勝利(ミツエーリンクス)
  • 西本卓也(東京大学)
  • 福田健太郎 (日本IBM)

概要:World Wide Webはユニバーサルなメディアとして設計されており、例えば視覚障害者は合成音声によってWebを利用することができるが、現実には高齢者や障害者にとって使いにくいWebサイトがたくさんある。そこでWebコンテンツのアクセシビリティに関する標準化活動が行われており、海外では W3C WCAG 2.0 の策定が完了間近になっており、これを受けて日本でも JIS X 8341-3 の改訂作業が進められている。 Webアクセシビリティの新たな標準が受け入れられるために必要なのは、 Webコンテンツの新しい標準技術を生かすことができる支援技術である。

本特別企画はまずWebアクセシビリティ標準化活動の現状を概説し、続いてWebアクセシビリティを実現する高性能なツールになりうる以下のオープンソースソフトウェアを実演を交えて紹介する。

  • スクリーンリーダー NVDA 日本語化プロジェクト
  • 音声対話ツールキット Galatea プロジェクト
  • アクセシビリティソフトウェア基盤 Eclipse Accessibility Tools Framework (ACTF)

最後にパネルディスカッションを行い、Webアクセシビリティ関連のオープンソースプロジェクトの展望や今後の課題について議論したい。支援技術ユーザ、研究者、ソフトウェア開発者など幅広い聴衆の参加を期待する。

音声インタフェースとWebアクセシビリティ

先日、下記の発表をしました。

この予稿の中で紹介した「インタフェースの原則」は、私の研究の中核になる概念です。今回これを吟味していて、

  • III 頑健性に関する原則
    • c. 探索可能性の原則 : あるコマンド操作とその実行結果の対応付けを容易に学習できるために、あらゆる操作は可能なかぎり取り消し可能とする。

という項目の追加が必要だと思えてきました。

これまでWebアクセシビリティにおいて undo 機能の重要性を確認する実験を行ってきました。現在は Ruby on Rails による VoiceXML アプリケーションフレームワークと Galatea Dialog Studio の実装に、どのように undo の機能を組み込むかを検討しています。

Ubuntu Linux 8.10 + freeglut3 + FreeType2

GLUT で日本語を表示するのは面倒だと思っていましたが、意外に簡単でした。

とはいえ、例によって単純なコピーペーストでは成功しなかったので、メモしておきます。

// main.cpp
// encoding : UTF-8
//
// sudo apt-get install libftgl-dev freeglut3-dev
// g++ -g -I/usr/include/freetype2 -lglut -lftgl main.cpp
//
#include <GL/glut.h>
#include <FTGL/ftgl.h>
#define FONT "/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf"
FTFont *font;
void display(void)
{
glClearColor(0.0, 0.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1.0, 1.0, 1.0, 1.0);
FTPoint point(-1, 0, 0);
font->Render("日本", -1, point);
glFlush();
}
int main(int argc, char *argv[])
{
font = new FTGLPolygonFont(FONT);
if (font->Error()) exit(1);
font->FaceSize(0);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

Ubuntu Linux 8.10 + Lenovo ThinkPad X300

トラックポイントを青ボタンと同時に押したときにスクロールする設定。

$ sudo gedit /etc/X11/xorg.conf
Section "ServerFlags"
Option "AutoAddDevices" "false"
EndSection
Section "InputDevice"
Identifier	"Configured Mouse"
Driver		"mouse"
Option		"CorePointer"
Option    	"Emulate3Buttons"     	"false"
Option          "EmulateWheel" 		"true"
Option          "EmulateWheelTimeOut" 	"200"
Option          "EmulateWheelButton" 	"2"
Option          "XAxisMapping"        	"6 7"
Option          "YAxisMapping"        	"4 5"
Option          "ZAxisMapping"        	"4 5"
EndSection

参考リンク:

Windows Eclipse CVS sourceforge.jp

Windows XP で Eclipse 3.4.1 の CVS クライアントを使って sourceforge.jp のアカウントで作業を。。

anonymous ではなく sourceforge.jp のアカウントで commit ができるための設定をしました。

最初に試したのは

でしたが Windows ではうまくいかなかったので再度調査。

をすこし手直ししたら成功しました。

  • 以下 PC のアカウントは nishi で SF.jp のアカウントは nishimoto という想定。

まず Windows XP のコントロールパネル「システム」で環境変数の設定。

HOME=c:/cygwin/home/nishi
CVSROOT=nishimoto@sourceforge.jp:/cvsroot/galatea
CVS_RSH=ssh
[cygwin]
$ cd
$ ssh-keygen
/home/nishi/.ssh/identity
$ notepad .ssh/idendity.pub

これを sourceforge.jp の Account Maitainance で CVS/SVN/SSH Shared Authorized Keys に追加。

環境変数が反映されるように新しい cygwin コンソールで確認します。

$ ssh -l nishimoto cvs.sourceforge.jp
(omitted)
You cannot execute anything here.
Connection to cvs.sourceforge.jp closed.
$ ssh -l nishimoto shell.sourceforge.jp
Last login: Sat Nov  1 14:38:37 2008 from xxxxxxxxxxxxxxxxxxxx
nishimoto@sf-usr-shell:~$ ls
galatea
nishimoto@sf-usr-shell:~$ logout
Connection to shell.sourceforge.jp closed.

環境変数が反映されるように Eclipse を新たに起動します。

  • Window – Prefefence – Team – CVS – Ext connection method
    • CVS_RSH : c:\cygwin\bin\ssh.exe
    • Parameter : -l {user} {host}
    • SSH2 (General – Network Connections – SSH2)
      • SSH2 home: C:\cygwin\home\nishi\.ssh
      • Private Keys: C:\cygwin\home\nishi\.ssh\identity
  • New – Project – Project from CVS – New repository location
Host: cvs.sourceforge.jp
Repo Path: /cvsroot/galatea
User: nishimoto
Pass: (empty)
Conn.Type: extssh

repository の中身が見えたので成功。

上記リンクと少し違う手順が必要でしたが、参考になりました。感謝。