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.
- No Editor do Unity, navegue até Editar > Player de configurações do > projeto
- Selecione a guia da Windows Store
- Na seção Recursos de configurações > de publicação, verifique o recurso Microfone
- 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:
- Especifique quais frases ouvir usando um
KeywordRecognizer
ouGrammarRecognizer
- 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:
- Crie um novo
DictationRecognizer
- Manipular eventos de Ditado
- 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:
- No Editor do Unity, vá para Editar > configurações do > projeto Player
- Selecione na guia Windows Store
- 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
- 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.
DictationResult
DictationComplete
DictationHypothesis
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()
eStop()
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:- Se o reconhecedor for iniciado e não ouvir nenhum áudio nos primeiros cinco segundos, ele atingirá o tempo limite.
- 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.