Entrada de voz en Unity
Precaución
Antes de empezar, considere la posibilidad de usar el complemento de Unity para el SDK de Cognitive Speech Services. El complemento tiene mejores resultados de precisión de voz y fácil acceso a la descodificación de voz a texto, así como características avanzadas de voz como diálogo, interacción basada en intención, traducción, síntesis de texto a voz y reconocimiento de voz de lenguaje natural. Para empezar, consulte el ejemplo y la documentación.
Unity expone tres maneras de agregar entrada de voz a la aplicación de Unity, las dos primeras son tipos de PhraseRecognizer:
-
KeywordRecognizer
proporciona a la aplicación una matriz de comandos de cadena para escuchar - proporciona
GrammarRecognizer
a la aplicación un archivo SRGS que define una gramática específica para escuchar -
DictationRecognizer
permite que la aplicación escuche cualquier palabra y proporcione al usuario una nota u otra presentación de su voz.
Nota:
El dictado y el reconocimiento de frases no se pueden controlar al mismo tiempo. Si un GrammarRecognizer o KeywordRecognizer está activo, un DictationRecognizer no puede estar activo y viceversa.
Habilitación de la funcionalidad para Voz
La funcionalidad Micrófono debe declararse para que una aplicación use la entrada de voz.
- En el Editor de Unity, vaya a Editar > el reproductor de configuración del > proyecto.
- Seleccione la pestaña Tienda Windows.
- En la sección Funcionalidades de configuración > de publicación , compruebe la funcionalidad Micrófono .
- Concesión de permisos a la aplicación para el acceso al micrófono en el dispositivo HoloLens
- Se le pedirá que haga esto en el inicio del dispositivo, pero si accidentalmente hace clic en "no", puede cambiar los permisos en la configuración del dispositivo.
Reconocimiento de frases
Para permitir que la aplicación escuche frases específicas pronunciadas por el usuario y, a continuación, realice alguna acción, debe hacer lo siguiente:
- Especificar qué frases se van a escuchar mediante o
KeywordRecognizer
GrammarRecognizer
- Controlar el
OnPhraseRecognized
evento y realizar acciones correspondientes a la frase reconocida
KeywordRecognizer
Espacio de nombres:UnityEngine.Windows.Speech
Types:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
Necesitaremos algunas instrucciones using para guardar algunas pulsaciones de tecla:
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
A continuación, vamos a agregar algunos campos a la clase para almacenar el reconocedor y el diccionario keyword-action>:
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
Ahora agregue una palabra clave al diccionario, por ejemplo, en un Start()
método. Vamos a agregar la palabra clave "activate" en este ejemplo:
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
Cree el reconocedor de palabras clave y dígale lo que queremos reconocer:
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
Ahora regístrese para el evento.OnPhraseRecognized
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
Un controlador de ejemplo es:
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 último, ¡empieza a reconocer!
keywordRecognizer.Start();
GrammarRecognizer
Espacio de nombres:UnityEngine.Windows.Speech
Tipos: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
GrammarRecognizer se usa si especifica la gramática de reconocimiento mediante SRGS. Esto puede ser útil si la aplicación tiene más de unas pocas palabras clave, si quieres reconocer frases más complejas o si quieres activar y desactivar fácilmente conjuntos de comandos. Vea: Creación de gramáticas mediante XML de SRGS para obtener información sobre el formato de archivo.
Una vez que tenga la gramática de SRGS y esté en el proyecto en una carpeta StreamingAssets:
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
Cree y GrammarRecognizer
pásela la ruta de acceso al archivo SRGS:
private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
Ahora regístrese para el evento.OnPhraseRecognized
grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
Obtendrá una devolución de llamada que contiene la información especificada en la gramática de SRGS, que puede controlar correctamente. La mayor parte de la información importante se proporcionará en la semanticMeanings
matriz.
private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
SemanticMeaning[] meanings = args.semanticMeanings;
// do something
}
Por último, ¡empieza a reconocer!
grammarRecognizer.Start();
Dictado
Espacio de nombres:UnityEngine.Windows.Speech
Tipos: DictationRecognizer, SpeechError, SpeechSystemStatus
Use para DictationRecognizer
convertir la voz del usuario en texto. DictationRecognizer expone la funcionalidad de dictado y admite el registro y la escucha de eventos de hipótesis y frases completadas, por lo que puede enviar comentarios al usuario mientras habla y después.
Start()
y Stop()
los métodos habilitan y deshabilitan respectivamente el reconocimiento de dictado. Una vez hecho con el reconocedor, debe eliminarse mediante Dispose()
para liberar los recursos que usa. Liberará estos recursos automáticamente durante la recolección de elementos no utilizados a un costo de rendimiento adicional si no se liberan antes de eso.
Solo se necesitan algunos pasos para empezar a usar el dictado:
- Creación de un nuevo
DictationRecognizer
- Controlar eventos de dictado
- Iniciar DictationRecognizer
Habilitación de la funcionalidad para el dictado
Las funcionalidades cliente y micrófono de Internet deben declararse para que una aplicación use el dictado:
- En la Editor de Unity, vaya a Editar > el reproductor de configuración del > proyecto.
- Seleccione en la pestaña Tienda Windows .
- En la sección Funcionalidades de configuración > de publicación , compruebe la funcionalidad InternetClient .
- Opcionalmente, si aún no ha habilitado el micrófono, compruebe la funcionalidad Micrófono .
- Conceder permisos a la aplicación para el acceso al micrófono en el dispositivo HoloLens si aún no lo ha hecho
- Se le pedirá que haga esto en el inicio del dispositivo, pero si accidentalmente hace clic en "no", puede cambiar los permisos en la configuración del dispositivo.
DictationRecognizer
Cree un DictationRecognizer de la siguiente manera:
dictationRecognizer = new DictationRecognizer();
Hay cuatro eventos de dictado que se pueden suscribir y controlar para implementar el comportamiento de dictado.
DictationResult
DictationComplete
DictationHypothesis
DictationError
DictationResult
Este evento se desencadena después de que el usuario se detenga, normalmente al final de una oración. La cadena reconocida completa se devuelve aquí.
En primer lugar, suscríbase al DictationResult
evento:
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
A continuación, controle la devolución de llamada DictationResult:
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// do something
}
DictationHypothesis
Este evento se desencadena continuamente mientras el usuario está hablando. A medida que el reconocedor escucha, proporciona texto de lo que se ha escuchado hasta ahora.
En primer lugar, suscríbase al DictationHypothesis
evento:
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
A continuación, controle la devolución de llamada DictationHypothesis:
private void DictationRecognizer_DictationHypothesis(string text)
{
// do something
}
DictationComplete
Este evento se desencadena cuando se detiene el reconocedor, ya sea desde Stop() al que se llama, si se produce un tiempo de espera o algún otro error.
En primer lugar, suscríbase al DictationComplete
evento:
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
A continuación, controle la devolución de llamada DictationComplete:
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
DictationError
Este evento se desencadena cuando se produce un error.
En primer lugar, suscríbase al DictationError
evento:
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
A continuación, controle la devolución de llamada DictationError:
private void DictationRecognizer_DictationError(string error, int hresult)
{
// do something
}
Una vez que se haya suscrito y controlado los eventos de dictado que le interesan, inicie el reconocedor de dictado para empezar a recibir eventos.
dictationRecognizer.Start();
Si ya no quiere mantener el DictadorRecognizer, debe cancelar la suscripción a los eventos y eliminar dictationRecognizer.
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();
Sugerencias
-
Start()
yStop()
los métodos habilitan y deshabilitan respectivamente el reconocimiento de dictado. - Una vez hecho con el reconocedor, debe eliminarse mediante
Dispose()
para liberar los recursos que usa. Liberará estos recursos automáticamente durante la recolección de elementos no utilizados a un costo de rendimiento adicional si no se liberan antes de eso. - Los tiempos de espera se producen después de un período de tiempo establecido. Puede comprobar estos tiempos de espera en el
DictationComplete
evento. Hay dos tiempos de espera que debe tener en cuenta:- Si el reconocedor se inicia y no escucha ningún audio durante los primeros cinco segundos, se agotará el tiempo de espera.
- Si el reconocedor ha dado un resultado, pero escucha silencio durante 20 segundos, se agotará el tiempo de espera.
Usar el reconocimiento de frases y el dictado
Si quieres usar tanto el reconocimiento de frases como el dictado en la aplicación, tendrás que apagar completamente una para poder iniciar la otra. Si tiene varios KeywordRecognizers en ejecución, puede apagarlos todos a la vez con:
PhraseRecognitionSystem.Shutdown();
Puede llamar Restart()
a para restaurar todos los reconocedores a su estado anterior después de que se haya detenido DictationRecognizer:
PhraseRecognitionSystem.Restart();
También podría iniciar keywordRecognizer, que reiniciará phraseRecognitionSystem también.
Entrada de voz en Mixed Reality Toolkit
Puede encontrar ejemplos de MRTK para la entrada de voz en las siguientes escenas de demostración:
Siguiente punto de comprobación de desarrollo
Si sigue el recorrido del punto de control de desarrollo de Unity que hemos diseñado, la siguiente tarea es explorar las API y las funcionalidades de la plataforma de Mixed Reality:
Siempre puede volver a los puntos de control de desarrollo de Unity en cualquier momento.