タグ: galatea

  • 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 であることが重要だ思います。

  • GalateaTalk と ISTC の今後

    ISTC総会では音声認識、音声合成、顔画像合成の各グループの成果報告と次年度の目標なども伺いました。ISTCは情報処理学会の下で活動してきましたが、現在の計画では2008年度が最終年度となっています。

    私は Galatea Dialog Studio に加えて Linux 版の統合作業を担当していますが、統合作業のほとんどの部分は GalateaTalk の統合作業になっています。

    GalateaTalkは多くの構成要素から成り立っていて、それぞれの構成要素が独立した開発プロジェクトとしての側面を持っています。要素ごとにライセンスや配布許諾などの立場の違いもあります。

    そして各プロジェクトは、それ自身が一つの研究プロジェクトでもあり、研究プロジェクトとしてのミッションで開発方針を決めておられる場合もあります。

    結果的に「各パーツは公開されておりすべて入手可能だが、組み合わせてブラックボックス的に使うとなると手軽ではない」という事態になっているように感じます。

    最近話題になった「島根県CMS」はシステムの一部として GalateaTalk を組み込んでオープンソースプロジェクトとして配布をしておられます。バージョン 1.0.2 のソースを私が確認してみたところ、ある過去の段階での GalateaTalk(信号処理エンジン)とChasen(形態素解析結果の後処理モジュール)に、別途 debian のパッケージとしての chasen, ipadic, kakasi などを組み合わせて使用されていることがわかりました。現在 ISTC が配布している GalateaTalk の最新版とはかなり異なったシステムになっているわけです。

    こういった現状を考えると、ISTC があと1年で活動を終えてしまって、本当に大丈夫なのだろうか、という不安を感じます。

    久しぶりにワインバーグ「コンサルタントの道具箱」をめくっていたら

    • 「鉄道の逆説」サービスがひどいから、サービス向上の要求が拒否される
    • 「鉄道の逆逆説」サービスがよすぎると、評判が聞こえてこないため、提供側がサービスを取りやめることがある

    というのが目に入りました。ISTCのサービスはよすぎるとは決して言えないのですが、ひどいのかと言われると。。。

    ISTCの中にいると「成果がどう受け入れられているのか見えない」と感じる反面、音声認識や音声合成のフリーソフトに対するニーズはそれなりに高いとも感じています。最終年度のISTCでどんなことができるのか、いろいろ考えていきたいと思います。

  • VoiceXMLとRuby on Rails

    先日、音声対話技術コンソーシアム(ISTC)総会で、Galatea Dialog Studioについて御報告をして、表題の件についてこんなデモをお見せしました。

    # voice_controller.rb
    class VoiceController < ApplicationController
    def state1
    # counter をセッションで記憶する 
    if !session[:counter]
    session[:counter] = 1
    else
    session[:counter] += 1
    end
    @regions = {
    '東京' => 'とうきょう',
    '横浜' => 'よこはま',
    '大阪' => 'おおさか',
    '広島' => 'ひろしま',
    '京都' => 'きょうと'
    }
    end
    def state2
    if params[:region]
    @region = NKF.nkf('--utf8', params[:region])
    end
    end
    end
    
    # voice/state1.rxml
    xml.instruct!
    xml.vxml "version" => 2.0, "xml:lang" => "ja" do
    xml.form :id => 'ask' do
    xml.field :name => 'region' do
    xml.prompt :timeout => '20s' do
    xml.text! "#{session[:counter]}番です。"
    xml.text! "天気を聞きたい地域を、"
    @regions.each_key { |k| xml.text! k + "" }
    xml.text! "から選んでください。"
    end
    xml.grammar :version => 1.0, :root => '#region_rule' do
    xml.rule :id => 'region_rule' do
    xml.tag!('one-of') do
    @regions.each_key do |k|
    xml.item do
    xml.token :sym => @regions[k], :slot => "region" do
    xml.text! k
    end
    end
    end
    xml.item do
    xml.token :sym => "まいくてすと" do
    xml.text! "マイクテスト"
    end
    end
    end
    end
    end
    end
    xml.block do
    xml.submit :next => (url_for :action => "state2")
    end
    end
    end
    
    # voice/state2.rxml
    xml.instruct!
    xml.vxml "version" => 2.0, "xml:lang" => "ja" do
    xml.form :id => 'answer' do
    xml.block :id => 'answer' do
    xml.log "地域=#{@region}"
    xml.prompt do
    xml.text! "#{@region}の天気は曇りです。"
    xml.break
    end
    xml.goto :next => (url_for :action => "state1")
    end
    end
    end
    

    VoiceXML処理系とRailsを組み合わせてフルスタックのアプリケーション開発環境を作る提案の最初のステップをお見せしたわけですが、RXML で VoiceXML を書いてみて、すっきりしたようなしないような、ちょっと中途半端な感じです。xml インスタンスにもうちょっと賢いメソッドを追加したら良いのかなあ、などと思案しています。