カスタム認識の制約を定義する方法 (HTML)

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

音声認識のカスタム制約を定義して使う方法について説明します。

  Windows 8 と Windows 8.1 では、Windows ストア アプリで音声コマンドと音声認識がサポートされません。

 

音声認識では、少なくとも 1 つの制約を使って、認識できるボキャブラリを定義する必要があります。制約が指定されていない場合、ユニバーサル Windows アプリで定義済みのディクテーション文法が使われます。「クイック スタート: 音声認識」をご覧ください。

理解しておく必要があること

テクノロジ

必要条件

このトピックは、「クイック スタート: 音声認識」に基づいています。

このチュートリアルを完了するには、以下のトピックに目を通して、ここで説明されているテクノロジをよく理解できるようにしてください。

手順

ステップ 1: 制約の追加

SpeechRecognizer.Constraints プロパティを使って、音声認識機能に制約を追加します。

ここでは、アプリ内から使われる 3 種類の音声認識制約について取り上げます (音声コマンドの制限については、「クイック スタート: 音声コマンド」をご覧ください)。

音声認識エンジンはそれぞれ 1 つの制約コレクションを保持できます。制約は次の組み合わせのみが有効です。

  • 単一トピック制約、または定義済みの文法 (ディクテーションまたは Web 検索)。他の制約は許されません。
  • 一覧の制約または文法ファイルの制約の組み合わせ。

注意: 認識プロセスを開始する前に制約をコンパイルするには、SpeechRecognizer.CompileConstraintsAsync メソッドを呼び出します。

ステップ 2: Web 検索文法の指定 (SpeechRecognitionTopicConstraint)

トピック制約 (ディクテーションまたは Web 検索文法) は音声認識エンジンの制約コレクションに追加する必要があります。

以下では、制約コレクションに Web 検索文法を追加しています。

function buttonSpeechRecognizerWebSearchClick() {
    // Create an instance of SpeechRecognizer.
    var speechRecognizer =
      new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Add a web search grammar to the recognizer.
    var webSearchGrammar =
        new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(
        Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch,
        "webSearch");

    speechRecognizer.uiOptions.audiblePrompt = "Say what you want to search for...";
    speechRecognizer.uiOptions.exampleText = "Ex. 'weather for London'";
    speechRecognizer.constraints.append(webSearchGrammar);

    // Compile the default dictation grammar.
    speechRecognizer.compileConstraintsAsync().done(
      // Success function.
      function (result) {
          // Start recognition.
          speechRecognizer.recognizeWithUIAsync().done(
            // Success function.
            function (speechRecognitionResult) {
                // Do something with the recognition result.
                var messageDialog =
                  new Windows.UI.Popups.MessageDialog(
                  speechRecognitionResult.text, "Text spoken");
                messageDialog.showAsync();
            },
            // Error function.
            function (err) {
                WinJS.log && WinJS.log("Speech recognition failed.");
            });
      },
      // Error function.
      function (err) {
          WinJS.log && WinJS.log("Constraint compilation failed.");
      });
    speechRecognizer.close();
}

ステップ 3: プログラムによる一覧の制約の指定 (SpeechRecognitionListConstraint)

一覧の制約は音声認識エンジンの制約コレクションに追加する必要があります。

次の点に留意してください。

  • 制約コレクションには、複数の一覧の制約を追加できます。
  • IIterable<String> を実装する任意のコレクションを文字列値に使用できます。

以下では、プログラムによって一覧の制約として単語の配列を指定し、それを音声認識エンジンの制約コレクションに追加しています。

function buttonSpeechRecognizerListConstraintClick() {
    // Create an instance of SpeechRecognizer.
    var speechRecognizer =
      new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // You could create this array dynamically.
    var responses = ["Yes", "No"];

    // Add a web search grammar to the recognizer.
    var listConstraint =
        new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(
        responses,
        "YesOrNo");

    speechRecognizer.uiOptions.audiblePrompt = "Say what you want to search for...";
    speechRecognizer.uiOptions.exampleText = "Ex. 'Yes', 'No'";
    speechRecognizer.constraints.append(listConstraint);

    // Compile the default dictation grammar.
    speechRecognizer.compileConstraintsAsync().done(
      // Success function.
      function (result) {
          // Start recognition.
          speechRecognizer.recognizeWithUIAsync().done(
            // Success function.
            function (speechRecognitionResult) {
                // Do something with the recognition result.
                var messageDialog =
                  new Windows.UI.Popups.MessageDialog(
                  speechRecognitionResult.text, "Text spoken");
                messageDialog.showAsync();
            },
            // Error function.
            function (err) {
                WinJS.log && WinJS.log("Speech recognition failed.");
            });
      },
      // Error function.
      function (err) {
          WinJS.log && WinJS.log("Constraint compilation failed.");
      });
    speechRecognizer.close();
}

ステップ 4: SRGS 文法の制約の指定 (SpeechRecognitionGrammarFileConstraint)

SRGS 文法ファイルは音声認識エンジンの制約コレクションに追加する必要があります。

SRGS Version 1.0 は、音声認識用に XML 形式の文法を作るための業界標準のマークアップ言語です。ユニバーサル Windows アプリでは、SRGS 以外にも音声認識文法を作るための手段が用意されていますが、SRGS を使って文法を作ると、複雑な音声認識シナリオの場合は、特に優れた結果が得られます。

SRGS 文法は、アプリの複雑な音声操作を構築するときに役立つ機能をすべて備えています。たとえば、SRGS 文法を使って以下を実行できます。

  • 認識する単語と語句の発声順序を指定します。
  • 認識される複数のリストと語句から単語を組み合わせる
  • 他の文法にリンクする
  • 音声入力に一致させるために使用される可能性を高くするか低くするために、別の単語または語句に重みを割り当てる
  • オプションの単語または語句を含める
  • 文法に一致しない不規則な音声や背景の雑音など、指定していない入力や予期していない入力を除外する特別な規則を使う。
  • セマンティクスを使って、音声認識がアプリにもたらす意味を定義します。
  • 文法内で、または用語集へのリンクを通じて発音を指定する

SRGS の要素と属性について詳しくは、SRGS 文法の XML リファレンスに関するページをご覧ください。SRGS 文法の作成を開始するには、基本的な XML 文法の作成方法に関するページをご覧ください。

次の点に留意してください。

  • 制約コレクションには、複数の文法ファイルの制約を追加できます。
  • SRGS 規則に準拠した XML ベースの文法ドキュメントには .grxml ファイル拡張子を使います。

この例では、srgs.grxml という名前のファイル (後述) に定義された SRGS 文法を使います。ファイルのプロパティで、[パッケージ アクション][コンテンツ] に設定され、[出力ディレクトリにコピー][常にコピーする] に設定されています。

function buttonSpeechRecognizerSRGSConstraintClick() {
    // Create an instance of SpeechRecognizer.
    var speechRecognizer =
      new Windows.Media.SpeechRecognition.SpeechRecognizer();

    speechRecognizer.uiOptions.audiblePrompt = "Say what you want to search for...";
    speechRecognizer.uiOptions.exampleText = "Ex. 'yes', 'no'";

    // Add a grammar file constraint to the recognizer.
    var uri = new Windows.Foundation.Uri("ms-appx:///data/srgs.grxml");
    var storageFile =
        Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(
        // Success function.
        function (srgs) {
            var grammarfileConstraint =
                new Windows.Media.SpeechRecognition.SpeechRecognitionGrammarFileConstraint(srgs, "yesorno");
            speechRecognizer.constraints.append(grammarfileConstraint);
            // Compile the default dictation grammar.
            speechRecognizer.compileConstraintsAsync().then(
              // Success function.
              function (result) {
                  // Start recognition.
                  speechRecognizer.recognizeWithUIAsync().done(
                    // Success function.
                    function (speechRecognitionResult) {
                        // Do something with the recognition result.
                        var messageDialog =
                          new Windows.UI.Popups.MessageDialog(
                          speechRecognitionResult.text, "Text spoken");
                        messageDialog.showAsync();
                    },
                    // Error function.
                    function (err) {
                        WinJS.log && WinJS.log("Speech recognition failed.");
                    });
              },
              // Error function.
              function (err) {
                  WinJS.log && WinJS.log("Constraint compilation failed.");
              });
        },
        // Error function.
        function (err) {
            WinJS.log && WinJS.log("File retrieval failed.");
        });
    speechRecognizer.close();
}

この SRGS ファイル (srgs.grxml) は、解釈タグを含みます。これらのタグは、文法に合致するデータをアプリに返すしくみです。 文法は、World Wide Web コンソーシアム (W3C) の 音声認識のための意味解釈 (SISR) 1.0 仕様に準拠している必要があります。

以下では、"yes" と "no" のバリエーションをリッスンします。

<grammar xml:lang="en-US" 
         root="yesOrNo"
         version="1.0" 
         tag-format="semantics/1.0"
         xmlns="http://www.w3.org/2001/06/grammar">

    <!-- The following rules recognize variants of yes and no. -->
      <rule id="yesOrNo">
         <one-of>
            <item>
              <one-of>
                 <item>yes</item>
                 <item>yeah</item>
                 <item>yep</item>
                 <item>yup</item>
                 <item>un huh</item>
                 <item>yay yus</item>
              </one-of>
              <tag>out="yes";</tag>
            </item>
            <item>
              <one-of>
                 <item>no</item>
                 <item>nope</item>
                 <item>nah</item>
                 <item>uh uh</item>
               </one-of>
               <tag>out="no";</tag>
            </item>
         </one-of>
      </rule>
</grammar>

ステップ 5: 制約の管理

制約コレクションが認識のために読み込まれると、アプリでは制約の IsEnabled プロパティを true または false に設定して、認識操作でどの制約を有効にするかを管理できます。既定の設定は true です。

通常は、認識操作ごとに制約を読み込んでアンロードしコンパイルするよりも、いったん読み込んでから必要に応じて有効または無効にする方が効率的です。必要に応じて IsEnabled プロパティを使います。

制約の数を制限すると、音声認識エンジンが音声入力の一致を探すときに必要となるデータ量を制限できます。これにより、音声認識のパフォーマンスと精度の両方が向上します。

現在の認識操作のコンテキストでアプリが想定できる語句に基づいて、有効にする制約を決定します。たとえば、現在のアプリのコンテキストが色を表示することである場合、おそらく動物の名前を認識する制約を有効にする必要はありません。

発声できる内容をユーザーに伝えるには、SpeechRecognizer.UIOptions プロパティを使って設定できる、SpeechRecognizerUIOptions.AudiblePrompt プロパティと SpeechRecognizerUIOptions.ExampleText プロパティを使います。音声認識の操作時に何を発声できるか準備しておくことによって、アクティブな制約に一致する語句をユーザーが発声する可能性が高まります。

関連トピック

音声操作への反応

デザイナー向け

音声認識の設計ガイドライン