情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の文法の追加、読み込み、プリロード

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

音声認識エンジンが認識を実行するには、1 つ以上の文法が必要です。

このトピックは、次のセクションで構成されています。

音声認識エンジンに文法を提供するには、音声認識エンジンの文法セット (SpeechGrammarSet) に文法を追加します。Windows.Phone.Speech.Recognition API で提供される次の 3 つのメソッドを使用して、音声分析エンジンの文法セットに文法を追加できます。各メソッドは、異なる種類の文法から SpeechGrammar インスタンスを作成し、音声認識エンジンの文法セットに追加します。

  • M:Windows.Phone.Speech.Recognition.SpeechGrammarSet.AddGrammarFromList(System.String,Windows.Foundation.Collections.IIterable`1) は、リスト文法を追加します。

  • SpeechGrammarSetAddGrammarFromPredefinedType(String, SpeechPredefinedGrammar) は、ディクテーションまたは Web 検索文法を追加します。

  • SpeechGrammarSetAddGrammarFromUri(String, Uri) は、XML ファイルから SRGS (Speech Recognition Grammar Specification) 文法を追加します。

アプリは、音声認識エンジンが認識処理を開始する前に、音声認識エンジンの文法セットに 1 つ以上の文法を追加します。音声認識エンジンの各インスタンスには、1 つの文法セットしかありません。音声認識エンジンは認識処理を開始する時点で、文法セットを読み込みます (プリロードされている場合は除きます)。文法セットが空の場合、音声認識エンジンは認識の開始時に定義済みのディクテーション文法を既定で読み込みます。

文法セットに追加できるのは、次のように、文法の特定の組み合わせに限られます。

  • 1 つの文法セットには、1 つのディクテーション文法または Web 検索文法しか含めることができません。また、文法セットにディクテーション文法または Web 検索文法が含まれる場合、その文法セットにリスト文法または SRGS 文法を含めることはできません。

  • 文法セットに複数の文法が含まれる場合、それぞれの文法は、リスト文法または SRGS 文法である必要があります。

つまり、音声認識エンジンのインスタンスが読み込むことのできる文法セットは、次のいずれかを含んでいます。

  • 1 つのディクテーション文法、または 1 つの Web 検索文法。

  • 1 つ以上のリスト文法または SRGS 文法。

文法セットに大容量または多数の文法が含まれる場合、音声認識エンジンが文法セットを読み込むのに時間がかかり、認識の開始が遅れる可能性があります。この遅延を防ぐため、認識処理の開始に先立って、SpeechRecognizerPreloadGrammarsAsync() メソッドを使用して文法をプリロードすることができます。このメソッドは、文法セットに含まれるすべての文法の読み込みを、認識開始の一環としてではなく、個別の処理として実行します。

SpeechRecognizerPreloadGrammarsAsync() を使用して、認識処理の開始に先立って文法セットを読み込む例を次に示します。

// Declare a SpeechRecognizerUI object global to the page or app.
    SpeeechRecognizerUI recoWithUI;

    public async void InitializeRecognition()
    {
      // Initialize objects ahead of time to avoid delays when starting recognition.
      recoWithUI = new SpeechRecognizerUI();

      // Initialize a URI with a path to the SRGS-compliant XML file.
      Uri orderPizza = new Uri("ms-appx:///OrderPizza.grxml", UriKind.Absolute);

      // Add an SRGS-compliant XML grammar to the grammar set.
      recoWithUI.Recognizer.Grammars.AddGrammarFromUri("PizzaGrammar", orderPizza);

      // Preload the grammar set.
      await recoWithUI.Recognizer.PreloadGrammarsAsync();

      // Display text to prompt the user's input.
      recoWithUI.Settings.ListenText = "What kind of pizza do you want?";

      // Display an example of ideal expected input.
      recoWithUI.Settings.ExampleText = "Large combination with Italian sausage";
    }

    // Start recognition when the user clicks this button.
    private async void ButtonSR_Click(object sender, EventArgs e)
    {
      SpeechRecognitionUIResult recoResult = await recoWithUI.RecognizeWithUIAsync();
    }

SpeechRecognizerUI インスタンスを作成し、SpeechRecognizerUIRecognizeWithUIAsync() メソッドを呼び出して音声認識を開始する例を次に示します。この音声認識エンジンの文法セットには文法が追加されていないため、音声認識エンジンは認識処理に先立って、定義済みのディクテーション文法を既定で読み込みます。

private async void ButtonSR_Click(object sender, RoutedEventArgs e)
{
  SpeechRecognizerUI recoWithUI = new SpeechRecognizerUI();

  // Load the pre-defined dictation grammar by default
  // and start recognition.
  SpeechRecognitionUIResult recoResult = await recoWithUI.RecognizeWithUIAsync();

  // Do something with the recognition result
  MessageBox.Show(string.Format("You said {0}.", recoResult.RecognitionResult.Text));
}

SpeechGrammarSetAddGrammarFromPredefinedType(String, SpeechPredefinedGrammar) メソッドを使用して、ディクテーション文法を明示的に読み込むことも可能です。

既定で読み込み可能なディクテーション文法とは異なり、Web 検索文法は、認識を開始する前に音声認識エンジンの文法セットに追加する必要があります。AddGrammarFromPredefinedType メソッドを使用して、音声認識エンジンのインスタンスに Web 検索文法を追加する例を次に示します。このメソッドの呼び出しでは、SpeechPredefinedGrammar 列挙体から取得した文法名と WebSearch 値が渡されます。SpeechRecognizerUIRecognizeWithUIAsync() が呼び出されると、音声認識エンジンは文法セットから Web 検索文法を読み込み、認識を開始します。

private async void ButtonWeatherSearch_Click(object sender, RoutedEventArgs e)
{
    SpeechRecognizerUI recoWithUI = new SpeechRecognizerUI();

  // Add the pre-defined web search grammar to the grammar set.
  recoWithUI.Recognizer.Grammars.AddGrammarFromPredefinedType ("weatherSearch",
  SpeechPredefinedGrammar.WebSearch);

  // Display text to prompt the user's input.
  recoWithUI.Settings.ListenText = "Say what you want to search for";

  // Display an example of ideal expected input.
    recoWithUI.Settings.ExampleText = @"Ex. 'weather for London'";

  // Load the grammar set and start recognition.
    SpeechRecognitionUIResult result = await recoWithUI.RecognizeWithUIAsync();
}

注意注意:

1 つの文法セットには、ディクテーション文法または Web 検索文法のどちらか 1 つしか含めることができません。ディクテーション文法と Web 検索文法は、認識をリモートで実行します。そのため、認識を電話でローカルに実行する文法 (リスト文法または SRGS 文法) を含む文法セットにこれらを含めることはできません。

文字列配列からプログラムによりリスト文法を作成し、音声認識エンジンの文法セットに追加する例を次に示します。M:Windows.Phone.Speech.Recognition.SpeechGrammarSet.AddGrammarFromList(System.String,Windows.Foundation.Collections.IIterable`1) メソッドは、文法名および文字列配列を引数として使用します。SpeechRecognizerUIRecognizeWithUIAsync() が呼び出されると、音声認識エンジンは文法セットからリスト文法を読み込み、認識を開始します。

private async void ButtonSR_Click(object sender, RoutedEventArgs e)
{
    SpeechRecognizerUI recoWithUI = new SpeechRecognizerUI();

    // You can create this string dynamically, for example from a movie queue.
    string[] movies = { "Play The Cleveland Story", "Play The Office",
      "Play Psych", "Play Breaking Bad", "Play Valley of the Sad", "Play Shaking Mad" };

    // Create a grammar from the string array and add it to the grammar set.
    recoWithUI.Recognizer.Grammars.AddGrammarFromList("myMovieList", movies);

    // Display an example of ideal expected input.
    recoWithUI.Settings.ExampleText = @"ex. 'Play New Mocumentaries'";

    // Load the grammar set and start recognition.
    SpeechRecognitionUIResult result = await recoWithUI.RecognizeWithUIAsync();

    // Play movie given in result.Text
}

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

  • M:Windows.Phone.Speech.Recognition.SpeechGrammarSet.AddGrammarFromList(System.String,Windows.Foundation.Collections.IIterable`1 を連続的に呼び出して、複数のリスト文法を作成し、音声認識エンジンの文法セットに読み込むことができます)。

  • 文字列値の IEnumerable<string> を実装する任意のコレクションを使用できます。

  • ディクテーション文法または Web 検索文法を含む文法セットに、リスト文法を追加することはできません。

音声認識エンジンのインスタンスに SRGS 文法を追加するには、SpeechGrammarSetAddGrammarFromUri(String, Uri) メソッドを使用します。文法名と、SRGS 文法ファイルの絶対参照を作成する URI を渡します。

新しい SpeechRecognizerUI インスタンスを作成し、音声認識エンジンの文法セットに 2 つの SRGS 文法を追加する例を次に示します。CitiesList 文法は都市名の認識に使用し、YesNo 文法はユーザーが選択した都市名の確認に対する "yes" または "no" の認識に使用します。CitiesList 文法には大量の都市名が含まれいるので、この例では認識を開始するときの遅延を防ぐため、この文法をプリロードしています。その後、期待される音声入力の例を示してユーザーに入力を促すためのテキストを表示します。SpeechRecognizerUIRecognizeWithUIAsync() の呼び出しによって認識が開始されます。

private async void CityPicker_Click(object sender, RoutedEventArgs e)
{

  // Initialize a SpeechRecognizerUI object.
  SpeechRecognizerUI recoWithUI = new SpeechRecognizerUI();

  // Initialize URIs with paths to the SRGS-compliant XML files.
  Uri citiesGrammar = new Uri("ms-appx:///CitiesList.grxml", UriKind.Absolute);
  Uri yesNoGrammar = new Uri("ms-appx:///YesNo.grxml", UriKind.Absolute);

  // Add the SRGS grammars to the grammar set.
  recoWithUI.Recognizer.Grammars.AddGrammarFromUri("cities", citiesGrammar);
  recoWithUI.Recognizer.Grammars.AddGrammarFromUri("yesNo", yesNoGrammar);

  // Preload the SRGS grammars to avoid possible delays while loading.
  await recoWithUI.Recognizer.PreloadGrammarsAsync();

  // Disable the yesNo grammar, it won't be needed for the first recognition.
  recoWithUI.Recognizer.Grammars["yesNo"].Enabled = false;

  // Display text to prompt the user's input.
  recoWithUI.Settings.ListenText = "Fly from which city?";

  // Display an example of ideal expected input.
  recoWithUI.Settings.ExampleText = @"Ex. 'Rome', 'Sao Paulo', 'Tokyo'";

  // Start recognition for the name of the origin city.
  SpeechRecognitionUIResult cityName = await recoWithUI.RecognizeWithUIAsync();

  // Display text to prompt the user to confirm the origin city.
  recoWithUI.Settings.ListenText = string.Format("Fly from" + cityName.RecognitionResult.Semantics["fromCity"].Value + "?");

  // Display an example of ideal expected input.
  recoWithUI.Settings.ExampleText = @"Ex. 'Yes', 'No'";
            
  // Disable the cities grammar, enable the yesNo grammar.
  recoWithUI.Recognizer.Grammars["cities"].Enabled = false;
  recoWithUI.Recognizer.Grammars["yesNo"].Enabled = true;

  // Start recognition for the origin city confirmation.
  SpeechRecognitionUIResult confirm = await recoWithUI.RecognizeWithUIAsync();

  // Do something with the confirmation result.
}

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

  • SpeechGrammarSetAddGrammarFromUri(String, Uri) を連続的に呼び出して、複数の SRGS 文法を作成し、音声認識エンジンの文法セットに読み込むことができます。

  • SRGS 文法が正しく配置されたかどうかを確認するには、ソリューションにこの文法を追加します。ソリューション エクスプローラーで Windows Phone アプリケーション プロジェクトを選択します。[プロジェクト] メニューの [既存の項目の追加] をクリックし、SRGS 文法を追加します。SRGS 文法の [ビルド アクション] プロパティを [コンテンツ] に設定し、[出力ディレクトリにコピー] プロパティを [新しい場合はコピーする] に設定します。文法を追加した後、この例で示されているパス構文を使用して文法を参照します。

  • ディクテーション文法または Web 検索文法を含む文法セットに、SRGS 文法を追加することはできません。

  • SpeechGrammarSetAddGrammarFromUri(String, Uri) メソッドの引数に指定する文法ドキュメントは、ローカルでなければなりません。インターネットに存在する文法を参照することはできません。

  • SRGS 規則に準拠する XML ベースの文法ドキュメントに .grxml ファイル拡張子を使うことは許容されています。

音声認識エンジンの文法セットに複数の文法を読み込み、アプリ内でのユーザーの移動に応じて、アプリでそれらの文法を選択的に有効または無効にすることができます。これにより、アプリで現在のアプリ コンテキストに関連した音声だけを確実に待機することができます。詳細については、「読み込み済みの文法の管理による Windows Phone 8 の認識の最適化」を参照してください。

表示: