Compartilhar via


Entrada de voz no Unity

Cuidado

Antes de começar, considere usar o plug-in do Unity para o SDK dos Serviços de Fala Cognitiva. O plug-in tem melhores resultados de precisão de fala e fácil acesso à decodificação de fala para texto, bem como recursos avançados de fala, como diálogo, interação baseada em intenção, tradução, síntese de texto para fala e reconhecimento de fala em linguagem natural. Para começar, confira o exemplo e a documentação.

O Unity expõe três maneiras de adicionar entrada de voz ao seu aplicativo Unity, as duas primeiras das quais são tipos de PhraseRecognizer:

  • O KeywordRecognizer fornece ao seu aplicativo uma matriz de comandos de cadeia de caracteres para escutar
  • O fornece GrammarRecognizer ao seu aplicativo um arquivo SRGS definindo uma gramática específica para escutar
  • O DictationRecognizer permite que seu aplicativo ouça qualquer palavra e forneça ao usuário uma nota ou outra exibição de sua fala

Observação

O ditado e o reconhecimento de frases não podem ser tratados ao mesmo tempo. Se um GrammarRecognizer ou KeywordRecognizer estiver ativo, um DictationRecognizer não poderá estar ativo e vice-versa.

Habilitando a funcionalidade do Voice

A funcionalidade Microfone deve ser declarada para que um aplicativo use a entrada de voz.

  1. No Editor do Unity, navegue até Editar > Player de configurações do > projeto
  2. Selecione a guia da Windows Store
  3. Na seção Recursos de configurações > de publicação, verifique o recurso Microfone
  4. Conceder permissões ao aplicativo para acesso ao microfone em seu dispositivo HoloLens
    • Você será solicitado a fazer isso na inicialização do dispositivo, mas se você acidentalmente clicou em "não", poderá alterar as permissões nas configurações do dispositivo

Reconhecimento de frase

Para permitir que seu aplicativo ouça frases específicas faladas pelo usuário e, em seguida, execute alguma ação, você precisa:

  1. Especifique quais frases ouvir usando um KeywordRecognizer ou GrammarRecognizer
  2. Manipular o OnPhraseRecognized evento e executar a ação correspondente à frase reconhecida

Reconhecimento de palavras-chave

Namespace: UnityEngine.Windows.Speech
Tipos: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Precisaremos de algumas instruções using para economizar algumas teclas:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

Em seguida, vamos adicionar alguns campos à sua classe para armazenar o reconhecedor e o dicionário de ação de palavra-chave>:

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

Agora adicione uma palavra-chave ao dicionário, por exemplo, em de um Start() método. Estamos adicionando a palavra-chave "activate" neste exemplo:

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

Crie o reconhecedor de palavras-chave e diga a ele o que queremos reconhecer:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

Agora inscreva-se para o OnPhraseRecognized evento

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Um exemplo de manipulador é:

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    System.Action keywordAction;
    // if the keyword recognized is in our dictionary, call that Action.
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
        keywordAction.Invoke();
    }
}

Finalmente, comece a reconhecer!

keywordRecognizer.Start();

Gramática

Namespace: UnityEngine.Windows.Speech
Tipos: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

O GrammarRecognizer será usado se você estiver especificando sua gramática de reconhecimento usando SRGS. Isso pode ser útil se seu aplicativo tiver mais do que apenas algumas palavras-chave, se você quiser reconhecer frases mais complexas ou se quiser ativar e desativar facilmente conjuntos de comandos. Consulte: Criar gramáticas usando SRGS XML para obter informações sobre o formato do arquivo.

Depois de ter sua gramática SRGS e ela estiver em seu projeto em uma pasta StreamingAssets:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

Crie um GrammarRecognizer e passe o caminho para o seu arquivo SRGS:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

Agora inscreva-se para o OnPhraseRecognized evento

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Você receberá um retorno de chamada contendo informações especificadas em sua gramática SRGS, que você pode manipular adequadamente. A maioria das informações importantes será fornecida na semanticMeanings matriz.

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

Finalmente, comece a reconhecer!

grammarRecognizer.Start();

Ditado

Namespace: UnityEngine.Windows.Speech
Tipos: DictationRecognizer, SpeechError, SpeechSystemStatus

Use o DictationRecognizer para converter a fala do usuário em texto. O DictationRecognizer expõe a funcionalidade de ditado e dá suporte ao registro e à escuta de eventos de hipótese e frase concluída, para que você possa fornecer comentários ao usuário enquanto ele fala e depois. Start() e Stop() métodos, respectivamente, habilitam e desabilitam o reconhecimento de ditado. Depois de feito com o reconhecedor, ele deve ser descartado usando Dispose() para liberar os recursos que usa. Ele liberará esses recursos automaticamente durante a coleta de lixo a um custo de desempenho extra se eles não forem liberados antes disso.

Existem apenas algumas etapas necessárias para começar a usar o ditado:

  1. Crie um novo DictationRecognizer
  2. Manipular eventos de Ditado
  3. Iniciar o DictationRecognizer

Habilitando a capacidade de ditado

Os recursos de Cliente de Internet e Microfone devem ser declarados para que um aplicativo use o ditado:

  1. No Editor do Unity, vá para Editar > configurações do > projeto Player
  2. Selecione na guia Windows Store
  3. Na seção Recursos de Configurações > de Publicação, verifique o recurso InternetClient
    • Opcionalmente, se você ainda não ativou o microfone, verifique a funcionalidade Microfone
  4. Conceda permissões ao aplicativo para acesso ao microfone em seu dispositivo HoloLens, caso ainda não tenha feito isso
    • Você será solicitado a fazer isso na inicialização do dispositivo, mas se você acidentalmente clicou em "não", poderá alterar as permissões nas configurações do dispositivo

Reconhecimento de ditado

Crie um DictationRecognizer da seguinte forma:

dictationRecognizer = new DictationRecognizer();

Há quatro eventos de ditado que podem ser assinados e manipulados para implementar o comportamento de ditado.

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. DictationError

Resultado do ditado

Esse evento é acionado depois que o usuário faz uma pausa, normalmente no final de uma frase. A cadeia de caracteres completa reconhecida é retornada aqui.

Primeiro, inscreva-se no DictationResult evento:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Em seguida, manipule o retorno de chamada DictationResult:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

Hipótese de ditado

Esse evento é disparado continuamente enquanto o usuário está falando. À medida que o reconhecedor escuta, ele fornece texto do que ouviu até agora.

Primeiro, inscreva-se no DictationHypothesis evento:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Em seguida, manipule o retorno de chamada DictationHypothesis:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

DitadoCompleto

Esse evento é acionado quando o reconhecedor é interrompido, seja de Stop() sendo chamado, ocorrendo um tempo limite ou algum outro erro.

Primeiro, inscreva-se no DictationComplete evento:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Em seguida, manipule o retorno de chamada DictationComplete:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

Erro de ditado

Esse evento é acionado quando ocorre um erro.

Primeiro, inscreva-se no DictationError evento:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Em seguida, manipule o retorno de chamada DictationError:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

Depois de assinar e manipular os eventos de ditado com os quais você se importa, inicie o reconhecedor de ditado para começar a receber eventos.

dictationRecognizer.Start();

Se você não quiser mais manter o DictationRecognizer por perto, precisará cancelar a assinatura dos eventos e descartar o DictationRecognizer.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

Dicas

  • Start() e Stop() métodos, respectivamente, habilitam e desabilitam o reconhecimento de ditado.
  • Depois de feito com o reconhecedor, ele deve ser descartado usando Dispose() para liberar os recursos que usa. Ele liberará esses recursos automaticamente durante a coleta de lixo a um custo de desempenho extra se eles não forem liberados antes disso.
  • Os tempos limite ocorrem após um período de tempo definido. Você pode verificar esses tempos limite no DictationComplete evento. Há dois tempos limite a serem considerados:
    1. Se o reconhecedor for iniciado e não ouvir nenhum áudio nos primeiros cinco segundos, ele atingirá o tempo limite.
    2. Se o reconhecedor tiver dado um resultado, mas ouvir silêncio por 20 segundos, ele atingirá o tempo limite.

Usando o reconhecimento de frases e o ditado

Se você quiser usar o reconhecimento de frase e o ditado em seu aplicativo, precisará desligar totalmente um antes de iniciar o outro. Se você tiver vários KeywordRecognizers em execução, poderá desligá-los todos de uma vez com:

PhraseRecognitionSystem.Shutdown();

Você pode chamar Restart() para restaurar todos os reconhecedores ao estado anterior depois que o DictationRecognizer for interrompido:

PhraseRecognitionSystem.Restart();

Você também pode simplesmente iniciar um KeywordRecognizer, que também reiniciará o PhraseRecognitionSystem.

Entrada de voz no Realidade Misturada Toolkit

Você pode encontrar exemplos do MRTK para entrada de voz nas seguintes cenas de demonstração:

Próximo ponto de verificação de desenvolvimento

Se você estiver seguindo a jornada de ponto de verificação de desenvolvimento do Unity que apresentamos, sua próxima tarefa é explorar os recursos e as APIs da plataforma Realidade Misturada:

Você sempre pode voltar para os pontos de verificação de desenvolvimento do Unity a qualquer momento.