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 o 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 de dentro de um aplicativo. (Para restrições de Comando de Voz de Cortana, consulte Ativar um aplicativo em primeiro plano com Comandos de Voz através 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)

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 de restrições.

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.

Tenha em mente os seguintes pontos:

  • 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 string.

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 de gramática 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 criar gramáticas em 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 interação de voz complexa para seus aplicativos. Por exemplo, com gramáticas SRGS, você pode:

  • Especifique a ordem na qual palavras e frases devem ser faladas para serem reconhecidas.
  • Combine palavras de várias listas e frases para 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 ajudam a filtrar entradas não especificadas ou inesperadas, como fala aleatória que não corresponde à gramática ou ruído de plano de fundo.
  • Use semântica para definir o que o reconhecimento de fala significa para seu aplicativo.
  • Especifique pronúncias, embutidas em uma gramática ou por meio de um link para um léxico.

Para obter mais informações sobre elementos e atributos do SRGS, consulte a Referência XML de Gramática SRGS . Para começar a criar uma gramática SRGS, consulte How to Create a Basic XML Grammar.

Tenha em mente os seguintes pontos:

  • Você pode adicionar várias restrições de arquivo gramatical a uma coleção de restrições.
  • Use a extensão de arquivo .grxml para documentos gramaticais baseados em XML que estejam em conformidade com as regras do 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 o Diretório de Cópia para 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 informações sobre correspondência gramatical ao 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 são habilitadas para operações de reconhecimento definindo a propriedade IsEnabled de uma restrição como true ou false. A configuração padrão é verdadeira.

Geralmente, é mais eficiente carregar restrições uma vez, habilitando 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 para 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 pode ser correspondida a uma restrição ativa.

  • Interações de fala

Samples