Partilhar via


Entrada de voz no Unity

Atenção

Antes de começar, considere usar o plug-in Unity para o SDK dos Serviços de Fala Cognitiva. O plugin 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.

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

  • O KeywordRecognizer fornece ao seu aplicativo uma matriz de comandos de cadeia de caracteres para ouvir
  • O GrammarRecognizer fornece ao seu aplicativo um arquivo SRGS que define uma gramática específica para ouvir
  • 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

Nota

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 o recurso de voz

O recurso Microfone deve ser declarado para que um aplicativo use a entrada de voz.

  1. No Editor Unity, navegue até Editar > Player de Configurações > do Projeto
  2. Selecione o separador Loja Windows
  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
    • Ser-lhe-á pedido para o fazer no arranque do dispositivo, mas se acidentalmente clicou em "não", pode alterar as permissões nas definições do dispositivo

Reconhecimento de Frases

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 evento e tomar a OnPhraseRecognized ação correspondente à frase reconhecida

Palavra-chaveRecognizer

Espaço de nomes: UnityEngine.Windows.Speech
Tipos: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Precisaremos de algumas instruções de uso para salvar algumas teclas digitadas:

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-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 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-lhe o que queremos reconhecer:

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

Inscreva-se agora no OnPhraseRecognized evento

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Um manipulador de exemplo é:

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

Espaço de nomes: UnityEngine.Windows.Speech
Tipos: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

O GrammarRecognizer é 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 de 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 o caminho para o seu arquivo SRGS:

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

Inscreva-se agora no OnPhraseRecognized evento

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Você receberá um retorno de chamada contendo informações especificadas em sua gramática SRGS, que você pode lidar 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

Espaço de nomes: 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 suporta o registro e a escuta de eventos concluídos de hipóteses e frases, para que você possa dar feedback ao seu usuário enquanto ele fala e depois. Start() e Stop() métodos, respectivamente, habilitam e desabilitam o reconhecimento de ditado. Uma vez 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.

Há apenas algumas etapas necessárias para começar com o ditado:

  1. Criar um novo DictationRecognizer
  2. Manipular eventos de ditado
  3. Inicie o DictationRecognizer

Habilitando a capacidade de ditado

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

  1. No Editor Unity, vá para Editar > Player de Configurações > do Projeto
  2. Selecione no separador Loja Windows
  3. Na seção Recursos de Configurações > de Publicação, verifique o recurso InternetClient
    • Opcionalmente, se ainda não tiver ativado o microfone, verifique a funcionalidade Microfone
  4. Conceda permissões ao aplicativo para acesso ao microfone em seu dispositivo HoloLens, se ainda não tiver
    • Ser-lhe-á pedido para o fazer no arranque do dispositivo, mas se acidentalmente clicou em "não", pode alterar as permissões nas definições do dispositivo

DitadoReconhecedor

Crie um DictationRecognizer assim:

dictationRecognizer = new DictationRecognizer();

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

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

DitadoResultado

Esse evento é disparado depois que o usuário pausa, geralmente no final de uma frase. A cadeia de caracteres reconhecida completa é 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
}

DitadoHipótese

Este evento é disparado continuamente enquanto o usuário está falando. À medida que o reconhecedor ouve, 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 DictationHypothese:

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

DitadoCompleto

Esse evento é acionado quando o reconhecedor para, seja de Stop() sendo chamado, um tempo limite ocorrendo 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
}

DitadoErro

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 se inscrever e lidar com os eventos de ditado que lhe interessam, inicie o reconhecedor de ditado para começar a receber eventos.

dictationRecognizer.Start();

Se você não quiser mais manter o DictationRecognizer por perto, você precisa cancelar a inscrição dos eventos e descartar o DictationRecognizer.

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

Sugestões

  • Start() e Stop() métodos, respectivamente, habilitam e desabilitam o reconhecimento de ditado.
  • Uma vez 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 determinado período de tempo. Você pode verificar esses tempos limite no DictationComplete evento. Há dois tempos limite a ter em conta:
    1. Se o reconhecedor for iniciado e não ouvir nenhum áudio nos primeiros cinco segundos, o tempo limite expirará.
    2. Se o reconhecedor tiver dado um resultado, mas depois ouvir silêncio por 20 segundos, ele expirará.

Usando o reconhecimento de frases e o ditado

Se você quiser usar o reconhecimento de frases 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 para seu estado anterior depois que o DictationRecognizer tiver parado:

PhraseRecognitionSystem.Restart();

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

Entrada de voz no Kit de Ferramentas de Realidade Mista

Você pode encontrar exemplos de 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 pontos de verificação de desenvolvimento Unity que estabelecemos, sua próxima tarefa é explorar os recursos e APIs da plataforma de Realidade Mista:

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