Compartilhar via


Definir restrições de reconhecimento personalizadas

Saiba como definir e usar restrições personalizadas para reconhecimento de fala.

APIs importantes: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint

O reconhecimento de fala requer pelo menos uma restrição para definir um vocabulário reconhecível. Se nenhuma restrição for especificada, a gramática de ditado predefinida de aplicativos universais do Windows será usada. Consulte Reconhecimento de fala.

Adicionar restrições

Use a propriedade SpeechRecognizer.Constraints para adicionar restrições a um reconhecedor de fala.

Aqui, abordamos os três tipos de restrições de reconhecimento de fala usadas em um aplicativo. (Para restrições de comando de voz da Cortana, consulte Ative um aplicativo em primeiro plano com comandos de voz por meio da Cortana.)

Cada reconhecedor de fala pode ter uma coleção de restrições. Somente essas combinações de restrições são válidas:

  • Uma restrição de tópico único (ditado ou pesquisa na Web)
  • Para o Windows 10 Fall Creators Update (10.0.16299.15) e mais recente, uma única restrição de tópico pode ser combinada com uma restrição de lista
  • Uma combinação de restrições de lista e/ou restrições de arquivo gramatical.

Importante

Chame o método SpeechRecognizer.CompileConstraintsAsync para compilar as restrições antes de iniciar o processo de reconhecimento.

Especificar uma gramática de pesquisa na Web (SpeechRecognitionTopicConstraint)

As restrições de tópico (ditado ou gramática de pesquisa na Web) devem ser adicionadas à coleção de restrições de um reconhecedor de fala.

Observação

Você pode usar um SpeechRecognitionListConstraint em conjunto com um SpeechRecognitionTopicConstraint para aumentar a precisão do ditado, fornecendo um conjunto de palavras-chave específicas do domínio que você acha que provavelmente serão usadas durante o ditado.

Aqui, adicionamos uma gramática de pesquisa na Web à coleção constraints.

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // 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.Add(webSearchGrammar);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Especificar uma restrição de lista programática (SpeechRecognitionListConstraint)

As restrições de lista devem ser adicionadas à coleção de restrições de um reconhecedor de fala.

Lembre-se bem do seguinte:

  • Você pode adicionar várias restrições de lista a uma coleção de restrições.
  • Você pode usar qualquer coleção que implemente IIterable<String> para os valores de cadeia de caracteres.

Aqui, especificamos programaticamente uma matriz de palavras como uma restrição de lista e a adicionamos à coleção de restrições de um reconhecedor de fala.

private async void YesOrNo_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

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


    // Add a list constraint to the recognizer.
    var listConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(responses, "yesOrNo");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'yes', 'no'";
    speechRecognizer.Constraints.Add(listConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Especificar uma restrição gramatical SRGS (SpeechRecognitionGrammarFileConstraint)

Os arquivos de gramática SRGS devem ser adicionados à coleção de restrições de um reconhecedor de fala.

O SRGS Versão 1.0 é a linguagem de marcação padrão do setor para a criação de gramáticas de formato XML para reconhecimento de fala. Embora os aplicativos universais do Windows forneçam alternativas ao uso do SRGS para criar gramáticas de reconhecimento de fala, você pode descobrir que o uso do SRGS para criar gramáticas produz os melhores resultados, especialmente para cenários de reconhecimento de fala mais envolvidos.

As gramáticas SRGS fornecem um conjunto completo de recursos para ajudá-lo a arquitetar uma interação de voz complexa para seus aplicativos. Por exemplo, com gramáticas SRGS, você pode:

  • Especifique a ordem em que as palavras e frases devem ser faladas para serem reconhecidas.
  • Combine palavras de várias listas e frases a serem reconhecidas.
  • Link para outras gramáticas.
  • Atribua um peso a uma palavra ou frase alternativa para aumentar ou diminuir a probabilidade de que ela seja usada para corresponder à entrada de fala.
  • Inclua palavras ou frases opcionais.
  • Use regras especiais que ajudem a filtrar entradas não especificadas ou imprevistas, como fala aleatória que não corresponde à gramática ou ruído de fundo.
  • Use a semântica para definir o que o reconhecimento de fala significa para seu aplicativo.
  • Especifique as pronúncias, seja embutida em uma gramática ou por meio de um link para um léxico.

Para obter mais informações sobre elementos e atributos SRGS, consulte a Referência XML de gramática SRGS. Para começar a criar uma gramática SRGS, consulte Como criar uma gramática XML básica.

Lembre-se bem do seguinte:

  • Você pode adicionar várias restrições de arquivo de gramática a uma coleção de restrições.
  • Use a extensão de arquivo .grxml para documentos gramaticais baseados em XML que estão em conformidade com as regras SRGS.

Este exemplo usa uma gramática SRGS definida em um arquivo chamado srgs.grxml (descrito posteriormente). Nas propriedades do arquivo, a Ação do Pacote é definida como Conteúdo com Copiar para o Diretório de Saída definido como Copiar sempre:

private async void Colors_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Add a grammar file constraint to the recognizer.
    var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Colors.grxml"));
    var grammarFileConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionGrammarFileConstraint(storageFile, "colors");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'blue background', 'green text'";
    speechRecognizer.Constraints.Add(grammarFileConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Esse arquivo SRGS (srgs.grxml) inclui marcas de interpretação semântica. Essas tags fornecem um mecanismo para retornar dados de correspondência gramatical para seu aplicativo. As gramáticas devem estar em conformidade com a especificação Semantic Interpretation for Speech Recognition (SISR) 1.0 do World Wide Web Consortium (W3C).

Aqui, ouvimos variantes de "sim" e "não".

<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>

Gerenciar restrições

Depois que uma coleção de restrições é carregada para reconhecimento, seu aplicativo pode gerenciar quais restrições estão habilitadas para operações de reconhecimento definindo a propriedade IsEnabled de uma restrição como true ou false. A configuração padrão é true.

Geralmente, é mais eficiente carregar restrições uma vez, habilitando-as e desabilitando-as conforme necessário, em vez de carregar, descarregar e compilar restrições para cada operação de reconhecimento. Use a propriedade IsEnabled , conforme necessário.

Restringir o número de restrições serve para limitar a quantidade de dados que o reconhecedor de fala precisa pesquisar e corresponder à entrada de fala. Isso pode melhorar o desempenho e a precisão do reconhecimento de fala.

Decida quais restrições estão habilitadas com base nas frases que seu aplicativo pode esperar no contexto da operação de reconhecimento atual. Por exemplo, se o contexto atual do aplicativo for exibir uma cor, você provavelmente não precisará habilitar uma restrição que reconheça os nomes dos animais.

Para solicitar ao usuário o que pode ser falado, use as propriedades SpeechRecognizerUIOptions.AudiblePrompt e SpeechRecognizerUIOptions.ExampleText, que são definidas por meio da propriedade SpeechRecognizer.UIOptions. Preparar os usuários para o que eles podem dizer durante a operação de reconhecimento aumenta a probabilidade de que eles falem uma frase que possa ser correspondida a uma restrição ativa.

Amostras