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.
- No Editor do Unity, navegue para Editar > Leitor de Definições > do Projeto
- Selecione o separador Loja Windows
- Na secção Capacidades de Definições > de Publicação, verifique a capacidade microfone
- 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:
- Especifique as expressões a escutar com um
KeywordRecognizer
ouGrammarRecognizer
- 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:
- Criar um novo
DictationRecognizer
- Processar eventos de Ditado
- 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:
- No Editor do Unity, aceda a Editar Leitor > de Definições > do Projeto
- Selecione no separador Loja Windows
- 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
- 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.
DictationResult
DictationComplete
DictationHypothesis
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()
eStop()
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:- Se o reconhecedor iniciar e não ouvir áudio durante os primeiros cinco segundos, o tempo limite será excedido.
- 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.