音声対話講習会

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