Entrada de voz no Unity

Atenção

Antes de começar, considere utilizar o plug-in do Unity para o SDK dos Serviços cognitivos de Voz. O plug-in tem melhores resultados de Precisão de Voz e acesso fácil ao descodificador de voz em texto, bem como funcionalidades de voz avançadas, como caixa de diálogo, interação baseada em intenções, tradução, sintetização de conversão de texto em voz e reconhecimento de voz de linguagem natural. Para começar, consulte o exemplo e a documentação.

O Unity expõe três formas de adicionar entrada de Voz à sua aplicação Unity, as duas primeiras são tipos de PhraseRecognizer:

  • O KeywordRecognizer fornece à sua aplicação uma matriz de comandos de cadeia de carateres para escutar
  • O GrammarRecognizer fornece à sua aplicação um ficheiro SRGS que define uma gramática específica para escutar
  • Permite DictationRecognizer que a sua aplicação ouça qualquer palavra e forneça ao utilizador uma nota ou outra apresentação da respetiva voz

Nota

O ditado e o reconhecimento de expressões não podem ser processados ao mesmo tempo. Se um GrammarRecognizer ou KeywordRecognizer estiver ativo, um DictationRecognizer não pode estar ativo e vice-versa.

Ativar a capacidade do Voice

A capacidade Microfone tem de ser declarada para que uma aplicação utilize a Entrada de voz.

  1. No Editor do Unity, navegue para Editar > Leitor de Definições > do Projeto
  2. Selecione o separador Loja Windows
  3. Na secção Capacidades de Definições > de Publicação, verifique a capacidade microfone
  4. Conceder permissões à aplicação para acesso ao microfone no seu dispositivo HoloLens
    • Ser-lhe-á pedido que o faça no arranque do dispositivo, mas se tiver clicado acidentalmente em "não", pode alterar as permissões nas definições do dispositivo

Reconhecimento de Expressões

Para permitir que a sua aplicação ouça expressões específicas faladas pelo utilizador e, em seguida, efetue algumas ações, tem de:

  1. Especifique as expressões a escutar com um KeywordRecognizer ou GrammarRecognizer
  2. Processar o OnPhraseRecognized evento e tomar medidas correspondentes à expressão reconhecida

KeywordRecognizer

Espaço de Nomes:UnityEngine.Windows.Speech
Types:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Vamos precisar de algumas instruções para guardar alguns batimentos de teclas:

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

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

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

Agora, adicione uma palavra-chave ao dicionário, por exemplo, num Start() método. Neste exemplo, estamos a adicionar a palavra-chave "ativar":

//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());

Agora, registe-se no OnPhraseRecognized evento

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Um processador 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

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

O GrammarRecognizer é utilizado se estiver a especificar a gramática de reconhecimento com o SRGS. Isto pode ser útil se a sua aplicação tiver mais do que apenas algumas palavras-chave, se quiser reconhecer expressões mais complexas ou se quiser ativar e desativar facilmente conjuntos de comandos. Veja: Criar Gramáticas com o SRGS XML para obter informações sobre o formato de ficheiro.

Assim que tiver a gramática SRGS e estiver no seu projeto numa pasta StreamingAssets:

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

Crie um GrammarRecognizer e transmita o caminho para o ficheiro SRGS:

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

Agora, registe-se no OnPhraseRecognized evento

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Receberá uma chamada de retorno com informações especificadas na gramática SRGS, que pode processar adequadamente. A maioria das informações importantes serão fornecidas na semanticMeanings matriz.

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

Por fim, comece a reconhecer!

grammarRecognizer.Start();

Ditado

Espaço de Nomes:UnityEngine.Windows.Speech
Tipos: DictationRecognizer, SpeechError, SpeechSystemStatus

Utilize o DictationRecognizer para converter a voz do utilizador em texto. O DictationRecognizer expõe a funcionalidade de ditado e suporta o registo e a escuta de eventos de hipóteses e expressões concluídas, para que possa dar feedback ao utilizador enquanto fala e depois. Start() e Stop() os métodos, respetivamente, ativam e desativam o reconhecimento de ditado. Depois de concluído com o reconhecedor, deve ser eliminado com Dispose() o para libertar os recursos que utiliza. Irá libertar estes recursos automaticamente durante a recolha de lixo com um custo de desempenho adicional se não forem libertados antes disso.

Existem apenas alguns passos necessários para começar a utilizar o ditado:

  1. Criar um novo DictationRecognizer
  2. Processar eventos de Ditado
  3. Iniciar o DictationRecognizer

Ativar a capacidade de ditado

As capacidades de Cliente e Microfone da Internet têm de ser declaradas para que uma aplicação utilize o ditado:

  1. No Editor do Unity, aceda a Editar Leitor > de Definições > do Projeto
  2. Selecione no separador Loja Windows
  3. Na secção Capacidades de Definições > de Publicação, verifique a capacidade InternetClient
    • Opcionalmente, se ainda não tiver ativado o microfone, verifique a capacidade microfone
  4. Conceder permissões à aplicação para acesso ao microfone no seu dispositivo HoloLens se ainda não o tiver feito
    • Ser-lhe-á pedido que o faça no arranque do dispositivo, mas se tiver clicado acidentalmente em "não", pode alterar as permissões nas definições do dispositivo

DictationRecognizer

Crie um DictationRecognizer da seguinte forma:

dictationRecognizer = new DictationRecognizer();

Existem quatro eventos de ditado que podem ser subscritos e processados para implementar o comportamento do ditado.

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

DitadoResult

Este evento é acionado após a pausa do utilizador, normalmente no final de uma frase. A cadeia reconhecida completa é devolvida aqui.

Primeiro, subscreva o DictationResult evento:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Em seguida, processe a chamada de retorno DictationResult:

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

DictationHypothesis

Este evento é acionado continuamente enquanto o utilizador fala. À medida que o reconhecedor escuta, fornece texto do que é ouvido até agora.

Primeiro, subscreva o DictationHypothesis evento:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Em seguida, processe a chamada de retorno DictationHypothesis:

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

DitadoCompleto

Este evento é acionado quando o reconhecedor para, seja a partir de Parar() a ser chamado, um tempo limite a ocorrer ou algum outro erro.

Primeiro, subscreva o DictationComplete evento:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Em seguida, processe a chamada de retorno DictationComplete:

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

DictationError

Este evento é acionado quando ocorre um erro.

Primeiro, subscreva o DictationError evento:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Em seguida, processe a chamada de retorno DictationError:

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

Depois de subscrever e processar os eventos de ditado que lhe interessam, inicie o reconhecedor de ditado para começar a receber eventos.

dictationRecognizer.Start();

Se já não quiser manter o DictationRecognizer por perto, tem de anular a subscrição dos eventos e Eliminar 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() os métodos, respetivamente, ativam e desativam o reconhecimento de ditado.
  • Depois de concluído com o reconhecedor, tem de ser eliminado com Dispose() o para libertar os recursos que utiliza. Irá libertar estes recursos automaticamente durante a recolha de lixo com um custo de desempenho adicional se não forem libertados antes disso.
  • Os tempos limite ocorrem após um determinado período de tempo. Pode verificar se existem tempos limite no DictationComplete evento. Existem dois tempos limite a ter em atenção:
    1. Se o reconhecedor iniciar e não ouvir áudio durante os primeiros cinco segundos, o tempo limite será excedido.
    2. Se o reconhecedor tiver dado um resultado, mas ouvir silêncio durante 20 segundos, o tempo limite será excedido.

Utilizar o Reconhecimento de Expressões e o Ditado

Se quiser utilizar o reconhecimento de expressões e o ditado na sua aplicação, terá de encerrar totalmente uma antes de poder iniciar a outra. Se tiver vários KeywordRecognizers em execução, pode encerrá-los todos de uma só vez com:

PhraseRecognitionSystem.Shutdown();

Pode chamar Restart() para restaurar todos os reconhecedores para o estado anterior após a paragem de DictationRecognizer:

PhraseRecognitionSystem.Restart();

Também pode iniciar um KeywordRecognizer, que irá reiniciar também o PhraseRecognitionSystem.

Entrada de voz no Mixed Reality Toolkit

Pode encontrar exemplos de MRTK para entrada de voz nas seguintes cenas de demonstração:

Próximo Ponto de Verificação de Desenvolvimento

Se estiver a seguir o percurso de ponto de verificação de desenvolvimento do Unity que definimos, a próxima tarefa é explorar as capacidades e APIs da plataforma de Mixed Reality:

Pode sempre voltar aos pontos de verificação de desenvolvimento do Unity em qualquer altura.