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 em texto, bem como recursos avançados de fala, como diálogo, interação baseada em intenção, tradução, síntese de conversão de texto em fala e reconhecimento de fala em linguagem natural. Para começar, marcar o exemplo e a documentação.

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

  • O KeywordRecognizer fornece ao seu aplicativo uma matriz de comandos de cadeia de caracteres para escutar
  • O GrammarRecognizer fornece 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 anotação 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á ser ativo e vice-versa.

Habilitando a funcionalidade para o Voice

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

  1. No Editor do Unity, navegue até Editar Player > de Configurações > do Projeto
  2. Selecione a guia Windows Store
  3. Na seção Funcionalidades de Configurações > de Publicação, marcar a funcionalidade 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ê tiver clicado acidentalmente em "não", poderá alterar as permissões nas configurações do dispositivo

Reconhecimento de Frases

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

  1. Especificar quais frases escutar usando um KeywordRecognizer ou GrammarRecognizer
  2. Manipular o OnPhraseRecognized evento e tomar medidas correspondentes à frase reconhecida

KeywordRecognizer

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

Precisaremos de algumas instruções using para salvar alguns pressionamentos de tecla:

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 palavra-chave-action>:

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

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

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

Crie o reconhecedor de palavra-chave e diga o que queremos reconhecer:

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

Agora registre-se para o 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();
    }
}

Por fim, comece a reconhecer!

keywordRecognizer.Start();

GrammarRecognizer

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 de 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 caminho para o arquivo SRGS:

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

Agora registre-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 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
}

Por fim, 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óteses e frases concluídas, para que você possa enviar comentários ao usuário enquanto ele fala e depois. Start() e Stop() os 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 ele usa. Ele liberará esses recursos automaticamente durante a coleta de lixo a um custo extra de desempenho se eles não forem liberados antes disso.

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

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

Habilitando a funcionalidade para ditado

Os recursos cliente e microfone da Internet devem ser declarados para um aplicativo usar ditado:

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

DictationRecognizer

Crie um DictationRecognizer da seguinte maneira:

dictationRecognizer = new DictationRecognizer();

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

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

DictationResult

Esse evento é acionado após o usuário pausar, normalmente no final de uma frase. A cadeia de caracteres reconhecida completa é retornada aqui.

Primeiro, assine o DictationResult evento:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Em seguida, manipule o retorno de chamada DictationResult:

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

DictationHypothesis

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

Primeiro, assine o DictationHypothesis evento:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Em seguida, manipule o retorno de chamada DictationHypothesis:

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

DictationComplete

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

Primeiro, assine o DictationComplete evento:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Em seguida, manipule o retorno de chamada DictationComplete:

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

DictationError

Esse evento é acionado quando ocorre um erro.

Primeiro, assine o 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() os 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 ele usa. Ele liberará esses recursos automaticamente durante a coleta de lixo a um custo extra de desempenho se eles não forem liberados antes disso.
  • Os tempos limite ocorrem após um período de tempo definido. Você pode marcar para esses tempos limite no DictationComplete evento. Há dois tempos limite para estar ciente:
    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 o 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 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 só vez com:

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

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

Entrada de voz no Kit de Ferramentas do Realidade Misturada

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 o percurso de ponto de verificação de desenvolvimento do Unity que estabelecemos, a próxima tarefa será explorar os recursos e APIs da plataforma Realidade Misturada:

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