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.
- No Editor Unity, navegue até Editar > Player de Configurações > do Projeto
- Selecione o separador Loja Windows
- 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
- 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:
- Especifique quais frases ouvir usando um
KeywordRecognizer
ouGrammarRecognizer
- 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:
- Criar um novo
DictationRecognizer
- Manipular eventos de ditado
- Inicie o DictationRecognizer
Habilitando a capacidade de ditado
Os recursos Cliente da Internet e Microfone devem ser declarados para que um aplicativo use ditado:
- No Editor Unity, vá para Editar > Player de Configurações > do Projeto
- Selecione no separador Loja Windows
- 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
- 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.
DictationResult
DictationComplete
DictationHypothesis
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()
eStop()
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:- Se o reconhecedor for iniciado e não ouvir nenhum áudio nos primeiros cinco segundos, o tempo limite expirará.
- 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.