投稿者: nishimotz

  • 音音研の御報告

    1月19日の音音研では、参加者7人にお集まりいただきました。

    • 橋田朋子さん(東京大学IML(インテリジェント・モデリング・ラボラトリ)特任研究員)

    実演を交えて大変興味深いお話を伺うことができました。

    最近、ヒューマンインタフェースの設計における基礎研究の重要性について考えているのですが、まさにそういう内容だったなあと思います。

    ゲームの難易度に関するデザインがフロー理論的に優れている、と言いましたが、フロー理論のことは私が最近ブログに書いたばかりでした:

    資料を公開しておられます:

    なお、参加してくださった榊原さまから以下のお知らせをいただきました:

    私は、主に絶対音感を習得させる訓練を実践し、その習得プロセスを研究テーマとしております。家業が音楽教室でして、気楽な2代目をしながら、時々、非常勤で教えている身分です。

    (1月25日(日)、テレビ朝日系「ジキルとハイド」という番組の中で、ちょっとだけだと思いますが、私が実践している訓練が紹介されますので、もしご興味とお時間があれば、ご覧ください。)

    あつかましい願いですが、いつかそんな話を発表させていただいて、皆様のご意見をいただいてみたいなあと夢想しております。

    2月と3月は休会とさせていただき、4月以降に榊原さまの講演も計画しております。

    今後もよろしくお願いします。

  • 聴覚と福祉情報工学

    第46回(平成20年度第5回)福祉情報工学研究会のご案内です。

    • 日時:2009年2月20日(金)~21日(土)
    • 共催: 聴覚研究会(日本音響学会)
    • 会場:愛媛大学(城北地区)教育学部四号館4階総合授業研究室
    • 手話通訳、PC要約筆記を実施予定
    • 詳細:http://www.ieice.org/~wit/
    • 企画(2月20日16:30~18:30)
      • 「最近のデジタル補聴器の技術と実際(仮題)」
      • 「通訳者支援システム「イズ」による情報保障支援の可能性」

    昨夜は下記の企画についての打ち合わせでした。

    • 企画:通訳者支援システム「イズ」による情報保障支援の可能性
    • 講演:渡辺美知子先生(東京大学)
    • 実演:(株)ストレートワード様・(株)パワーシフト様
    • 概要:通訳は聞きながら喋るという作業であり高い認知的負荷が生じる。これは手話通訳などの情報保障においても同様と考えられる。特に通訳作業におけるこのような認知的負荷を軽減するために、(株)ストレートワード、(株)パワーシフト、東京大学の共同で通訳者支援システム「イズ」が開発され、これまでに日本語・英語などの同時通訳・逐次通訳におけるパフォーマンス向上とコスト削減の効果が確認されており、語学学習、講演聴講支援など多様な応用も期待されている。本企画ではこのシステム「イズ」を紹介していただき、特に手話通訳や要約筆記など情報保障への応用について議論する。
    • 関連URL:

    福祉情報工学研究会では以前から学会等での情報保障を普及させるための活動に取り組んでいます。しかし特に手話通訳やPC要約筆記には費用がかかり、電子情報通信学会からの支援がなければ継続できない状況です。新しい技術を取り入れることで、情報保障をもっと実践しやすいものにできないか、と考えております。

    今回は、情報保障の現状や問題を再確認すること、「イズ」について理解していただくことが目的です。今後、情報保障の新しい方法を模索していくための第一歩になれば、と考えております。皆様のご参加をお待ちしております。

  • 第59回音声・音楽研究会のお知らせ

    2009年1月19日(月曜日)18:40- 東京大学(本郷)工学部6号館

    • 橋田朋子さん(東京大学IML(インテリジェント・モデリング・ラボラトリ)特任研究員)のお話を伺います。
    • タイトル 「リミックスの知覚・動作過程における音楽経験の影響」
    • 要旨: リミックスと呼ばれる音楽断片をタイミングよく繋ぎ合わせることで音楽を作り上げる表現は,音楽熟達度によらず楽しめる新しい即興的音楽表現の形として近年非常に注目されています。心理学的観点からは詳しい検討は殆ど行なわれていないのですが,リミックスは(1)音楽断片を聞いて拍の累積時間間隔を推定するという心的予測過程と(2)予測したタイミングで動作を遂行するという動作遂行過程,という知覚と動作の2過程が同等に要求される非常に興味深い表現の形です。そこで音楽経験はリミックスに本当に影響を及ぼさないのか,もし及ぼす場合にはどちらの過程に起因するのか,を明らかにする実験を行ないました。本発表では,この実験の詳細とそこで得られた知見をいかした即興的音楽表現支援システム”TempoPrimo”の簡単な説明・実演を行ないます。

    お気軽にご参加ください。

  • Python vs Ruby

    「Python チュートリアル」という本を読み、同じことを Ruby でやったら、と思って書きかけたエントリを、この日記に刺激されて、第3章「気楽な入門編」の部分だけ、とりあえず公開することにしました:

    • ruby 1.8 / python 2.6 で確認。

    電卓として使う

    Python

    $ python
    >>> 2+2
    4
    

    Ruby

    $ irb
    irb(main):001:0> 2+2
    => 4
    
    • 以下、irb のプロンプトは略記

    複素数

    Python

    >>> a=1.5+0.5j
    >>> a.real
    1.5
    >>> a.imag
    0.5
    >>> abs(a)
    1.58113...
    
    • a.abs とはできない(’complex’ object has no attribute ‘abs’)

    Ruby

    > require 'complex'
    > a = Complex(1.5, 0.5)
    > a.real
    => 1.5
    > a.imag
    => 0.5
    > a.abs
    => 1.58113...
    
    • abs は Python ではビルトイン関数だが Ruby では Complex オブジェクトのメソッド

    文字列

    Python

    >>> '\"Yes,\" he said.'
    '"Yes," he said.'
    >>> '"Isn\'t," she said.'
    '"Isn\'t," she said.'
    >>> "'Isn\'t,' she said."
    "'Isn't,' she said."
    
    • \ は常にエスケープ記号。
    • ‘ ‘の場合は’ ‘で表示され、” “の場合は” “で表示される。内部的な区別あり?

    Ruby

    > '\"Yes,\" he said.'
    => "\\\"Yes,\\\" he said."
    > '"Isn\'t," she said.'
    => "\"Isn't,\" she said."
    > "'Isn\'t,' she said."
    => "'Isn't,' she said."
    
    • \ は “” の場合のみエスケープ記号。
    • 常に “” で表示される。内部的な区別がない?

    Python

    >>> hello = "multi-line string\n\
     ... second line\n\
     ...     third line with indent"
    >>> print hello
    multi-line string
    second line
    third line with indent
    >>>
    

    Ruby

    > hello = "multi-line string
     " second line
    "     third line with indent"
    => "multi-line string\nsecond line\n    third line with indent"
    > puts hello
    multi-line string
    second line
    third line with indent
    => nil
    >
    
    • irb ではコンテクストに応じてプロンプトが変わる

    Python

    >>> print """line 1
     ... line 2
     ... """
    line 1
    line 2
    >>>
    

    Ruby

    > puts """line 1
     " line 2
    " """
    line 1
    line 2
    => nil
    
    • トリプルクオートは Ruby でも使える(ように見える)
    • 最後の改行の扱いが Python と Ruby で異なる
    • puts は返り値 nil を返す

    Ruby

    > puts <<EOS
     " line 1
     " line 2
     " EOS
     line 1
     line 2
     => nil
    
    • 念のためにヒアドキュメントも実験。最初の行の直前の改行の扱いがトリプルクオートと異なる。

    文字列の結合

    Python

    >>> word = 'a' + 'b'
    >>> word
    'ab'
    >>>
    

    Ruby

    > word = 'a' + 'b'
    => "ab"
    > word
    => "ab"
    >
    

    Python

    >>> 'str' 'ing'
    'string'
    >>>
    

    Ruby

    > 'str' 'ing'
    => "string"
    >
    
    • 隣接する2つの文字列リテラルは Ruby でも自動的に連結される

    文字列のインデックス付け

    Python

    >>> 'abcdefg'[4]
    'e'
    
    • Python にはキャラクタ型は存在せず、1文字のキャラクタは長さ1の文字列。

    Ruby

    > 'abcdefg'[4]
    => 101
    
    • Ruby の文字列は文字コード列であることを意識しなくてはならない。C 言語に似ているとも言えるが、うっかり文字列が得られると思いこみがち。
    • Python における ‘abcdefg'[4] と同じようにインデックス4の文字から成る新たな文字列を得るには。。
    • self[nth,len] : nthバイト番目から長さlenバイトの部分文字列を作成
    > 'abcdefg'[4, 1]
    => "e"
    
    • self[first..last] : インデックス first から last までのバイトを含む文字列を作成
    > 'abcdefg'[4..4]
    => "e"
    
    • self[first…last] : 文字列先頭を0番目の隙間として、fist 番目の隙間から last 番目の隙間までに含まれるバイト列を含んだ新しい文字列
    > 'abcdefg'[4...5]
    => "e"
    

    文字列のスライス

    Python

    >>> 'abcdefg'[0:2]
    'ab'
    >>> 'abcdefg'[1:3]
    'bc'
    >>> 'abcdefg'[:3]
    'abc'
    >>> 'abcdefg'[3:]
    'defg'
    

    Ruby

    > 'abcdefg'[0...2]
    => "ab"
    > 'abcdefg'[1...3]
    => "bc"
    > 'abcdefg'[0...3]
    => "abc"
    > 'abcdefg'[3...-1]
    => "def"
    > 'abcdefg'[3...0]
    => ""
    > 'abcdefg'[3..-1]
    => "defg"
    
    • Python における : でのスライスは Ruby では … とほぼ同じ。
    • ただし Python における [3:] は Ruby では [3..-1] となる。
    • Ruby では .. / … は Range というオブジェクトである。.. 演算子で生成されれば終端を含む。… 演算子で生成されれば終端を含まない。

    インデックスにおける負の数

    Python

    >>> 'abcdefg'[-1]
    'g'
    >>> 'abcdefg'[-2]
    'f'
    >>> 'abcdefg'[-2:]
    'fg'
    >>> 'abcdefg'[:-2]
    'abcde'
    

    Ruby

    > 'abcdefg'[-1]
    => 103
    > 'abcdefg'[-1,1]
    => "g"
    > 'abcdefg'[-2,1]
    => "f"
    > 'abcdefg'[-2..-1]
    => "fg"
    > 'abcdefg'[0..-2]
    => "abcdef"
    > 'abcdefg'[0...-2]
    => "abcde"
    

    文字列の長さ

    Python

    >>> len('abcdefg')
    7
    >>> 'abcdefg'.len
    AttributeError: 'str' object has no attribute 'len'
    
    • Python ではビルトイン関数 len を使う

    Ruby

    > 'abcdefg'.length
    => 7
    > 'abcdefg'.len
    NoMethodError: undefined method `len' for "abcdefg":String
    > length('abcdefg')
    NoMethodError: undefined method `length' for main:Object
    
    • Ruby では String オブジェクトのメソッド length を使う

    マルチバイト文字列

    • UTF-8 でソースを記述して、Python 2.6 / Ruby 1.8.6 の Win32 版で実行。

    Python

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    print u'あいうえお'
    print u'あいうえお'[2]
    print len(u'あいうえお')
    
    C:\>python mbstring.py
    あいうえお
    う
    5
    

    Ruby

    puts 'あいうえお'
    puts 'あいうえお'[2]
    puts 'あいうえお'.length
    
    縺ゅ>縺・∴縺
    130
    15
    
    • 望ましい挙動を実現する例(1)
    #!/usr/bin/env ruby -Ku
    # -*- coding: utf-8 -*-
    require 'iconv'
    class String
    def to_sjis
    Iconv.conv('shift-jis', 'utf-8', self)
    end
    def chars
    self.split(//)
    end
    end
    puts 'あいうえお'.to_sjis
    puts 'あいうえお'.chars[2].to_sjis
    puts 'あいうえお'.chars.length
    
    C:\>ruby mbstring.rb
    あいうえお
    う
    5
    
    • 望ましい挙動を実現する例(2)
    #!/usr/bin/env ruby -Ku
    # -*- coding: utf-8 -*-
    require 'iconv'
    class String
    def chars
    self.split(//)
    end
    end
    module Kernel
    alias_method :orig_puts, :puts
    def puts(s)
    orig_puts Iconv.conv('shift-jis', 'utf-8', s.to_s)
    end
    end
    puts 'あいうえお'
    puts 'あいうえお'.chars[2]
    puts 'あいうえお'.chars.length
    
    C:\>ruby mbstring.rb
    あいうえお
    う
    5
    

    リスト

    Python

    C:\>python
    >>> a = ['ab', 'cd', 123, 45]
    >>> a
    ['ab', 'cd', 123, 45]
    

    Ruby

    C:\>irb
    > a = ['ab', 'cd', 123, 45]
    => ["ab", "cd", 123, 45]
    

    個別の要素の操作

    Python

    >>> a[2] = a[2] + 23
    >>> a
    ['ab', 'cd', 146, 45]
    >>> a[2] += 23
    >>> a
    ['ab', 'cd', 169, 45]
    

    Ruby

    > a = ['ab', 'cd', 123, 45]
    => ["ab", "cd", 123, 45]
    > a[2] += 23
    => 146
    > a
    => ["ab", "cd", 146, 45]
    > a[2] = a[2] + 23
    => 169
    > a
    => ["ab", "cd", 169, 45]
    

    要素の置換と挿入

    Python

    >>> a
    ['ab', 'cd', 169, 45]
    >>> a[0:2] = [111,222]
    >>> a
    [111, 222, 169, 45]
    >>> a[1:1] = ['ab', 'cd']
    >>> a
    [111, 'ab', 'cd', 222, 169, 45]
    

    Ruby

    > a
    => ["ab", "cd", 169, 45]
    > a[0...2] = [111,222]
    => [111, 222]
    > a
    => [111, 222, 169, 45]
    > a[1...1] = ['ab', 'cd']
    => ["ab", "cd"]
    > a
    => [111, "ab", "cd", 222, 169, 45]
    
    • 文字列と同じく : は … に置き換えられる

    リストの入れ子

    Python

    >>> q = [2,3]
    >>> p = [1,q,4]
    >>> p
    [1, [2, 3], 4]
    

    Ruby

    > q = [2,3]
    => [2, 3]
    > p = [1,q,4]
    => [1, [2, 3], 4]
    
    • ここまでは全く同じ

    Python

    >>> p
    [1, [2, 3], 4]
    >>> len(p)
    3
    >>> p[1].append('xtra')
    >>> p
    [1, [2, 3, 'xtra'], 4]
    

    Ruby

    > p
    => [1, [2, 3], 4]
    > p.length
    => 3
    > p[1].append('xtra')
    NoMethodError: undefined method `append' for [2, 3]:Array
    > p[1] << 'xtra'
    => [2, 3, "xtra"]
    > p
    => [1, [2, 3, "xtra"], 4]
    > p[1].push 'xtra'
    => [2, 3, "xtra", "xtra"]
    > p
    => [1, [2, 3, "xtra", "xtra"], 4]
    
    • Python のビルトイン関数 len は Ruby では length メソッド
    • Python の append メソッドは Ruby では << または push メソッド

    プログラミングの基礎

    Python

    >>> a, b = 0, 1
    >>> while b < 10:
    ...   print b
    ...   a, b = b, a+b
    ...
    1
    1
    2
    3
    5
    8
    >>>
    

    Ruby

    > a, b = 0, 1
    => [0, 1]
    > while b < 10 do
    *   puts b
    >   a, b = b, a+b
    > end
    1
    1
    2
    3
    5
    8
    => nil
    >
    
    • Python はブロックをインデントで表現する
    • Ruby はブロックを do end で表現する
    • Python の print は Ruby では puts

    Python

    >>> a, b = 0, 1
    >>> while b < 1000:
    ...   print b,
    ...   a, b = b, a+b
    ...
    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
    >>>
    

    Ruby

    irb(main):035:0> a, b = 0, 1
    => [0, 1]
    irb(main):036:0> while b < 1000 do
    irb(main):037:1*   print b
    irb(main):038:1>   a, b = b, a+b
    irb(main):039:1> end
    1123581321345589144233377610987=> nil
    irb(main):040:0>
    irb(main):050:0> a, b = 0, 1
    => [0, 1]
    irb(main):051:0> while b < 1000 do
    irb(main):052:1*   print "#{b} "
    irb(main):053:1>   a, b = b, a+b
    irb(main):054:1> end
    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 => nil
    irb(main):055:0>
    
    • Python の “print ,” のような自動空白挿入は Ruby の print では行われない
  • 賀正

    2009年もよろしくお願いします。

    2008年に私は福祉情報工学研究会の幹事としてあちこちで研究会を開催して、通常の講演発表セッションだけでなく、見学会や企画を積極的に行うように努めました。いろいろな方にお世話になりました。感謝しております。

    1月は松江オープンソースラボにて「プロジェクトゆうあい」の三輪様をはじめ皆様のお話を伺い、たくさんの研究開発事例を拝見しました。「島根県CMS」開発の背景を理解でき、島根大学でまつもとゆきひろさんのお話を伺うこともできました。思えばあれからずっと Ruby on Rails の勉強ばかりしていた1年だったような気がします。。

    5月の神戸では、研究会翌日に神戸アイライト協会さんを見学させていただきました。私が京都で視覚障害者のパソコン教室のことを知った1999年のころから、何が変わって、何が変わっていないのか、再認識する機会になりました。阪神大震災から復興した賑やかな街並みを見る目も大いに変わりました。

    7月の新潟では「地域連携による汎用コミュニケーションエイドの研究開発と知的障がい児・発達障がい児の教育支援」というシンポジウムを開催しました。プロジェクトを成功させるためにお金よりも技術よりもコラボレーションが大切、ということが納得でき、新鮮な発見がありました。

    10月の所沢では国立障害者リハビリテーションセンターの見学会、パネル討論「障害当事者によるニーズ紹介」を行いました。これらも「現場と当事者」を重視した企画であったと思います。

    12月の東京では特別企画「オープンソースソフトウェアとWebアクセシビリティ」(共催:ITRC UAI研究会)をさせていただきました。ソフトウェア開発の当事者としての自分の目標を再認識させられました。

    研究のまとめ、個人的な活動、などの多くを2009年に持ち越してしまいました。この年末年始の時間を有効に使って頑張りたいと思います。

  • フロー理論

    フロー体験入門―楽しみと創造の心理学
    M.チクセントミハイ
    世界思想社
    売り上げランキング: 27373

    「フロー体験入門―楽しみと創造の心理学」

    天外伺朗氏の著作でチクセントミハイのフロー理論について語られていることを知り、意外なような、納得できるような気がしました。

    (さらに…)

  • インターネットと音声合成

    音声技術とバリアフリーに関する特集の一記事として電子情報通信学会誌に千葉大学の西田先生と共同で執筆した

    • 西本卓也, 西田昌史: “インターネットと音声合成,” 電子情報通信学会誌, Vol.91, No.12, pp.1030-1035, Dec 2008.

    が発行されました。執筆したのは6月末だったのですが、ページ数がオーバーして大幅にカットせざるを得なかった部分をここでご披露します。。

    インターネットにおける音声合成技術

    インターネットにおける音声合成技術はバリアフリーに限らずさまざまな用途で注目されている.

    例えば,近年のCGM(Consumer Generated Media)ブームと共に,インターネットの動画投稿サイトで歌声音声合成を使った作品が広く知られるようになった.

    また,入力された歌詞から自動作曲して合成音声で歌うシステムも公開されている.

    また,文字で情報を読むよりも,朗読された音声で情報を得る方がわかりやすく誤解しにくい,という動機から,最近,ネットリサーチ(インターネットを利用した市場調査)において音声合成を用いたサービスが登場している.質問項目を音声合成で提示することにより,回答者による設問の読み間違いや,設問をよく読まずに回答されることを防ぎ,精度の高い調査が実施できるという.

    このようにインターネットにおいて存在感を増しつつあるテキスト合成音声の技術であるが,視覚障害者は,インターネットが普及する前からの,この技術のアーリーアダプター(先見性のある利用者)だった.

    ウェブサイトが提供する音声合成機能

    特定のウェブサイトに限定すれば,ウェブサイトが音声合成機能を提供することも有効である.

    例えば

    などのインターネット閲覧支援ツールは,ウェブサイトが提供する音声合成エンジンをユーザのPCにインストールさせ,ユーザのPCで音声合成を行わせるものである.ユーザに強いる負担は軽減されるが,これらのサービスでは対象となるOSやブラウザが制限されてしまう.

    島根県のウェブサイトで使われているCMS (Content Management System)には,テキスト情報として提供されるコンテンツを音声化し,ストリーミング音声として配信する機能がある.

    (株)ネットワーク応用通信研究所が開発したこの「島根県CMS」は,Ruby on Rails で実装され,フリーの音声合成エンジン GalateaTalk が使用されている.最近ソースコードが公開されたことでも話題を呼んでいる.

    また,JavaScriptを用いて任意のウェブページに音声合成機能を埋め込む「Web音声配信システム(VDS)」が(株)ナレッジクリエーションによって公開されている.VDSのサーバで音声合成が行われ,ユーザ側でもウェブサイト側でも音声合成エンジンを必要としない.いわゆる Web 2.0 的な技術として今後の展開が期待される.

    会誌に掲載された内容

    ここで紹介しなかった内容のうち、視覚障害者のPC利用の実情、音声によるインターネット利用、視覚障害者用タイピング練習ソフト、早口音声合成の利用、学習効果と心的負荷、などのトピックは会誌記事に無事掲載されています。また、Webページ閲覧、仮名漢字変換に関する西田先生の記事もあります。最後に NVDA 日本語版プロジェクトの活動にも触れました。

  • オープンソースと動機付け

    特別企画「オープンソースソフトウェアとWebアクセシビリティ」は、終了時間が大幅に遅くなって皆様にご迷惑をお掛けしましたが、私はとても楽しく進行を務めました。そして、改めていろいろ考えさせられました。

    いくつか感じたことを挙げると:

    • Free の「自由」と「無料」はどちらも重要
    • オープンであるだけでは不十分。適切に設計・部品化されていること、汎用性があることが必要。
    • 日本のコミュニティが「日本語化」だけにとどまらず国際的に貢献することが重要。

    参加者からの印象的な発言を挙げると:

    • 企業でOSS・サポート体制のないソフトウェアを使うことへの抵抗は依然としてある。
    • オープンソースコミュニティが高齢化している。大学生への教育が重要。
    • ユーザが目的にあったソフトを簡単に選べるための情報提供が重要。
    • オープンソースプロジェクトに参加できるためには自由な身分や時間が必要。貢献への動機付けが必要。作ることを面白い・かっこよいと思えるか?
    • API資料などを英語で調べることの壁がある。
    • オープンソース参加によって個人情報を不用意に公開してしまう危険はないのか?
    • 学生の立場から言えば、セットアップが難しいソフトは敬遠したくなる。ちゃんと教えてもらえるなら、関心を持てる。
    • 「emacs にあこがれるか否か」が「オープンソース文化への親しみ」の境界線では?
    • Linux カーネルや Eclipse のような「重要なプロジェクト」は、慎重にリリースされ履歴がきちんと管理されるべき。そうでない自由なプロジェクトもたくさん存在してよい。
    • 広く使ってもらうためには大きなコミュニティが必要。橋渡しになる解説者が必要。
    • 代替手段を手に入れにくいソフトウェアには成功のチャンスがある。NVDA はその一例になりうる。

    音声合成については GalateaTalk の Windows 版を(NVDAの開発プラットフォームである)Python から制御するデモをお見せしました。Galatea for Linux による音声対話システムのデモをする時間はなくなったので、これはまたの機会に。。
    Eclipse Accessibility Tools Framework の紹介は個人的に非常に興味深かったです。

    サイトは英語の情報ばかりですが、日本アイ・ビー・エムの研究成果がベースで、日本語の情報を精力的に整備中であり、日本からの利用・参加を呼びかけていきたい、とのことです。
    また、NVDA日本語版は、この企画に合わせて新しいバージョンがリリースされました。

    国際的に協調しつつ行われているWebアクセシビリティ標準化ですが、日本ではスクリーンリーダなどの支援技術の進歩が遅れています。この問題に積極的に関心をお持ちいただければ幸いです。
    そして、ソフトウェア開発でアテンションを集めることを「かっこよい」と思える世の中であって欲しい、と個人的には思っています。

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