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 インスタンスにもうちょっと賢いメソッドを追加したら良いのかなあ、などと思案しています。