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 acceso fácil a la descodificación de voz a texto, así como características avanzadas de voz, como diálogo, interacción basada en intenciones, traducción, síntesis de texto a voz y reconocimiento de voz en lenguaje natural. Para empezar, consulte el ejemplo y la documentación.

Unity expone tres maneras de agregar entrada de voz a la aplicación unity, las dos primeras de las cuales son tipos de PhraseRecognizer:

  • Proporciona KeywordRecognizer 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 DictadoRecognizer 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.

  1. En el Editor de Unity, vaya a Editar > reproductor de configuración del > proyecto.
  2. Seleccione la pestaña Tienda Windows .
  3. En la sección Funcionalidades de configuración > de publicación , compruebe la funcionalidad Micrófono .
  4. Concesión de permisos a la aplicación para el acceso de micrófono en el dispositivo HoloLens
    • Se le pedirá que lo haga en el inicio del dispositivo, pero si ha hecho clic accidentalmente 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 habladas por el usuario y, a continuación, realice alguna acción, debe hacer lo siguiente:

  1. Especificar las frases que se van a escuchar mediante o KeywordRecognizerGrammarRecognizer
  2. Controlar el OnPhraseRecognized evento y tomar medidas 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 diccionario recognizer y 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 dile lo que queremos reconocer:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

Ahora regístrese para el OnPhraseRecognized evento

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, empiece 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. Consulte: Crear gramáticas mediante SRGS XML para obtener información sobre el formato de archivo.

Una vez que tenga la gramática de SRGS, y se encuentra en el proyecto en una carpeta StreamingAssets:

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

Cree y GrammarRecognizer páselo la ruta de acceso al archivo SRGS:

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

Ahora regístrese para el OnPhraseRecognized evento

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Obtendrá una devolución de llamada que contiene información especificada en la gramática srGS, que puede controlar correctamente. La mayoría 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, empiece a reconocer!

grammarRecognizer.Start();

Dictado

Espacio de nombres:UnityEngine.Windows.Speech
Tipos: DictadoRecognizer, SpeechError, SpeechSystemStatus

DictationRecognizer Use para 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 frase completadas, por lo que puede enviar comentarios a su usuario tanto mientras habla como después. Start() y Stop() los métodos, respectivamente, habilitan y deshabilitan el reconocimiento de dictado. Una vez hecho con el reconocedor, se debe eliminar 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 hay algunos pasos necesarios para empezar a trabajar con el dictado:

  1. Creación de un nuevo DictationRecognizer
  2. Controlar eventos de dictado
  3. Iniciar el dictadoRecognizer

Habilitación de la funcionalidad para dictado

Las funcionalidades cliente y micrófono de Internet deben declararse para que una aplicación use dictado:

  1. En el Editor de Unity, vaya a Editar > reproductor de configuración > del proyecto.
  2. Seleccione en la pestaña Tienda Windows .
  3. En la sección Funcionalidades de configuración > de publicación , compruebe la funcionalidad InternetClient .
    • Opcionalmente, si aún no habilite el micrófono, compruebe la funcionalidad Micrófono .
  4. Conceder permisos a la aplicación para el acceso de micrófono en el dispositivo HoloLens si aún no lo ha hecho
    • Se le pedirá que lo haga en el inicio del dispositivo, pero si ha hecho clic accidentalmente en "no", puede cambiar los permisos en la configuración del dispositivo.

DictadoRecognizer

Cree un dictadoRecognizer de la siguiente manera:

dictationRecognizer = new DictationRecognizer();

Hay cuatro eventos de dictado a los que se puede suscribir y controlar para implementar el comportamiento de dictado.

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

DictadoResult

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
}

DictadoHypothesis

Este evento se desencadena continuamente mientras el usuario está hablando. A medida que escucha el reconocedor, proporciona texto de lo que se ha oído 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
}

DictadoComplete

Este evento se desencadena cuando el reconocedor se detiene, tanto si se llama a Stop(), se produce un tiempo de espera o se produce 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 de 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 desea mantener el DictadoRecognizer alrededor, debe cancelar la suscripción de los eventos y Eliminar el DictadoRecognizer.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

Sugerencias

  • Start() y Stop() los métodos, respectivamente, habilitan y deshabilitan el reconocimiento de dictado.
  • Una vez hecho con el reconocedor, se debe eliminar 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 si hay estos tiempos de espera en el DictationComplete evento. Hay dos tiempos de espera que tenga en cuenta:
    1. Si el reconocedor se inicia y no escucha ningún audio durante los primeros cinco segundos, se agotará el tiempo de espera.
    2. Si el reconocedor ha dado un resultado, pero luego escucha silencio durante 20 segundos, agotará el tiempo de espera.

Usar el reconocimiento de frases y el dictado

Si quieres usar el reconocimiento de frases y el dictado en la aplicación, tendrás que apagarlo completamente antes de poder iniciar el otro. Si tiene varias palabras claveRecognizer en ejecución, puede apagarlas todas a la vez con:

PhraseRecognitionSystem.Shutdown();

Puede llamar Restart() a para restaurar todos los reconocedores a su estado anterior después de que dictationRecognizer se haya detenido:

PhraseRecognitionSystem.Restart();

También puede iniciar un KeywordRecognizer, que también reiniciará PhraseRecognitionSystem.

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 control de desarrollo

Si sigue el recorrido del punto de comprobación de desarrollo de Unity que hemos diseñado, la siguiente tarea es explorar las funcionalidades y las API de la plataforma Mixed Reality:

Puede volver a los puntos de control de desarrollo de Unity en cualquier momento.