ママ、見て!キーボードがないよ!一定の文法を使用した音声入力および応答

音声認識用音響モデルの文法と、その文法を SRGS で使用する対話マネージャーの両方を構築する方法

音声認識モデルを構築する上で必要な、非自然言語の文法を定義するためのフォーマットとしては、プレーン・テキストによるアプリケーション固有のさまざまなフォーマットが存在します。プログラマーは SRGS (Speech Recognition Grammar Specification) を使用することで、これらのフォーマットの多くをオープン・スタンダードの構造で表現できるだけでなく、音声認識モデルによって生成された出力を解釈するために必要な対話マネージャーの規則を定義することもできます。この記事では、非自然言語に特有の文法を定義して使用するような状況で、SRGS を使用する方法について、さらには SISR (Semantic Interpretation for Speech Recognition) 的な手法について PHP を使用しながら詳しく探ります。

Colin Beckingham, Writer and Researcher, Freelance

Colin Beckingham はカナダのオンタリオ州東部に住むフリーランスの研究者であり、ライターであり、プログラマーでもあります。キングストンの Queen's University で学位を取得している彼は、園芸、競馬、教育、行政サービス、小売業、旅行/観光業などにも関わってきました。彼はデータベース・アプリケーションの作成者であり、数え切れないほどの新聞記事や雑誌記事、オンライン記事を執筆しており、また Linux でのオープンソース・プログラミングや VoIP、音声制御アプリケーションも研究しています。



2010年 11月 09日

音声認識の現状

よく使われる頭文字語

  • DTD: Document Type Definition
  • HTK: Hidden Markov Model Toolkit
  • URI: Uniform Resource Identifier
  • W3C: World Wide Web Consortium
  • XML: Extensible Markup Language

コンピューターがますます小型化されて持ち運びしやすくなるなか、キーボードやマウスを使わずにコンピューターを操作する必要性が増してきています。音声は、その代わりとなる手段の 1 つです。しかし表面的には、音声通信で使用可能な帯域幅は、視覚的な対話と比べるとわずかしかありません。「百聞は一見に如かず」と言われる人間の感覚に基づき、コンピューターでは、音声による入力を受け付けて音声で応答を返すのではなく、それよりも遥かに使いやすい方法として、周辺機器からの機械的な入力に対して応答を画面に表示します。

小型のコンピューターに音声で指示を出すことに成功した技術は、まだ数は少ないですが既に存在します。これらの技術が目標としているのは、コンピューターを音声によるコマンドに反応させて、そのコマンドに応じた特定のアクションを行わせることです。この目標を達成するための一般的なプロセスは、まずモデルを構築し (または既存のモデルに手を加え)、認識プロセスで音声によるコマンドをそのモデルに適用した後、対話マネージャーでアクションを決定するというものです。多様な音声からわずかな数のコマンドを認識するという意味で、モデルは広義のものにすることができます。あるいは、かなり複雑な解釈および対話を可能にするために、特定の文法から独自のモデルを教え込むという方法もあります。図 1 に、音声認識および解釈の開発フローを示します。

図 1. 音声認識および解釈の開発フロー
音声認識および解釈の開発フロー

重要な点は、自然言語処理 (NLP) と、N-gram による特定の文法とを区別することです。後者は、音声レコグナイザーが聴取するはずの内容を断定的に提示する一方、前者は受信した音声の一部の要素を破棄し、残りを再編成することによって自然言語を単純な構造にデコードするのがせいぜいです。SRGS や SISR などの技術は主に自然言語処理に偏りがちですが、プログラマーたちは、これらのツールを自然言語以外の文法に適用する手段を探し求めています。

この記事では SRGS を使用して一定の文法を定義し、対話マネージャーでの未知語 (OOV: Out-Of-Vocabulary) プロンプトおよび文脈の問題に対処します。説明では、バイグラム (2-gram、または bigram) の例を使用します。


プログラミングの視点

プログラミングの視点から見ると、SRGS を使用して一定の文法を定義し、対話マネージャーでの OOV プロンプトおよび文脈の問題に対処する上では、重要な問題がいくつかあります。第 1 に、使用する音声レコグナイザー・アプリケーションによって、何通りもの方法で文法を表現できてしまいます。第 2 に、これらの文法は、それを使用する対話マネージャーとの間で十分な調整がなされていません。しかし対話マネージャーは、インテリジェントな応答、そして OOV 認識などといった問題に対処する方法を提供することから、重要な存在です。第 3 の問題として、ここで話題としているのは特定の処理を行うように設計された特定の文法であるため、文法ごとにモデルと対話マネージャーを作成し直すか、あるいは適応させなければなりません。そのため、モデルと対話マネージャーのなかで自動生成される部分を大きくすればするほど、それだけ望ましいものになります。

インテリジェントな応答とは、コンピューターが文脈を考慮することを意味します。例えば温度について質問する場合、その前の質問がコンピューターに関する質問であれば、コンピューターの温度を応答する必要があるということになります。

OOV は規模の小さい文法にはよくある問題です。簡単に言うと、一部のプロンプトは重要である一方、それ以外のプロンプトはモデルを構築するためには必要であっても、その後の処理にはそれほど重要ではないことを意味します。

自動生成は単純に、Bash、Perl、PHP、あるいは C や C++ などの通常のプログラミング言語のスクリプトを使用して行いますが、それには明確な規則があることが前提となります。これらの規則をカプセル化するように設計されているのが、SRGS です。


リスト 1 は、プレーン・テキストによる文法のプロトタイプです。

リスト 1. 文法のプロトタイプ
COMPUTER WAKE
COMPUTER STATUS
COMPUTER SLEEP

リスト 1 の文法は極めて単純かつ限定的なもので、文法的に可能な 3 つのプロンプトだけを聴取するようにコンピューターに指示します。各プロンプトは COMPUTER という単語で始まり、それぞれ WAKESTATUS、または SLEEP という単語が続きます。これ以外のコマンドは受け付けられません。この音声レコグナイザーで行う処理は唯一、3 つの選択肢のなかから聴取した音声に最も近いとみなされるコマンドを選び、そのコマンドを次のステージに渡すことです。例えば、私が MAKE COFFEE と言ったとすると、コンピューターは COMPUTER に続けて 3 つの選択肢のなかからいずれかの単語を返します。そこに何らかのインテリジェンスを適用するのは、対話マネージャーの役割です。例えばコンピューターが COMPUTER SLEEP というコマンドを聴取したとしたら、COMPUTER WAKE を聞くまでは他のどのコマンドにも応答してはなりません。また、COMPUTER STATUS というコマンドには WAKE 状態にある場合にだけ応答し、このコマンドを受け取った時点で、プロセッサーの温度やディスク上の空き容量などの興味深い情報を知らせるようにします。上記のプロトタイプは、実用的な文法ではありません。このように小さい文法から音響モデルを構築するとなると、すぐにサンプル不足の問題に突き当たります。このプロトタイプは、原則を説明することだけを目的としています。

コンピューターが話し言葉の音声を認識して、聴取した内容に文法規則を適用するようにトレーニングするプロセスは至って単純です。それは、オープンソースの世界でも変わりありません。一定の語彙を使用して効果的な音声認識システムを作り上げる際の包括的なガイダンスについては、VoxForge のサイトを参照してください。VoxForge のチュートリアルでは、ケンブリッジ大学で開発された HTK や、日本の名古屋工業大学で開発された Julius 音声認識エンジンなどのツールを使用しています。関連するサイトへのリンクはすべて、「参考文献」に記載されています。

HTK を使って音声モデルを構築するには、特定のフォーマットで文法を記述する必要があります (リスト 2 を参照)。

リスト 2. HTK フォーマットでの文法
$major =  COMPUTER ;
$minor = WAKE | STATUS | SLEEP ;
( SENT-START ( $major $minor ) SENT-END )

Julius エンジンで文法を記述する場合に必要なフォーマットは多少異なります (リスト 3 を参照)。

リスト 3. Julius フォーマットでの文法
S : NS_B SENT NS_E
SENT: MAJOR MINOR
MAJOR: COMPUTER
MINOR: WAKE STATUS SLEEP

HTK と Julius のフォーマットは、プログラミングという観点から見ると構造的に似ていますが、互いに置き換えられるだけの共通性はありません。

リスト 4 に、この文法を処理するために PHP で作成した基本的な対話マネージャーを記載します。

リスト 4. 単純な対話マネージャー
<?php
...
function dm($prompt_heard) {
global $wake_state; // FALSE is asleep so do not respond, TRUE is awake
  $parts = explode(" ",$prompt_heard);
  $minor = $parts[1];
  switch ($minor) {
    case 'WAKE':
      $wake_state = TRUE ;
    break;
    case 'SLEEP':
      $wake_state = FALSE ;
    break;
    case 'STATUS':
      if ($wake_state) {
        announce_status();
      } else {
        // do nothing
      }
    break;
    default:
      // OOV - any other prompt, just ignore it.
    break;
  }
}
?>

この PHP の関数では、引数 $prompt_heard に含める形で音声レコグナイザーからの結果が渡されます。$wake_state 変数はグローバル変数として宣言されるため、対話マネージャーのどこからでもアクセスすることができます。explode() は聴取したプロンプトをパーツに分解します。この例の場合、最初のパーツは COMPUTER となるので、次の switch 文ではマイナー・パーツだけを調べます。マイナー・パーツが WAKE であれば、wake ステートを TRUE に設定し、SLEEP であれば、wake ステートを FALSE に設定します。マイナー・パーツが STATUS であれば、wake ステートが TRUE である場合にのみ、結果を知らせます。ステータスをスピーカーに出力するには、developerWorks の記事「PHP という蜂と音声という蜜: アクセシビリティーを考慮したエージェント・ベースの音声アラートとフィードバック」(「参考文献」を参照) で説明しているのと同様のプロセスを使用することができます。上記のリストの最後にある default セクションでは、音声レコグナイザーを動作させるために発せられる上記 3 つ以外のあらゆるプロンプトを捕捉することになります (プロンプトを認識できない場合、後々のトラブルシューティングに備えてログに書き込む以外の処理は何も行いません)。

プログラミングの効率性という点から考えると、文法と対話マネージャーを部分的に自動生成できれば、時間と作業を節約できるだけでなく、精度の向上にもつながります。そのために、さらに高水準の文法を作成するという取り組みは (「参考文献」を参照)、主に NLP の領域です。


SRGS が役立つ理由

SRGS に意図された目的は、リスト 2リスト 3 と同じ概念を、XML による厳密な構造で表現することです (リスト 5 を参照)。

リスト 5. SRGS フォーマットでのプロトタイプ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
                  "http://www.w3.org/TR/speech-grammar/grammar.dtd">
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://www.w3.org/2001/06/grammar 
                             http://www.w3.org/TR/speech-grammar/grammar.xsd"
         version="1.0" 
         mode="voice" 
         root="myroot">
<meta name="author" content="Colin Beckingham"/>
<rule id="myroot" scope="public">
  <example> COMPUTER WAKE </example>
  <example> COMPUTER SLEEP </example>
  <example> COMPUTER STATUS </example>
  <ruleref uri="#command1"/>
  <!-- ruleref uri="#command2"/ -->
</rule>
<rule id="command1">
  <ruleref uri="#major"/> <ruleref uri="#minor"/>
</rule>
<rule id="major">
   <one-of>
      <item> COMPUTER </item>
    </one-of>
</rule>
<rule id="minor">
    <one-of>
      <item> WAKE </item>
      <item> SLEEP </item>
      <item> STATUS </item>
    </one-of>
</rule>
</grammar>

リスト 5 では、お定まりの XML 宣言に続き、DOCTYPE 文によって DTD の場所が指定されています。上記の場合、指定されているのは文法に関連する詳細です。次に続くのはルート要素 <grammar> で、grammar 要素には重要な属性がいくつも含まれます。具体的には、名前空間、モード (この例でのデータの送信先は音声レコグナイザーなので、モードは “voice” となります)、ルート規則の ID などです。ルート規則とは、一致するプロンプトの検索を開始する場所であり、この例では “myroot” が指定されています。”myroot” 規則には、他の規則を指す ruleref が含まれます。DTD では <example> 要素を使用して情報を提供することができます。次に続くのは、”command1” という ID を持つ規則で、その後にさらに 2 つの規則、”major” と “minor” が続きます。”major” 規則に含まれる単語は COMPUTER だけです。”minor” 規則には、WAKESLEEPSTATUS の選択肢が含まれます。これらの選択肢は、一度に 1 つしか適用できないことを示す <one-of> 構造に <item> 要素として組み込まれています。”major” 規則と “minor” 規則を規則構造全体の一部として組み込んでいるのは、ルート規則の <ruleref> 要素です。

要約すると、規則は以下の構造に従います。

  1. grammar 要素の root 属性はルート規則 “myroot” を指します。
  2. myroot” 規則には 1 つ以上の ruleref が含まれ、そのそれぞれに別の規則を指す URI が属性として含まれます。この別の規則に該当するのが N-gram のマスター規則であり、上記の例では command1 となっています。command2ruleref がコメント・アウトされているのは、これはまだ存在していないマスター規則のプレース・ホルダーだからです。
  3. マスター規則である command1 には、他の規則も使用されることを示す ruleref が含まれます。他の規則とは、major とこれに続く minor です。

HTK および Julius のモデル生成プロセスは、W3C 用語で言うユーザー・エージェントではありません。それは、この 2 つは現在のところ SRGS フォーマットを直接読み取ることはせず、SRGS を使用して文法を定義するため、SRGS を他のフォーマットに変換するスクリプトが必要となるためです。さらに情報の不足から、HTK と Julius はいずれも対話マネージャーを生成しません。それでは一体どのようにして、SLEEP が応答の停止を意味していると推測できるのでしょうか?


SRGS から HTK または Julius への変換

リスト 6 は、PHP で作成した単純な変換プログラムです。この変換プログラムは SRGS フォーマットで記述された文法を詳細に調べ、それに相当する基本的な HTK または Julius フォーマットによる文法を出力します。

リスト 6. 変換プログラム
<?php
// test translator: SRGS to HTK/Julius
$xml = simplexml_load_file("mysrgs.xml");
$roote = trim($xml['root']);
// find the root rule, get the basic rulerefs
foreach ($xml->rule as $rule) { 
  if ($rule['id'] == $roote) { 
    foreach ($rule->ruleref as $rref) {
      $rulerefs[] = substr($rref['uri'],1);
} } }
// find the rules indicated by the rulerefs
foreach ($rulerefs as $ruleid) {
  foreach ($xml->rule as $rule) {
    if ($rule['id'] == $ruleid) {
      $i = 0;
      foreach ($rule->ruleref as $rref) {
        $myrules[$ruleid][$i] = substr($rref['uri'],1);
        $i++;
} } } }
// load the words array
foreach ($myrules as $mr=>$myr) {
  foreach ($myr as $md=>$myd) {
    foreach ($xml->rule as $rule) {
      if ($rule['id'] == $myd) {
        foreach ($rule->{'one-of'}->item as $item) {
          $words[$mr][$md][] = $item;
} } } } }
// now the output
$varnamestr .= "";
$jvarnamestr = "";
foreach ($words as $k=>$v) { // master
  $jvarnamestr .= "\nSENT: ";
  foreach ($v as $kk=>$vv) { // sub
    $i = 0;
    foreach ($vv as $wd) { // word
      $j = count($vv);
      $htkwds[$k][$kk] .= " $wd ";
      $i++;
      $jwds[$k][$kk] .= " $wd ";
      if ($i < $j) $htkwds[$k][$kk] .= "|";
    }
    // htk
    $varname = "$".$k."_".$kk."";
    $htkv .= "$varname = ".$htkwds[$k][$kk].";\n";
    $varnamestr .= " ".$varname;
    // julius
    $jvarname = strtoupper($k."_".$kk);
    $jvarwordstr .= "$jvarname: ".$jwds[$k][$kk]."\n";
    $jvarnamestr .= " ".$jvarname." ";
  }
  $varnamestr = $varnamestr." |";
}
// output as HTK
echo "\n-------------------------\n";
echo "HTK Version\n-------------------------\n";
$varnamestr = substr($varnamestr,0,-2);
$htk = $htkv."( SENT-START (".$varnamestr." ) SENT-END )";
echo "$htk\n-------------------------\n";
// output as Julius
echo "Julius Version\n-------------------------\n";
$julius = "S : NS_B SENT NS_E";
$julius .= "$jvarnamestr\n";
$julius .= "$jvarwordstr";
echo "$julius-------------------------\n";
// end
echo "Done\n\n";
?>

リスト 6 のプログラム全体としての目標は、SRGS 文書をスキャンして、プロンプト構造を表す SimpleXML オブジェクトを多次元配列に取り込むことです。配列が完成すると、その配列から必要なストリング変数を生成して、HTK フォーマットおよび Julius フォーマットに出力します。配列にデータを取り込むには、一連の foreach 文を使用して、ルート規則、マスター規則、そしてマスター規則が参照する規則を抽出します。その結果生成される配列では、最初のキーがマスター規則の名前、2 番目のキーが位置 (メジャー規則の場合は 0、マイナー規則の場合は 1) となります。$i および $j 変数はカウンターです。これらのカウンターが、HTK フォーマットでの OR 記号である垂直バー (|) の追加を制御します。そして最後に、単語とマスター規則の ID から作成された変数が出力で使用されます。リスト 7 は、サンプル・セッションの出力です。

リスト 7. 変換プログラムによる出力
> php mytrans.php

-------------------------
HTK Version
-------------------------
$command_0 =  COMPUTER ;
$command_1 =  WAKE | SLEEP | STATUS ;
$zoo_0 =  ANIMALS ;
$zoo_1 =  TIGER | LION | LEOPARD ;
( SENT-START ( $command_0 $command_1 | $zoo_0 $zoo_1 ) SENT-END )
-------------------------
Julius Version
-------------------------
S : NS_B SENT NS_E
SENT:  COMMAND_0  COMMAND_1
SENT:  ZOO_0  ZOO_1
COMMAND_0:  COMPUTER
COMMAND_1:  WAKE  SLEEP  STATUS
ZOO_0:  ANIMALS
ZOO_1:  TIGER  LION  LEOPARD
-------------------------
Done

このコードによって、リスト 2リスト 3 のフォーマットが再現されます。上記ではテストとして、コードが複数のマスター規則を処理することを確認するために 2 つ目のマスター規則が追加されています。この変換プログラムは、繰り返しを処理しない初歩的なものであることに注意してください (例えば、電話番号のような一連の数値の繰り返し処理には対応しません)。さらに、選択する語彙、辞書、音素構造によっては、モデルを構築するために他のファイルを定義する必要も生じてきますが、少なくとも出発点としては有効なプログラムです。詳しいガイダンスについては、「参考文献」で紹介している VoxForge のチュートリアルを参照してください。


対話マネージャー生成プログラム

今度は対話マネージャーに目を向けてください。SRGS のソースから、対話マネージャーの一部でも生成することができれば助けになります。文脈自由文法を扱っているとしたら、N-gram (「参考文献」を参照) の構造が必要を満たすことになるでしょう。現状の N-gram の例では、文法は一定です。この文法には 4 つの単語が含まれていて、この 4 つの単語を使用した場合に可能な応答は、3 つしかありません。

標準に厳密に従いながらも、SRGS 定義では、対話マネージャーを生成する上で役立ついくつかの詳細な要素や属性を追加することが許されています。その 1 つは、weight 属性です。この属性に整数または 10 進数の値を指定して <item> 要素に追加することができます。さらに、規則の子として <tag> 要素を追加し、そこに任意のストリングを含めることもできます。この 2 つは頻繁に使われる ECMAScript (JavaScript) 式です。一般的な使用目的は、ブラウザーで NLP パーサーに SISR 命令を発行することですが、この例の場合には、対話マネージャー生成プログラムにヒントとなる情報を送信するのに役立ちます。

文法からはすでに多少の情報を得ています。つまり、バイグラムのフォーマットに必要なのは 2 つの switch 文であり、これはメジャーの中にネストされたマイナーであるということです。ここまでは単純ですが、文脈と OOV にはそれだけでは足りません。そこで提案するのが、weight 属性を使って OOV に対処し、tag 要素で文脈を扱うことです。

リスト 8. 対話マネージャーへの指示によって強化された SRGS
...
<item weight="1"> COMPUTER <tag>$context = "tech";</tag></item>
...
<item weight=""> WAKE <tag>$wake_state = TRUE;</tag></item>
<item weight=""> SLEEP <tag>$wake_state = FALSE;</tag></item>
<item weight=""> STATUS <tag>
      if ($wake_state) {
        announce_status();
      }</tag></item>
...      
<item weight="0"> ANIMALS <tag></tag></item>
...

メジャーの COMPUTER の重み (weight) は 1 ですが、ANIMALS の重みは 0 であることに注意してください。この文脈では、COMPUTER * を認識させる一方、ANIMALS * は OOV として無視させる必要があるためです。さらに、tag 要素には生成プログラムが挿入できる PHP コードのスニペットが含まれています。

リスト 9 に記載する対話マネージャー生成プログラムが目標とするのは、リスト 4 のような dm() 関数を作成することです。

リスト 9. 対話マネージャー生成プログラム
<?php
// Dialog manager generator
// Colin Beckingham, 2010
// test dmgen
$xml = simplexml_load_file("mysrgs.xml");
$roote = trim($xml['root']);
// find the root rule, get the basic rulerefs
foreach ($xml->rule as $rule) { 
  if ($rule['id'] == $roote) { 
    foreach ($rule->ruleref as $rref) {
      $rulerefs[] = substr($rref['uri'],1);
} } }
// find the rules indicated by the rulerefs
foreach ($rulerefs as $ruleid) {
  foreach ($xml->rule as $rule) {
    if ($rule['id'] == $ruleid) {
      $i = 0;
      foreach ($rule->ruleref as $rref) {
        $myrules[$ruleid][$i] = substr($rref['uri'],1);
        $i++;
} } } }
// load the words array
foreach ($myrules as $mr=>$myr) {
  foreach ($myr as $md=>$myd) {
    foreach ($xml->rule as $rule) {
      if ($rule['id'] == $myd) {
        foreach ($rule->{'one-of'}->item as $item) {
          $words[$mr][$md][] = $item;
} } } } }
$dmout1 = "<?php
...
function dm(\$prompt_heard) {
global \$wake_state; // FALSE is asleep so do not respond, TRUE is awake
  \$parts = explode(\" \",\$prompt_heard);
  \$major = \$parts[0];
  \$minor = \$parts[1];
  switch (\$major) {";
    foreach ($words as $mw) {
      $mww = $mw[0][0]->attributes();
      if ($mww->weight == 1) {
$maj = "    case '".trim($mw[0][0])."':\n      ";
$maj .= "".$mw[0][0]->tag."";
$min1 = "\n      switch (\$minor) {";
        $ins .= "\n$maj$min1";
        foreach ($mw[1] as $mm) {
$min2 = "\n        case '".trim($mm)."':\n";
$min3 = "        ".$mm->tag."\n";
$min4 = "        break;";
        $ins .= "$min2$min3$min4";
      }
$min5 = "\n        case default:\n        break;\n      }";
        $ins .= $min5;
      }
    }
$dmout2= "
    default:
      // OOV - any other prompt, just ignore it.
    break;
  }
}
?>
";
echo "$dmout1$ins$dmout2\n";
?>

リスト 9 のコードの前半部分は、リスト 6 に記載した変換プログラムのコードとまったく同じです。このように意図的に重複させている理由は、最終的には文法と対話マネージャーの生成を同じプログラムで行えるようにしたいためです。SimpleXML オブジェクトからなる $words 配列が完成した後、これらのオブジェクトをスキャンして、item だけでなく weight と tag の値も抽出します。一部の初歩的な静的コードの出力が完了すると、対話マネージャー生成プログラムは SimpleXML オブジェクトを繰り返し処理して、PHP コードのフォーマットで出力をレンダリングし、必要に応じて switch 文をネストします

リスト 10 に、テスト用ソースの SRGS ファイルによる出力例を記載します。このファイルには 3 つのマスター規則が含まれていて、そのうちの 1 つはテスト・データ専用として無視されることになっています。

リスト 10. 生成プログラムによる出力
> php dmgen2.php

<?php                                                          
...                                                            
function dm($prompt_heard) {                                   
global $wake_state; // FALSE is asleep so do not respond, TRUE is awake
  $parts = explode(" ",$prompt_heard);                                 
  $major = $parts[0];                                                  
  $minor = $parts[1];                                                  
  switch ($major) {                                                    
    case 'COMPUTER':                                                   
      $context = "tech";                                               
      switch ($minor) {                                                
        case 'WAKE':                                                   
          $wake_state = TRUE;
        break;
        case 'SLEEP':
          $wake_state = FALSE;
        break;
        case 'STATUS':
          if ($wake_state) { announce_status(); }
        break;
        case default:
        break;
      }
    case 'APPLES':
      $context = "fruit";
      switch ($minor) {
        case 'PIPPIN':
          pippin apple
        break;
        case 'DELICIOUS':
          delicious apple
        break;
        case 'SPARTAN':
          spartan apple
        break;
        case default:
        break;
      }
    default:
      // OOV - any other prompt, just ignore it.
    break;
  }
}
?>

この出力を生成するファイルは、「ダウンロード」で入手することができます。


まとめ

SRGS を使用することにより、一定の文法に関する要件とそれぞれの NLP における通常の役割を記述し、文法と対話マネージャー両方のファイルを 1 ヶ所で生成することができます。さらに、weight 属性によってマスター規則を検出するかどうかを定義し、<tag> 要素によって対話マネージャーに対して特定のプロンプトが検出されたときに実行するアクションを指示することで、文法と対話マネージャーをより厳密かつ効果的に自動生成できるようになります。

音声だけでコンピューターを操作するのは、各種のハードウェア入力装置を使ったり、視覚的フィードバックによってコンピューターの状態をモニタリングしたりする作業に比べ、遥かに難しいことです。音声プログラマーとして第一の目標にするべきことは、特に声と耳を使う以外に対話手段がないユーザーのためにはなおさらのこと、ユーザーがより簡単に音声で対話できるようにすることです。この記事で紹介した文法および対話マネージャーの生成プログラム自体は単純とはほど遠いものですが、これらの生成プログラムの成果を利用して、単純でスタッカブルなツールの作成プロセスを簡易化することは可能です。


ダウンロード

内容ファイル名サイズ
Sample files using PHP to exercise SRGS and SISRsrgsphp.zip3KB

参考文献

学ぶために

製品や技術を入手するために

  • Julius: 音声関連の研究・開発のための高性能な 2 パス式大語彙連続音声認識 (LVCSR) デコーダー・ソフトウェアについて調べてください。Julius は単語 N-gram 法および文脈依存 HMM をベースとしています。
  • HTK: この移植可能な隠れマルコフ・モデルの構築および操作用ツールキットについて詳しく調べてください。主に音声認識の研究に用いられている HTK は、音声合成、文字認識、DNA 配列解読の研究でも使用されています。
  • IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=594607
ArticleTitle=ママ、見て!キーボードがないよ!一定の文法を使用した音声入力および応答
publish-date=11092010