导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

为 Windows Phone 8 添加、加载和预加载语法

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

语音识别器需要一种或多种语法来执行识别。

本主题包括以下部分。

要向语音识别器提供语法,您可以将语法添加到语音识别器的语法集 (SpeechGrammarSet)。Windows.Phone.Speech.Recognition API 提供了以下三种方法,用于将语法添加到语音识别器的语法集中。每种方法都将从不同类型的语法创建一个 SpeechGrammar 实例,然后将其添加到语音识别器的语法集中。

  • M:Windows.Phone.Speech.Recognition.SpeechGrammarSet.AddGrammarFromList(System.String,Windows.Foundation.Collections.IIterable`1) 添加列表语法。

  • SpeechGrammarSetAddGrammarFromPredefinedType(String, SpeechPredefinedGrammar) 添加听写或 Web 搜索语法。

  • SpeechGrammarSetAddGrammarFromUri(String, Uri) 从 XML 文件中添加语音识别语法规范 (SRGS) 语法。

应用在语音识别器开始识别之前,向语音识别器的语法集添加一种或多种语法。语音识别器的每一个实例仅拥有一个语法集。语音识别器将在识别操作开始时加载其语法集,除非该语法集已被预先加载。如果识别器的语法集为空,默认情况下,语音识别器会在识别开始时加载预定义的听写语法。

您仅可将语法的特定组合添加到语法集,如下所示:

  • 语法集只可以包含一种听写语法或 Web 搜索语法。此外,如果语法集已包含听写或 Web 搜索语法,它无法再包含任何列表语法或 SRGS 语法。

  • 如果语法集包含一种以上的语法,每一种语法必须为列表语法或 SRGS 语法。

这意味着一个语音识别器的实例可以加载其语法集,条件是它包含以下任一内容:

  • 一种听写语法或一种 Web 搜索语法。

  • 一种或多种列表语法或 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();
}

警告说明警告:

语法集只可以包含一种听写语法或 Web 搜索语法。由于听写和 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 实例并将两种 SRGS 语法添加到语音识别器的语法集中。CitiesList 语法用于识别城市的名称,且 YesNo 语法用于识别“是”或“否”来确认用户的城市选择。由于 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 语法的“生成操作”属性设置为“内容”,并将“复制到输出目录”属性设置为“如果较新则复制”。添加语法后,使用本示例中提供的路径语法来引用该语法。

  • 您不能将 SRGS 语法添加到已包含听写语法或 Web 搜索语法的语法集中。

  • SpeechGrammarSetAddGrammarFromUri(String, Uri) 方法的参数中指定的语法文档必须是本地的。您不能引用位于 Internet 上的语法。

  • 对符合 SRGS 规则的基于 XML 的语法文档使用 .grxml 文件扩展名,这是公认惯例。

借助加载到语音识别器的语法集的多种语法,您的应用可以在用户导航通过应用时,选择性地启用或禁用这些语法。这可以确保您的应用仅侦听与当前应用上下文相关的内容。有关更多信息,请参见为 Windows Phone 8 管理加载的语法以优化识别

显示:
© 2014 Microsoft