音声対話講習会

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'); ?>
<!--
## PostgreSQL + PHP + VoiceXML
CREATE TABLE goods(
    code SERIAL NOT NULL PRIMARY KEY,
    name VARCHAR(64),
    yomi VARCHAR(64),
    price INTEGER
);
INSERT INTO goods VALUES(1, 'りんご', 'りんご', 200);
INSERT INTO goods VALUES(2, 'みかん', 'みかん', 50);
INSERT INTO goods VALUES(3, 'スイカ', 'すいか', 1000);
INSERT INTO goods VALUES(4, 'メロン', 'めろん', 1500);
INSERT INTO goods VALUES(5, 'バナナ', 'ばなな', 120);
INSERT INTO goods VALUES(6, '夏みかん', 'なつみかん', 200);

-->
<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 もそれらの成果を取り込みながら、さらに開発を続けていきたいと思っています。