投稿者: nishimotz

  • SICEワークショップ

    先日、計測自動制御学会の「SICEライフサイエンス(生命,健康,医療,福祉)の現状と連携推進を探る」に参加しました。

    午前中は、ブレインストーミングのような手法でSICE各部会の問題や今後の活動の方向性をまとめる、という場だったので、正直場違いだったかと思ったのですが、「私はSICE会員じゃないですが・・」「じゃあライフサイエンス部門に期待することを書いてください」みたいな感じで参加させていただきました。

    使われたのは「ディズニーが会社を変える」(PHP研究所、2002年)に基づいて説明された「ストーリーボーディング」という手法。参加者全員がカードに自由な記述をして、それをホワイトボードや壁に貼り付けながら議論をしていく、というものでした。

    本当は「どのようなライフサイエンスの研究がされているか」ということがわかるかと思ったのですが、そういう場にはならず、「SICEライフサイエンス関係者の皆様の興味や関心事」のマップが作られました。しかしその過程で、なんとなく現状も透けて見える、という感じの経験になりました。

    いくつか気づいたことを書くと:

    1. WIT(福祉情報工学研究会)と問題意識や現状が似ている。例えば「組織が細分化された結果希薄になった横の連携の再構築が課題」「気持ちよさや負荷など人間の内面の測定に関心がある」「現場のニーズ発掘、医学や臨床の当事者との連携の場を求めている」など。
    2. 企画の立て方や進め方に見習うべき点あり。例えば、このストーリーボーディングの締めくくり方を「次のイベントの企画」「学会誌の特集号のテーマ」など具体的に設定して、ひとつの企画を上手に次の活動につなげておられる。
    3. 人脈と人柄。今回は産総研の小野さんのご尽力とのことでしたが、魅力的な企画に必要なものを改めて痛感しました。

    それから、私がWITの幹事であることを名乗ったので、逆に「WITはどうして年6回も研究会を開催して盛況にできているのですか?」という質問を小野さんから受けました。「当事者の参加(情報保障)に配慮していること」「来ていただくだけでなく、見学会を企画するなど、こちらから出向く努力」を挙げておきました。

    午後は「関連の学協会との連携を探る」というセッションでした。車いすの方もたくさん参加。ロボット、計測、制御といった分野の研究者の方々と、障害の当事者やリハビリ関係者の方々が、「どのような場があればうまく連携できるか」といった議論。私には不勉強だった分野のお話が多く、大変興味深く伺いました。

  • Knoppix と Ubuntu

    Galatea for Linux の動作検証のために、いつも使っている Vine Linux とは違うディストリビューションを使ってみました。

    USB メモリから起動する Knoppix 5.3.1 環境を作ったところ、Let’s Note で 3D が有効になり FSM が 24fps くらいで動作しました。GalateaTalk (gtalk) からのオーディオ出力で若干不都合があったり、ウィンドウマネージャ(compiz fusion)が FSM 関連で怪しかったり、いろいろ不満はありますが、USB メモリで OS ごと持ち歩けるGalatea が現実的になりつつあると感じました。

    Knoppix で動いたので、同じく compiz に対応している Ubuntu Linux 8.04.1 (wubiを使用)で Galatea for Linux の動作検証を行いました。ただし3次元ウィンドウマネージャの動作を確認したら、GNOMEの設定で視覚効果を無効化した方がよいようです(FSM の不具合はこれで解決しました)。

    Thinkpad の内蔵音源がうまく動かなかったですが、ALSA をアップデートするのは面倒だったので、ノートPCの内蔵音源を無効化してUSBオーディオを使ったところ、音声認識・音声合成の動作も良好でした。

    SRM は Julius 4.0.x ベースになり、ALSA がデフォルトになりました。OSS で動かすためには以下の設定追加が必要でした。

    [SRM/srm.init]
    set Input.from = oss
    

    最後にひとこと。Ubuntu には久々に興奮しました。ALSA の不都合が惜しいですが、ディスプレイ出力の切り替えなどノートPCに固有の機能もかなりサポートされており、全体的によくできていると思います。

  • VoiceXMLとRuby on Rails 続編

    3月にVoiceXMLとRuby on Railsという記事を書きましたが、Ruby on Rails 2.0.2 で作り直してみました。

    # routes.rb に追加 -> http://localhost:3000/weather/state1.vxml
    map.connect ':controller/:action.:format'
    
    # 001_create_region.rb
    class CreateRegions < ActiveRecord::Migration
    def self.up
    create_table :regions do |t|
    t.string :name
    t.string :yomi
    t.string :weather
    t.timestamps
    end
    end
    def self.down
    drop_table :regions
    end
    end
    # 002_add_test_data.rb
    class AddTestData < ActiveRecord::Migration
    def self.up
    Region.delete_all
    Region.create :name => '東京', :yomi => 'とうきょう', :weather => '晴れ'
    Region.create :name => '横浜', :yomi => 'よこはま',   :weather => '曇り'
    Region.create :name => '大阪', :yomi => 'おおさか',   :weather => ''
    Region.create :name => '京都', :yomi => 'きょうと',   :weather => '晴れ時々曇り'
    Region.create :name => '広島', :yomi => 'ひろしま',   :weather => '曇りのち雨'
    end
    def self.down
    Region.delete_all
    end
    end
    class Region < ActiveRecord::Base
    end
    
    class WeatherController < ApplicationController
    def state1
    # counter をセッションで記憶する 
    if !session[:counter]
    session[:counter] = 1
    else
    session[:counter] += 1
    end
    @regions = Region.find(:all)
    end
    def state2
    if params[:region]
    @region = params[:region]
    @weather = Region.find_by_name(@region).weather
    end
    end
    end
    
    [state1.vxml.erb]
    <?xml version="1.0" encoding="UTF-8"?>
    <vxml version="2.0" xml:lang="ja">
    <form id='ask'>
    <field name='region'>
    <prompt timeout='20s'>
    <%= session[:counter] %>番です。
    天気を聞きたい地域を、
    <% @regions.each do |item| -%>
    <%=h item.name %><% end -%>
    から選んでください。
    </prompt>
    <grammar version='1.0' root='#region_rule'>
    <rule id='region_rule'>
    <one-of>
    <% @regions.each do |item| %>
    <item> <token sym="<%=h item.yomi %>" slot='region'> <%=h item.name %> </token> </item>
    <% end %>
    <item> <token sym='まいくてすと'>マイクテスト</token> </item>
    </one-of>
    </rule>
    </grammar>
    </field>
    <block>
    <submit next='<%= url_for(:action=>"state2") %>.vxml'/>
    </block>
    </form>
    </vxml>
    [state2.vxml.erb]
    <?xml version="1.0" encoding="UTF-8"?>
    <vxml version="2.0" xml:lang="ja">
    <form id='answer'>
    <block id='answer'>
    <log>地域=<%=h @region %>:天気=<%=h @weather %></log>
    <prompt> <%=h @region %>の天気は<%=h @weather %>です。<break /> </prompt>
    </block>
    <block>
    <goto next='<%= url_for(:action=>"state1") %>.vxml'/>
    </block>
    </form>
    </vxml>
    

    以前は rxml で VoiceXML を生成してみたのですが、やはり vxml.erb の方がすっきりしました。

    そして興味深いことに、同じコントローラーで html.erb も動かすことができそうです。

    [state1.html.erb]
    <html>
    <body>
    <p> <%= session[:counter] %>番です。 </p>
    <% form_tag :action => 'state2' do %>
    天気を聞きたい地域:
    <select name="region">
    <% @regions.each do |item| -%>
    <option value="<%=h item.name %>"><%=h item.name %></option>
    <% end -%>
    </select>
    <%= submit_tag "実行" -%>
    <% end -%>
    </body>
    </html>
    [state2.html.erb]
    <html>
    <body>
    <p> <%=h @region %>の天気は<%=h @weather %>です。</p>
    <%= button_to '戻る', :action => 'state1' %>
    </block>
    </body>
    </html>
    

    これまでISTCのマルチモーダル対話記述ワーキンググループで提案してきたアーキテクチャ階層:

    • 西本 卓也: “マルチモーダル対話システムのためのアーキテクチャ階層化,” FIT2006イベント企画「音声・マルチモーダル対話記述とその標準化」予稿集, Sep 2006. (PDF)

    と対応させてみると、

    • 6層「データモデル」が ActiveRecord
    • 5層「タスク間制御」が Controller のアクション
    • 4層「タスク内制御」以下が View (html.erb または vxml.erb)

    になっており、モダリティごとの View を統一的に記述する方法を見つけることが、4層と3層を分離して記述するためのステップになりそうです。ヘルパーメソッドやパーシャルなどの機能がその部品になるでしょう。また、コントローラーのモダリティ独立性という観点からも RESTful であることが重要だ思います。