Compartilhar via


Como habilitar o ditado contínuo

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Saiba como capturar e reconhecer entrada de fala de ditado contínuo de formato longo.

Observação  Comandos de voz e reconhecimento de fala não têm suporte em aplicativos da Windows Store no Windows 8 e no Windows 8.1.

 

Em [Como ditar respostas de fala curtas], você aprendeu como capturar e reconhecer entrada de fala relativamente curta usando os métodos recognizeAsync ou recognizeWithUIAsync de um objeto SpeechRecognizer. Por exemplo, ao redigir uma mensagem SMS curta ou ao fazer uma pergunta.

Para sessões de reconhecimento de fala contínuas mais longas, como ditado ou email, use a propriedade continuousRecognitionSession de um SpeechRecognizer para obter um objeto SpeechContinuousRecognitionSession.

O que você precisa saber

Tecnologias

Pré-requisitos

Este tópico complementa o Guia de início rápido: reconhecimento de fala e faz referência ao "Cenário de Ditado Contínuo" do [Exemplo de Fala e TTS]. Você não precisa do exemplo para entender os principais pontos e trechos de código explicados aqui, mas ele permite que você experimente livremente o código.

Para concluir este tutorial, examine estes tópicos para se familiarizar com as tecnologias discutidas aqui.

Instruções

Configurar

Seu aplicativo precisa de alguns objetos para gerenciar uma sessão de ditado contínuo:

  • Uma instância de um objeto SpeechRecognizer.
  • Uma referência a um dispatcher de interface do usuário para atualizar a interface do usuário durante o ditado.
  • Uma maneira de acompanhar as palavras acumuladas faladas pelo usuário.

Aqui, declaramos uma instância SpeechRecognizer como um campo particular da classe code-behind. Seu aplicativo precisa armazenar uma referência em outro lugar se você quiser que o ditado contínuo persista além de uma única página XAML (Extensible Application Markup Language).

N/A

Durante o ditado, o reconhecedor aciona eventos de um thread em segundo plano. Como um thread em segundo plano não pode atualizar diretamente a interface do usuário em XAML, seu aplicativo deve usar um dispatcher para atualizar a interface do usuário em resposta a eventos de reconhecimento.

Aqui, nós declaramos um campo particular que será inicializado posteriormente com o dispatcher de interface do usuário.


N/A

Para acompanhar o que o usuário está dizendo, você precisa manipular eventos de reconhecimento acionados pelo reconhecedor de fala. Esses eventos fornecem os resultados do reconhecimento de blocos de expressões do usuário.

Aqui, temos todos os resultados de reconhecimento obtidos durante a sessão. Novos resultados são acrescentados conforme elas são processadas.

N/A

Inicialização

Durante a inicialização do reconhecimento de fala contínua, você deve:

  • Buscar o dispatcher do thread de interface do usuário se você atualizar a interface do usuário do aplicativo nos manipuladores de eventos de reconhecimento contínuo.
  • Inicializar o reconhecedor de fala.
  • Compilar a gramática de ditado interna. Observação   O reconhecimento de fala requer pelo menos uma restrição para definir um vocabulário reconhecível. Se nenhuma restrição for especificada, uma gramática de ditado predefinida será usada. Consulte o Guia de início rápido: reconhecimento de fala.  
  • Configurar os ouvintes de eventos para eventos de reconhecimento.

Inicializamos o reconhecimento de fala no evento de página OnNavigatedTo.

  1. Como os eventos acionados pelo reconhecedor de fala ocorrem em um thread em segundo plano, crie uma referência ao dispatcher para atualizações no thread de interface do usuário. OnNavigatedTo é sempre invocado no thread de interface do usuário.

    N/A
    
  2. Em seguida, inicializamos a instância SpeechRecognizer.

    N/A
    
  3. Depois adicionamos e compilamos a gramática que define todas as palavras e frases que podem ser reconhecidas pelo SpeechRecognizer.

    Se você não especificar explicitamente uma gramática, será usada uma gramática de ditado predefinida por padrão. Normalmente, a gramática padrão é melhor para ditado geral.

    Aqui, chamamos CompileConstraintsAsync imediatamente sem adicionar uma gramática.

    N/A
    

Manipular eventos de reconhecimento

Aqui, você pode capturar uma única expressão ou frase curta chamando recognizeAsync ou recognizeWithUIAsync. No entanto, queremos capturar uma sessão de reconhecimento contínua mais longa.

Para isso, especificamos ouvintes de eventos para serem executados em segundo plano conforme o usuário fala e definimos manipuladores para criar a cadeia de caracteres de ditado.

Em seguida, usamos a propriedade continuousRecognitionSession de nosso reconhecedor para obter um objeto SpeechContinuousRecognitionSession que forneça métodos e eventos para gerenciar uma sessão de reconhecimento contínua.

Dois eventos em particular são essenciais:

  • resultGenerated, que ocorre quando o reconhecedor gerou alguns resultados.
  • completed, que ocorre quando a sessão de reconhecimento contínua termina.

O evento resultGenerated é acionado conforme o usuário fala. O reconhecedor escuta o usuário de forma contínua e periodicamente aciona um evento que passa um bloco de entrada de fala. Você deve examinar a entrada de fala usando a propriedade result do argumento do evento e executar a ação apropriada no manipulador de eventos, por exemplo, acrescentando o texto a um objeto StringBuilder.

Como uma instância de SpeechRecognitionResult, a propriedade result é útil para determinar se você deseja aceitar a entrada de fala:

  • status indica se o reconhecimento foi executado com êxito. Pode haver falha no reconhecimento por vários motivos.
  • confidence indica a confiança relativa com que o reconhecedor compreendeu as palavras corretas.
  1. Aqui, registramos o manipulador do evento de reconhecimento contínuo resultGenerated no evento de página onNavigatedTo.

    N/A
    
  2. Em seguida, verificamos a propriedade confidence. Se o valor de confiança for Medium ou melhor, anexamos o texto. Também atualizamos a interface do usuário conforme coletamos entradas.

    Observação  O evento resultGenerated é acionado em um thread em segundo plano que não pode atualizar a interface do usuário diretamente. Se um manipulador precisar atualizar a interface do usuário (como faz [Exemplo de fala e TTS]), você deve expedir as atualizações para o thread de interface do usuário por meio do método runAsync do dispatcher.

     

    N/A
    
  3. Depois manipulamos o evento completed, que indica o final do ditado contínuo.

    A sessão termina quando você chama os métodos stopAsync ou cancelAsync (descritos na próxima seção). A sessão também pode terminar quando ocorre um erro, ou quando o usuário para de falar. Verifique a propriedade status do argumento do evento para determinar por que a sessão terminou (SpeechRecognitionResultStatus).

    Aqui, registramos o manipulador do evento de reconhecimento contínuo completed no evento de página onNavigatedTo.

    N/A
    
  4. O manipulador de eventos verifica a propriedade Status para determinar se o reconhecimento foi executado com êxito. Ele também manipula o caso em que o usuário parou de falar. Frequentemente, TimeoutExceeded é considerado reconhecimento bem-sucedido porque significa que o usuário terminou de falar. Você deve manipular esse caso no seu código para obter uma boa experiência.

    Observação  o evento resultGenerated é acionado em um thread em segundo plano que não pode atualizar a interface do usuário diretamente. Se um manipulador precisar atualizar a interface do usuário (como faz [Exemplo de fala e TTS]), você deve expedir as atualizações para o thread de interface do usuário por meio do método runAsync do dispatcher.

     

    N/A
    

Fornecer feedback de reconhecimento contínuo

Quando as pessoas conversam, elas frequentemente dependem do contexto para entender completamente o que está sendo dito. Da mesma forma, o reconhecedor de fala precisa de contexto para fornecer resultados de reconhecimento de alta confiabilidade. Por exemplo, sozinhas, as palavras "acento" e "assento" não podem ser diferenciadas até que mais contexto seja coletado das palavras adjacentes. Até que o reconhecedor tenha alguma confiança de que uma palavra, ou palavras, foi reconhecida corretamente, ele não acionará um evento resultGenerated.

Isso pode resultar em uma experiência longe da ideal para o usuário, pois ele continua falando e nenhum resultado é fornecido até que o reconhecedor tenha confiança o suficiente para acionar um evento resultGenerated.

Manipule o evento hypothesisGenerated para melhorar essa aparente falta de capacidade de resposta. Esse evento é acionado sempre que o reconhecedor gera um novo conjunto de possíveis correspondências para a palavra que está sendo processada. O argumento do evento fornece uma propriedade hypothesis que contém as correspondências atuais. Mostre as correspondências ao usuário conforme ele continua falando e assegure que o processamento ainda está ativo. Assim que a confiança for alta e um resultado de reconhecimento tiver sido determinado, substitua os resultados hypothesis temporários pelo result final fornecido no evento resultGenerated.

Aqui, acrescentamos o texto hipotético e reticências ("...") ao valor atual da caixa de texto de saída. O conteúdo da caixa de texto é atualizado conforme novas hipóteses são geradas e até que os resultados finais sejam obtidos do evento resultGenerated.

N/A

Iniciar e parar o reconhecimento

Antes de iniciar uma sessão de reconhecimento, verifique o valor da propriedade state do reconhecedor de fala. O reconhecedor de fala deve estar em um estado Idle.

Depois de verificar o estado do reconhecedor de fala, começamos a sessão chamando o método startAsync da propriedade continuousRecognitionSession do reconhecedor de fala.

N/A

O reconhecimento pode ser interrompido de duas maneiras:

  • stopAsync permite que qualquer evento de reconhecimento pendente seja concluído (resultGenerated continua sendo acionado até que todas as operações de reconhecimento pendentes sejam concluídas).

  • cancelAsync finaliza a sessão de reconhecimento imediatamente e descarta qualquer resultado pendente.

Depois de verificar o estado do reconhecedor de fala, interrompemos a sessão chamando o método cancelAsync da propriedade continuousRecognitionSession do reconhecedor de fala.

N/A

Observação  

Um evento resultGenerated pode ocorrer após uma chamada para cancelAsync.

Por causa do multithreading, um evento resultGenerated ainda pode permanecer na pilha quando cancelAsync é chamado. Nesse caso, o evento resultGenerated ainda é acionado.

Se você definir qualquer campo particular ao cancelar a sessão de reconhecimento, sempre confirme seus valores no manipulador resultGenerated. Por exemplo, não suponha que um campo será inicializado em seu manipulador se você defini-lo como nulo ao cancelar a sessão.

 

Resumo e próximas etapas

Aqui, você aprendeu a manipular ditado de fala irrestrito de formato longo, que é útil para a criação de emails ou documentos.

Em seguida, você verá como escutar uma série contínua de comandos verbais, como aqueles em um videogame. Consulte [Como escutar frases contínuas de uma lista].

Tópicos relacionados

Respondendo a interações de fala

Designers

Diretrizes para design de controle por voz