7月31日から8月3日まで京都大学で「音声認識・音声対話技術講習会」があり、私は最終日で「ISTCソフトウェア紹介」というテーマの時間をいただき、ソフトウェアの実演をしました。
私がGalatea Projectで開発を担当しているGalatea Toolkit Linux版の紹介をしました。主に VoiceXML による対話シナリオ記述について御説明して、まだ正式対応ではありませんが Windows 環境で VoiceXML のシナリオを実行してデモを行いました。
実演で御紹介したソースコードをいくつかお見せします。
以下は PHP で動的にVoiceXMLを生成する例です。
<?php echo '<?xml version="1.0" encoding="utf-8"?>' ."\n" ?> <?php mb_http_output('utf-8') ?> <vxml version="2.0" xml:lang="ja"> <?php if(isset($_REQUEST['region']) && $_REQUEST['region'] != '') { $region = $_REQUEST['region']; mb_convert_variables("UTF-8", mb_detect_encoding($region), $region); ?> <form id="answer"> <block> <log>地域:<?php echo $region ?>,今日:晴れ,明日:曇り</log> <prompt> 天気予報です。 <?php echo $region ?>の、 今日の天気は晴れです。 明日は曇りです。 <break/> </prompt> <goto next="#ask"/> </block> </form> <?php } ?> <form id="ask"> <field name="region"> <prompt timeout="20s"> 天気を聞きたい地域を、東京、横浜、京都から選んでください。 </prompt> <grammar version="1.0" root="#region_rule"> <rule id="region_rule"> <one-of> <item> <token sym="まいくてすと">マイクテスト</token> </item> <item> <token sym="とうきょう" slot="region">東京</token> </item> <item> <token sym="よこはま" slot="region">横浜</token> </item> <item> <token sym="きょうと" slot="region">京都</token> </item> </one-of> </rule> </grammar> </field> <block> <submit next="<?php echo basename(__FILE__) ?>"/> </block> </form> </vxml>
また、以下は PostgreSQL とも連携して、音声認識文法も動的に生成し、出力する情報もデータベースから取得して読み上げる例です。
<?php echo '<?xml version="1.0" encoding="utf-8"?>' ."\n" ?> <?php mb_http_output('utf-8'); ?> <vxml version="2.0" xml:lang="ja"> <?php $db_user = "galatea"; $db_pass = "galatea"; $db_host = "localhost"; $db_name = "galatea_db"; $db = pg_connect("host=$db_host port=5432 dbname=$db_name user=$db_user password=$db_pass"); if (isset($_REQUEST['item']) && $_REQUEST['item'] != '') { $item = $_REQUEST['item']; mb_convert_variables("UTF-8", mb_detect_encoding($item), $item); $rs = pg_query($db, "SELECT name,price FROM goods WHERE code = $item"); if ($row = pg_fetch_assoc($rs)) { $name = $row['name']; $price = $row['price']; } ?> <form id="answer"> <block> <log>name: <?php echo $name ?>,price: <?php echo $price ?></log> <prompt> <?php echo $name ?>は<?php echo $price ?>円です。 <break/> </prompt> <goto next="#ask"/> </block> </form> <?php } ?> <form id="ask"> <field name="item"> <prompt timeout="20s"> 値段を聞きたい果物は何ですか? </prompt> <grammar version="1.0" root="#item_rule"> <rule id="item_rule"> <one-of> <item> <token sym="まいくてすと">マイクテスト</token> </item> <?php $rs = pg_query($db, "SELECT code,name,yomi FROM goods"); while ($row = pg_fetch_assoc($rs)) { $code = $row['code']; $name = $row['name']; $yomi = $row['yomi']; echo " <item> <token sym=\"$yomi\" slot=\"item\" value=\"$code\">$name</token> </item>\n"; } ?> </one-of> </rule> </grammar> </field> <block> <submit next="<?php echo basename(__FILE__) ?>"/> </block> </form> </vxml>
最後に、音声認識エンジンに対してユーザが発話している途中にどのようなフィードバックをユーザに見せるべきか、ということを考えていただくために、試作中の「音声インクリメンタルサーチ」のデモをお見せしました。
音声対話システムの開発において VoiceXML が常に最適な技術とは限りません。
ISTC-SIG-MMIでは、Galatea Toolkit 開発の経験を生かしつつ、W3Cでの標準化の動向も踏まえて、マルチモーダル対話システムのアーキテクチャーと記述言語の検討を進めています。
Galatea Dialog Manager もそれらの成果を取り込みながら、さらに開発を続けていきたいと思っています。