Entrada de realidad mixta (212): VozMR Input 212: Voice

Nota

Los tutoriales de Mixed Reality Academy se han diseñado teniendo en cuenta HoloLens (1.ª generación) y los cascos envolventes de realidad mixta.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles.They will be maintained to continue working on the supported devices. Se ha publicado una nueva serie de tutoriales para HoloLens 2.A new series of tutorials has been posted for HoloLens 2.

La entrada de voz nos proporciona otro método para interactuar con los hologramas.Voice input gives us another way to interact with our holograms. Los comandos de voz funcionan de forma muy natural y sencilla.Voice commands work in a very natural and easy way. Diseñe los comandos de voz para que estén:Design your voice commands so that they are:

  • NaturalNatural
  • Fácil de recordarEasy to remember
  • Contexto adecuadoContext appropriate
  • Lo suficientemente distinto de otras opciones en el mismo contextoSufficiently distinct from other options within the same context

En los conceptos básicos de MR 101, usamos KeywordRecognizer para crear dos sencillos comandos de voz.In MR Basics 101, we used the KeywordRecognizer to build two simple voice commands. En la entrada MR 212, profundizaremos más en cómo:In MR Input 212, we'll dive deeper and learn how to:

  • Diseñe comandos de voz que estén optimizados para el motor de voz de HoloLens.Design voice commands that are optimized for the HoloLens speech engine.
  • Haga que el usuario tenga en cuenta qué comandos de voz están disponibles.Make the user aware of what voice commands are available.
  • Confirme que hemos escuchado el comando de voz del usuario.Acknowledge that we've heard the user's voice command.
  • Comprenda lo que está diciendo el usuario, mediante un reconocedor de dictado.Understand what the user is saying, using a Dictation Recognizer.
  • Use un reconocedor de gramática para escuchar comandos basados en un archivo SRGS o una especificación de gramática de reconocimiento de voz.Use a Grammar Recognizer to listen for commands based on an SRGS, or Speech Recognition Grammar Specification, file.

En este curso, volveremos a visitar el explorador de modelos, que hemos creado en la entrada mr 210 y la entrada Mr 211.In this course, we'll revisit Model Explorer, which we built in MR Input 210 and MR Input 211.

Importante

Los vídeos insertados en cada uno de los capítulos siguientes se grabaron con una versión anterior de Unity y el kit de herramientas de realidad mixta.The videos embedded in each of the chapters below were recorded using an older version of Unity and the Mixed Reality Toolkit. Aunque las instrucciones paso a paso son precisas y actuales, es posible que vea scripts y objetos visuales en los vídeos correspondientes que no están actualizados.While the step-by-step instructions are accurate and current, you may see scripts and visuals in the corresponding videos that are out-of-date. Los vídeos permanecen incluidos para posterity y porque todavía se aplican los conceptos descritos.The videos remain included for posterity and because the concepts covered still apply.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
Entrada de realidad mixta (212): VozMR Input 212: Voice ✔️✔️ ✔️✔️

Antes de empezarBefore you start

Requisitos previosPrerequisites

Archivos de proyectoProject files

  • Descargue los archivos requeridos por el proyecto.Download the files required by the project. Requiere Unity 2017,2 o posterior.Requires Unity 2017.2 or later.
  • Elimine el archivo de los archivos en el escritorio o en otra ubicación de fácil acceso.Un-archive the files to your desktop or other easy to reach location.

Nota

Si desea examinar el código fuente antes de la descarga, está disponible en github.If you want to look through the source code before downloading, it's available on GitHub.

Erratas y notasErrata and Notes

  • "Habilitar Solo mi código" debe estar deshabilitado (desactivado) en Visual Studio en herramientas->opciones->depuración para alcanzar puntos de interrupción en el código."Enable Just My Code" needs to be disabled (unchecked) in Visual Studio under Tools->Options->Debugging in order to hit breakpoints in your code.

Configuración de UnityUnity Setup

InstructionsInstructions

  1. Inicie Unity.Start Unity.
  2. seleccione Open(Abrir).Select Open.
  3. Vaya a la carpeta HolographicAcademy-hologramas-212-Voice que previamente eliminó de archivado.Navigate to the HolographicAcademy-Holograms-212-Voice folder you previously un-archived.
  4. Busque y seleccione la carpeta de Inicio del / Explorador de modelos .Find and select the Starting/Model Explorer folder.
  5. Haga clic en el botón Seleccionar carpeta .Click the Select Folder button.
  6. En el panel proyecto , expanda la carpeta escenas .In the Project panel, expand the Scenes folder.
  7. Haga doble clic en ModelExplorer Scene para cargarlo en Unity.Double-click ModelExplorer scene to load it in Unity.

CompilaciónBuilding

  1. En Unity, seleccione archivo > configuración de compilación.In Unity, select File > Build Settings.
  2. Si Scenes/ModelExplorer no aparece en escenas en la compilación, haga clic en Agregar escenas abiertas para agregar la escena.If Scenes/ModelExplorer is not listed in Scenes In Build, click Add Open Scenes to add the scene.
  3. Si está desarrollando específicamente para HoloLens, establezca el dispositivo de destino en hololens.If you're specifically developing for HoloLens, set Target device to HoloLens. De lo contrario, déjelo en cualquier dispositivo.Otherwise, leave it on Any device.
  4. Asegúrese de que el tipo de compilación está establecido en D3D y que el SDK está establecido en la versión más reciente instalada (que debe ser SDK 16299 o posterior).Ensure Build Type is set to D3D and SDK is set to Latest installed (which should be SDK 16299 or newer).
  5. Haga clic en Generar.Click Build.
  6. Cree una nueva carpeta denominada "app".Create a New Folder named "App".
  7. Haga clic en la carpeta de la aplicación .Single click the App folder.
  8. Presione Seleccionar carpeta y Unity comenzará a compilar el proyecto para Visual Studio.Press Select Folder and Unity will start building the project for Visual Studio.

Cuando se haya realizado Unity, aparecerá una ventana del explorador de archivos.When Unity is done, a File Explorer window will appear.

  1. Abra la carpeta de la aplicación .Open the App folder.
  2. Abra la solución ModelExplorer de Visual Studio.Open the ModelExplorer Visual Studio Solution.

Si se implementa en HoloLens:If deploying to HoloLens:

  1. Con la barra de herramientas superior de Visual Studio, cambie el destino de Debug a Release y de ARM a x86.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x86.
  2. Haga clic en la flecha desplegable situada junto al botón equipo local y seleccione equipo remoto.Click on the drop down arrow next to the Local Machine button, and select Remote Machine.
  3. Escriba la dirección IP del dispositivo HoloLens y establezca el modo de autenticación en universal (protocolo sin cifrar).Enter your HoloLens device IP address and set Authentication Mode to Universal (Unencrypted Protocol). Haga clic en Seleccionar.Click Select. Si no conoce la dirección IP del dispositivo, consulte configuración > redes & Internet > opciones avanzadas.If you do not know your device IP address, look in Settings > Network & Internet > Advanced Options.
  4. En la barra de menús superior, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5. Si esta es la primera vez que se implementa en el dispositivo, tendrá que emparejarla con Visual Studio.If this is the first time deploying to your device, you will need to pair it with Visual Studio.
  5. Cuando la aplicación se haya implementado, descartará el Fitbox con un gesto de selección.When the app has deployed, dismiss the Fitbox with a select gesture.

Si se implementa en un auricular envolvente:If deploying to an immersive headset:

  1. Con la barra de herramientas superior de Visual Studio, cambie el destino de Debug a Release y de ARM a x64.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x64.
  2. Asegúrese de que el destino de implementación está establecido en equipo local.Make sure the deployment target is set to Local Machine.
  3. En la barra de menús superior, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5.
  4. Cuando la aplicación se haya implementado, descarte el Fitbox mediante la extracción del desencadenador en un controlador de movimiento.When the app has deployed, dismiss the Fitbox by pulling the trigger on a motion controller.

Nota

Es posible que observe algunos errores rojos en el panel de errores de Visual Studio.You might notice some red errors in the Visual Studio Errors panel. Es seguro ignorarlos.It is safe to ignore them. Cambie al panel de salida para ver el progreso real de la compilación.Switch to the Output panel to view actual build progress. Los errores en el panel de salida requerirán que se realice una corrección (la mayoría de las veces se deben a un error en un script).Errors in the Output panel will require you to make a fix (most often they are caused by a mistake in a script).

Capítulo 1: reconocimientoChapter 1 - Awareness

ObjetivosObjectives

  • Obtenga información sobre las dos y no el diseño de los comandos de voz.Learn the Dos and Don'ts of voice command design.
  • Use KeywordRecognizer para agregar comandos de voz basados en la mirada.Use KeywordRecognizer to add gaze based voice commands.
  • Hacer que los usuarios conozcan los comandos de voz mediante los comentarios del cursor.Make users aware of voice commands using cursor feedback.

Diseño de comandos de vozVoice Command Design

En este capítulo, aprenderá a diseñar comandos de voz.In this chapter, you'll learn about designing voice commands. Al crear comandos de voz:When creating voice commands:

DODO

  • Cree comandos concisos.Create concise commands. No quiere usar "reproducir el vídeo seleccionado actualmente", ya que ese comando no es conciso y el usuario lo olvidará fácilmente.You don't want to use "Play the currently selected video", because that command is not concise and would easily be forgotten by the user. En su lugar, debe usar: "reproducir vídeo", ya que es conciso y tiene varias sílabas.Instead, you should use: "Play Video", because it is concise and has multiple syllables.
  • Usar un vocabulario sencillo.Use a simple vocabulary. Siempre intente usar palabras y frases comunes que resulten fáciles de detectar y recordar.Always try to use common words and phrases that are easy for the user to discover and remember. Por ejemplo, si la aplicación tenía un objeto de nota que se podría mostrar u ocultar en la vista, no usaría el comando "show letrero", ya que "letrero" es un término que rara vez se usa.For example, if your application had a note object that could be displayed or hidden from view, you would not use the command "Show Placard", because "placard" is a rarely used term. En su lugar, usaría el comando: "show Note" para mostrar la nota en la aplicación.Instead, you would use the command: "Show Note", to reveal the note in your application.
  • Ser coherente.Be consistent. Los comandos de voz deben mantenerse coherentes en toda la aplicación.Voice commands should be kept consistent across your application. Imagine que tiene dos escenas en la aplicación y ambas escenas contienen un botón para cerrar la aplicación.Imagine that you have two scenes in your application and both scenes contain a button for closing the application. Si la primera escena usó el comando "salir" para desencadenar el botón, pero la segunda escena usaba el comando "cerrar aplicación", el usuario se quedará muy confundido.If the first scene used the command "Exit" to trigger the button, but the second scene used the command "Close App", then the user is going to get very confused. Si la misma funcionalidad persiste en varias escenas, se debe usar el mismo comando de voz para desencadenarla.If the same functionality persists across multiple scenes, then the same voice command should be used to trigger it.

NoDON'T

  • Use los comandos de una sola sílaba.Use single syllable commands. Por ejemplo, si estuviera creando un comando de voz para reproducir un vídeo, debe evitar el uso del comando simple "Play", ya que es una sola sílaba y el sistema puede perderlo fácilmente.As an example, if you were creating a voice command to play a video, you should avoid using the simple command "Play", as it is only a single syllable and could easily be missed by the system. En su lugar, debe usar: "reproducir vídeo", ya que es conciso y tiene varias sílabas.Instead, you should use: "Play Video", because it is concise and has multiple syllables.
  • Usar comandos del sistema.Use system commands. El sistema reserva el comando "Select" para desencadenar un evento TAP para el objeto que tiene actualmente el foco.The "Select" command is reserved by the system to trigger a Tap event for the currently focused object. No vuelva a usar el comando "Select" en una palabra clave o frase, ya que es posible que no funcione como se espera.Do not re-use the "Select" command in a keyword or phrase, as it might not work as you expect. Por ejemplo, si el comando de voz para seleccionar un cubo en la aplicación fuera "seleccionar cubo", pero el usuario estaba examinando una esfera cuando creó el comando, la esfera se seleccionaría en su lugar.For example, if the voice command for selecting a cube in your application was "Select cube", but the user was looking at a sphere when they uttered the command, then the sphere would be selected instead. Igualmente, los comandos de la barra de la aplicación están habilitados para voz.Similarly app bar commands are voice enabled. No use los siguientes comandos de voz en la vista de CoreWindow:Don't use the following speech commands in your CoreWindow View:
    1. Hacia atrásGo Back
    2. Herramienta de desplazamientoScroll Tool
    3. Herramienta de zoomZoom Tool
    4. Herramienta de arrastreDrag Tool
    5. AjustarAdjust
    6. RemoveRemove
  • Usar sonidos similares.Use similar sounds. Intente evitar el uso de comandos de voz que Rhyme.Try to avoid using voice commands that rhyme. Si tiene una aplicación de compras que admitía "Mostrar tienda" y "Mostrar más" como comandos de voz, querrá deshabilitar uno de los comandos mientras el otro estaba en uso.If you had a shopping application which supported "Show Store" and "Show More" as voice commands, then you would want to disable one of the commands while the other was in use. Por ejemplo, puede usar el botón "Mostrar tienda" para abrir el almacén y, a continuación, deshabilitar ese comando cuando se mostró el almacén para que el comando "Mostrar más" pueda usarse para la exploración.For example, you could use the "Show Store" button to open the store, and then disable that command when the store was displayed so that the "Show More" command could be used for browsing.

InstructionsInstructions

  • En el panel de jerarquías de Unity, use la herramienta de búsqueda para buscar el objeto de holoComm_screen_mesh .In Unity's Hierarchy panel, use the search tool to find the holoComm_screen_mesh object.
  • Haga doble clic en el objeto holoComm_screen_mesh para verlo en la escena.Double-click on the holoComm_screen_mesh object to view it in the Scene. Esta es la inspección de Astronaut, que responderá a los comandos de voz.This is the astronaut's watch, which will respond to our voice commands.
  • En el panel Inspector , busque el componente de origen de entrada de voz (Script) .In the Inspector panel, locate the Speech Input Source (Script) component.
  • Expanda la sección palabras clave para ver el comando de voz admitido: Open Communicator.Expand the Keywords section to see the supported voice command: Open Communicator.
  • Haga clic en engranaje en el lado derecho y, luego, seleccione Editar script.Click the cog to the right side, then select Edit Script.
  • Explore SpeechInputSource.CS para saber cómo usa KeywordRecognizer para agregar comandos de voz.Explore SpeechInputSource.cs to understand how it uses the KeywordRecognizer to add voice commands.

Compilación e implementaciónBuild and Deploy

  • En Unity, use la configuración de compilación de > de archivos para recompilar la aplicación.In Unity, use File > Build Settings to rebuild the application.
  • Abra la carpeta de la aplicación .Open the App folder.
  • Abra la solución ModelExplorer de Visual Studio.Open the ModelExplorer Visual Studio Solution.

(Si ya ha creado o implementado este proyecto en Visual Studio durante la configuración, puede abrir esa instancia de VS y hacer clic en "recargar todo" cuando se le solicite).(If you already built/deployed this project in Visual Studio during set-up, then you can open that instance of VS and click 'Reload All' when prompted).

  • En Visual Studio, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In Visual Studio, click Debug -> Start Without debugging or press Ctrl + F5.
  • Después de que la aplicación se implemente en HoloLens, descartará el cuadro de ajuste mediante el gesto de punteo de aire .After the application deploys to the HoloLens, dismiss the fit box using the air-tap gesture.
  • Mira fijamente en la inspección de Astronaut.Gaze at the astronaut's watch.
  • Cuando el reloj tenga el foco, compruebe que el cursor cambia a un micrófono.When the watch has focus, verify that the cursor changes to a microphone. Esto proporciona comentarios que la aplicación está escuchando para los comandos de voz.This provides feedback that the application is listening for voice commands.
  • Compruebe que aparece una información sobre herramientas en el reloj.Verify that a tooltip appears on the watch. Esto ayuda a los usuarios a detectar el comando "abrir Communicator" .This helps users discover the "Open Communicator" command.
  • Mientras Gazing en el reloj, Imagine "abrir Communicator" para abrir el panel de Communicator.While gazing at the watch, say "Open Communicator" to open the communicator panel.

Capítulo 2: confirmaciónChapter 2 - Acknowledgement

ObjetivosObjectives

  • Grabe un mensaje mediante la entrada de micrófono.Record a message using the Microphone input.
  • Enviar comentarios al usuario que la aplicación está escuchando en la voz.Give feedback to the user that the application is listening to their voice.

Nota

La capacidad del micrófono se debe declarar para que una aplicación se grabe desde el micrófono.The Microphone capability must be declared for an app to record from the microphone. Esto se hace ya en la entrada MR 212, pero tenga esto en cuenta para sus propios proyectos.This is done for you already in MR Input 212, but keep this in mind for your own projects.

  1. En el editor de Unity, vaya a la configuración del reproductor en "editar > configuración del proyecto > Player".In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. Haga clic en la pestaña "Plataforma universal de Windows"Click on the "Universal Windows Platform" tab
  3. En la sección "configuración de publicación > funcionalidades", Compruebe la capacidad del micrófono .In the "Publishing Settings > Capabilities" section, check the Microphone capability

InstructionsInstructions

  • En el panel de jerarquías de Unity, compruebe que está seleccionado el objeto de holoComm_screen_mesh .In Unity's Hierarchy panel, verify that the holoComm_screen_mesh object is selected.
  • En el panel Inspector , busque el componente Astronaut Watch (Script) .In the Inspector panel, find the Astronaut Watch (Script) component.
  • Haga clic en el pequeño cubo azul que se establece como el valor de la propiedad Communicator recurso prefabricado .Click on the small, blue cube which is set as the value of the Communicator Prefab property.
  • En el panel proyecto , el recurso prefabricado de Communicator debería tener ahora el foco.In the Project panel, the Communicator prefab should now have focus.
  • Haga clic en Communicator recurso prefabricado en el panel proyecto para ver sus componentes en el Inspector.Click on the Communicator prefab in the Project panel to view its components in the Inspector.
  • Fíjese en el componente Administrador de micrófonos (Script) , lo que nos permitirá grabar la voz del usuario.Look at the Microphone Manager (Script) component, this will allow us to record the user's voice.
  • Observe que el objeto Communicator tiene un componente de controlador de entrada de voz (Script) para responder al comando send Message .Notice that the Communicator object has a Speech Input Handler (Script) component for responding to the Send Message command.
  • Fíjese en el componente Communicator (Script) y haga doble clic en el script para abrirlo en Visual Studio.Look at the Communicator (Script) component and double-click on the script to open it in Visual Studio.

Communicator.cs es responsable de establecer los Estados de botón adecuados en el dispositivo Communicator.Communicator.cs is responsible for setting the proper button states on the communicator device. Esto permitirá a los usuarios grabar un mensaje, reproducirlo y enviar el mensaje a Astronaut.This will allow our users to record a message, play it back, and send the message to the astronaut. También iniciará y detendrá un formulario de onda animada para confirmar al usuario que se ha escuchado su voz.It will also start and stop an animated wave form, to acknowledge to the user that their voice was heard.

  • En Communicator.CS, elimine las líneas siguientes (81 y 82) del método Start .In Communicator.cs, delete the following lines (81 and 82) from the Start method. Esto habilitará el botón "registro" en Communicator.This will enable the 'Record' button on the communicator.
// TODO: 2.a Delete the following two lines:
RecordButton.SetActive(false);
MessageUIRenderer.gameObject.SetActive(false);

Compilación e implementaciónBuild and Deploy

  • En Visual Studio, vuelva a compilar la aplicación e implementarla en el dispositivo.In Visual Studio, rebuild your application and deploy to the device.
  • Mira la inspección de Astronaut y di "abrir Communicator" para mostrar el Communicator.Gaze at the astronaut's watch and say "Open Communicator" to show the communicator.
  • Presione el botón grabar (micrófono) para iniciar la grabación de un mensaje verbal para el Astronaut.Press the Record button (microphone) to start recording a verbal message for the astronaut.
  • Empiece a hablar y compruebe que la animación de onda se reproduce en Communicator, que proporciona comentarios al usuario de que se oye su voz.Start speaking, and verify that the wave animation plays on the communicator, which provides feedback to the user that their voice is heard.
  • Presione el botón detener (cuadrado izquierdo) y compruebe que la animación de onda deja de ejecutarse.Press the Stop button (left square), and verify that the wave animation stops running.
  • Presione el botón de reproducción (triángulo derecho) para reproducir el mensaje grabado y oír en el dispositivo.Press the Play button (right triangle) to play back the recorded message and hear it on the device.
  • Presione el botón detener (cuadrado derecho) para detener la reproducción del mensaje grabado.Press the Stop button (right square) to stop playback of the recorded message.
  • Por ejemplo, "Enviar mensaje" para cerrar Communicator y recibir una respuesta "mensaje recibido" de Astronaut.Say "Send Message" to close the communicator and receive a 'Message Received' response from the astronaut.

Capítulo 3: Descripción y el reconocedor de dictadoChapter 3 - Understanding and the Dictation Recognizer

ObjetivosObjectives

  • Use el reconocedor de dictado para convertir la voz del usuario en texto.Use the Dictation Recognizer to convert the user's speech to text.
  • Mostrar los resultados teóricos y finales del reconocedor de dictado en Communicator.Show the Dictation Recognizer's hypothesized and final results in the communicator.

En este capítulo, usaremos el reconocedor de dictado para crear un mensaje para el Astronaut.In this chapter, we'll use the Dictation Recognizer to create a message for the astronaut. Al usar el reconocedor de dictado, tenga en cuenta lo siguiente:When using the Dictation Recognizer, keep in mind that:

  • Debe estar conectado a la red Wi-Fi para que el reconocedor de dictado funcione.You must be connected to WiFi for the Dictation Recognizer to work.
  • Los tiempos de espera se producen después de un período de tiempo establecido.Timeouts occur after a set period of time. Hay dos tiempos de espera que se deben tener en cuenta:There are two timeouts to be aware of:
    • Si el reconocedor se inicia y no oye ningún audio durante los primeros cinco segundos, se agotará el tiempo de espera.If the recognizer starts and doesn't hear any audio for the first five seconds, it will timeout.
    • Si el reconocedor ha dado un resultado pero oye el silencio durante veinte segundos, se agotará el tiempo de espera.If the recognizer has given a result but then hears silence for twenty seconds, it will timeout.
  • Solo se puede ejecutar un tipo de reconocedor (palabra clave o dictado) a la vez.Only one type of recognizer (Keyword or Dictation) can run at a time.

Nota

La capacidad del micrófono se debe declarar para que una aplicación se grabe desde el micrófono.The Microphone capability must be declared for an app to record from the microphone. Esto se hace ya en la entrada MR 212, pero tenga esto en cuenta para sus propios proyectos.This is done for you already in MR Input 212, but keep this in mind for your own projects.

  1. En el editor de Unity, vaya a la configuración del reproductor en "editar > configuración del proyecto > Player".In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. Haga clic en la pestaña "Plataforma universal de Windows"Click on the "Universal Windows Platform" tab
  3. En la sección "configuración de publicación > funcionalidades", Compruebe la capacidad del micrófono .In the "Publishing Settings > Capabilities" section, check the Microphone capability

InstructionsInstructions

Vamos a editar MicrophoneManager.CS para usar el reconocedor de dictado.We're going to edit MicrophoneManager.cs to use the Dictation Recognizer. Esto es lo que agregaremos:This is what we'll add:

  1. Cuando se presiona el botón grabar , se inicia el DictationRecognizer.When the Record button is pressed, we'll start the DictationRecognizer.
  2. Mostrar la hipótesis de lo que DictationRecognizer entendió.Show the hypothesis of what the DictationRecognizer understood.
  3. Bloquee los resultados de lo que DictationRecognizer entendió.Lock in the results of what the DictationRecognizer understood.
  4. Compruebe los tiempos de espera de DictationRecognizer.Check for timeouts from the DictationRecognizer.
  5. Cuando se presiona el botón detener o se agota el tiempo de espera de la sesión MIC, detenga el DictationRecognizer.When the Stop button is pressed, or the mic session times out, stop the DictationRecognizer.
  6. Reinicie KeywordRecognizer, que escuchará el comando send Message .Restart the KeywordRecognizer, which will listen for the Send Message command.

Comencemos.Let's get started. Complete todos los ejercicios de codificación de 3. a en MicrophoneManager.CS, o copie y pegue el código finalizado que se encuentra a continuación:Complete all coding exercises for 3.a in MicrophoneManager.cs, or copy and paste the finished code found below:

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Windows.Speech;

namespace Academy
{
    public class MicrophoneManager : MonoBehaviour
    {
        [Tooltip("A text area for the recognizer to display the recognized strings.")]
        [SerializeField]
        private Text dictationDisplay;

        private DictationRecognizer dictationRecognizer;

        // Use this string to cache the text currently displayed in the text box.
        private StringBuilder textSoFar;

        // Using an empty string specifies the default microphone.
        private static string deviceName = string.Empty;
        private int samplingRate;
        private const int messageLength = 10;

        // Use this to reset the UI once the Microphone is done recording after it was started.
        private bool hasRecordingStarted;

        void Awake()
        {
            /* TODO: DEVELOPER CODING EXERCISE 3.a */

            // 3.a: Create a new DictationRecognizer and assign it to dictationRecognizer variable.
            dictationRecognizer = new DictationRecognizer();

            // 3.a: Register for dictationRecognizer.DictationHypothesis and implement DictationHypothesis below
            // This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
            dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

            // 3.a: Register for dictationRecognizer.DictationResult and implement DictationResult below
            // This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
            dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

            // 3.a: Register for dictationRecognizer.DictationComplete and implement DictationComplete below
            // This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
            dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

            // 3.a: Register for dictationRecognizer.DictationError and implement DictationError below
            // This event is fired when an error occurs.
            dictationRecognizer.DictationError += DictationRecognizer_DictationError;

            // Query the maximum frequency of the default microphone. Use 'unused' to ignore the minimum frequency.
            int unused;
            Microphone.GetDeviceCaps(deviceName, out unused, out samplingRate);

            // Use this string to cache the text currently displayed in the text box.
            textSoFar = new StringBuilder();

            // Use this to reset the UI once the Microphone is done recording after it was started.
            hasRecordingStarted = false;
        }

        void Update()
        {
            // 3.a: Add condition to check if dictationRecognizer.Status is Running
            if (hasRecordingStarted && !Microphone.IsRecording(deviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                // Reset the flag now that we're cleaning up the UI.
                hasRecordingStarted = false;

                // This acts like pressing the Stop button and sends the message to the Communicator.
                // If the microphone stops as a result of timing out, make sure to manually stop the dictation recognizer.
                // Look at the StopRecording function.
                SendMessage("RecordStop");
            }
        }

        /// <summary>
        /// Turns on the dictation recognizer and begins recording audio from the default microphone.
        /// </summary>
        /// <returns>The audio clip recorded from the microphone.</returns>
        public AudioClip StartRecording()
        {
            // 3.a Shutdown the PhraseRecognitionSystem. This controls the KeywordRecognizers
            PhraseRecognitionSystem.Shutdown();

            // 3.a: Start dictationRecognizer
            dictationRecognizer.Start();

            // 3.a Uncomment this line
            dictationDisplay.text = "Dictation is starting. It may take time to display your text the first time, but begin speaking now...";

            // Set the flag that we've started recording.
            hasRecordingStarted = true;

            // Start recording from the microphone for 10 seconds.
            return Microphone.Start(deviceName, false, messageLength, samplingRate);
        }

        /// <summary>
        /// Ends the recording session.
        /// </summary>
        public void StopRecording()
        {
            // 3.a: Check if dictationRecognizer.Status is Running and stop it if so
            if (dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                dictationRecognizer.Stop();
            }

            Microphone.End(deviceName);
        }

        /// <summary>
        /// This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
        /// </summary>
        /// <param name="text">The currently hypothesized recognition.</param>
        private void DictationRecognizer_DictationHypothesis(string text)
        {
            // 3.a: Set DictationDisplay text to be textSoFar and new hypothesized text
            // We don't want to append to textSoFar yet, because the hypothesis may have changed on the next event
            dictationDisplay.text = textSoFar.ToString() + " " + text + "...";
        }

        /// <summary>
        /// This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
        /// </summary>
        /// <param name="text">The text that was heard by the recognizer.</param>
        /// <param name="confidence">A representation of how confident (rejected, low, medium, high) the recognizer is of this recognition.</param>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // 3.a: Append textSoFar with latest text
            textSoFar.Append(text + ". ");

            // 3.a: Set DictationDisplay text to be textSoFar
            dictationDisplay.text = textSoFar.ToString();
        }

        /// <summary>
        /// This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
        /// Typically, this will simply return "Complete". In this case, we check to see if the recognizer timed out.
        /// </summary>
        /// <param name="cause">An enumerated reason for the session completing.</param>
        private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
        {
            // If Timeout occurs, the user has been silent for too long.
            // With dictation, the default timeout after a recognition is 20 seconds.
            // The default timeout with initial silence is 5 seconds.
            if (cause == DictationCompletionCause.TimeoutExceeded)
            {
                Microphone.End(deviceName);

                dictationDisplay.text = "Dictation has timed out. Please press the record button again.";
                SendMessage("ResetAfterTimeout");
            }
        }

        /// <summary>
        /// This event is fired when an error occurs.
        /// </summary>
        /// <param name="error">The string representation of the error reason.</param>
        /// <param name="hresult">The int representation of the hresult.</param>
        private void DictationRecognizer_DictationError(string error, int hresult)
        {
            // 3.a: Set DictationDisplay text to be the error string
            dictationDisplay.text = error + "\nHRESULT: " + hresult;
        }

        /// <summary>
        /// The dictation recognizer may not turn off immediately, so this call blocks on
        /// the recognizer reporting that it has actually stopped.
        /// </summary>
        public IEnumerator WaitForDictationToStop()
        {
            while (dictationRecognizer != null && dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                yield return null;
            }
        }
    }
}

Compilación e implementaciónBuild and Deploy

  • Vuelva a compilar en Visual Studio e impleméntela en el dispositivo.Rebuild in Visual Studio and deploy to your device.
  • Descartar el cuadro de ajuste con un gesto de punteo de aire.Dismiss the fit box with an air-tap gesture.
  • Mira el Astronaut y di "abrir Communicator".Gaze at the astronaut's watch and say "Open Communicator".
  • Seleccione el botón grabar (micrófono) para grabar el mensaje.Select the Record button (microphone) to record your message.
  • Empiece a hablar.Start speaking. El reconocedor de dictado interpretará su voz y mostrará el texto teórico en Communicator.The Dictation Recognizer will interpret your speech and show the hypothesized text in the communicator.
  • Intente decir "Enviar mensaje" mientras está grabando un mensaje.Try saying "Send Message" while you are recording a message. Observe que el reconocedor de palabras clave no responde porque el reconocedor de dictado todavía está activo.Notice that the Keyword Recognizer does not respond because the Dictation Recognizer is still active.
  • Deje de hablar durante unos segundos.Stop speaking for a few seconds. Observe que el reconocedor de dictado completa su hipótesis y muestra el resultado final.Watch as the Dictation Recognizer completes its hypothesis and shows the final result.
  • Empiece a hablar y, a continuación, PAUSE durante 20 segundos.Begin speaking and then pause for 20 seconds. Esto hará que el reconocedor de dictado agote el tiempo de espera.This will cause the Dictation Recognizer to timeout.
  • Tenga en cuenta que el reconocedor de palabras clave se vuelve a habilitar después del tiempo de espera anterior.Notice that the Keyword Recognizer is re-enabled after the above timeout. Communicator responderá ahora a los comandos de voz.The communicator will now respond to voice commands.
  • Por ejemplo, "Enviar mensaje" para enviar el mensaje a Astronaut.Say "Send Message" to send the message to the astronaut.

Capítulo 4: Reconocedor de gramáticaChapter 4 - Grammar Recognizer

ObjetivosObjectives

  • Use el reconocedor de gramática para reconocer la voz del usuario de acuerdo con un archivo SRGS o una especificación de gramática de reconocimiento de voz.Use the Grammar Recognizer to recognize the user's speech according to an SRGS, or Speech Recognition Grammar Specification, file.

Nota

La capacidad del micrófono se debe declarar para que una aplicación se grabe desde el micrófono.The Microphone capability must be declared for an app to record from the microphone. Esto se hace ya en la entrada MR 212, pero tenga esto en cuenta para sus propios proyectos.This is done for you already in MR Input 212, but keep this in mind for your own projects.

  1. En el editor de Unity, vaya a la configuración del reproductor en "editar > configuración del proyecto > Player".In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. Haga clic en la pestaña "Plataforma universal de Windows"Click on the "Universal Windows Platform" tab
  3. En la sección "configuración de publicación > funcionalidades", Compruebe la capacidad del micrófono .In the "Publishing Settings > Capabilities" section, check the Microphone capability

InstructionsInstructions

  1. En el panel jerarquía , busque Jetpack_Center y selecciónelo.In the Hierarchy panel, search for Jetpack_Center and select it.
  2. Busque el script de acción tagalong en el panel Inspector .Look for the Tagalong Action script in the Inspector panel.
  3. Haga clic en el círculo pequeño situado a la derecha del objeto para etiquetar a lo largo del campo.Click the little circle to the right of the Object To Tag Along field.
  4. En la ventana que aparece, busque SRGSToolbox y selecciónela en la lista.In the window that pops up, search for SRGSToolbox and select it from the list.
  5. Eche un vistazo al archivo SRGSColor.xml de la carpeta StreamingAssets .Take a look at the SRGSColor.xml file in the StreamingAssets folder.
    1. Las especificaciones de diseño de SRGS se pueden encontrar aquíen el sitio web de W3C.The SRGS design spec can be found on the W3C website here.

En nuestro archivo SRGS, tenemos tres tipos de reglas:In our SRGS file, we have three types of rules:

  • Una regla que le permite decir un color de una lista de doce colores.A rule which lets you say one color from a list of twelve colors.
  • Tres reglas que escuchan una combinación de la regla de color y una de las tres formas.Three rules which listen for a combination of the color rule and one of the three shapes.
  • La regla raíz, colorChooser, que escucha cualquier combinación de las tres reglas de "color + forma".The root rule, colorChooser, which listens for any combination of the three "color + shape" rules. Las formas se pueden decir en cualquier orden y en cualquier cantidad de solo de una a las tres.The shapes can be said in any order and in any amount from just one to all three. Esta es la única regla que se escucha, ya que se especifica como la regla raíz en la parte superior del archivo en la etiqueta de < gramática inicial > .This is the only rule that is listened for, as it's specified as the root rule at the top of the file in the initial <grammar> tag.

Compilación e implementaciónBuild and Deploy

  • Vuelva a compilar la aplicación en Unity y luego compile e implemente desde Visual Studio para experimentar la aplicación en HoloLens.Rebuild the application in Unity, then build and deploy from Visual Studio to experience the app on HoloLens.
  • Descartar el cuadro de ajuste con un gesto de punteo de aire.Dismiss the fit box with an air-tap gesture.
  • Mira el jetpack del Astronaut y realiza un gesto de pulsación de aire.Gaze at the astronaut's jetpack and perform an air-tap gesture.
  • Empiece a hablar.Start speaking. El reconocedor de gramática interpretará la voz y cambiará los colores de las formas en función del reconocimiento.The Grammar Recognizer will interpret your speech and change the colors of the shapes based on the recognition. Un comando de ejemplo es "círculo azul, cuadrado amarillo".An example command is "blue circle, yellow square".
  • Realice otro gesto de punteo de aire para descartar el cuadro de herramientas.Perform another air-tap gesture to dismiss the toolbox.

FinThe End

Felicidades.Congratulations! Ahora ha completado la entrada MR 212: Voice.You have now completed MR Input 212: Voice.

  • Conoce las dos y no los comandos de voz.You know the Dos and Don'ts of voice commands.
  • Vio cómo se empleó la información sobre herramientas para que los usuarios conozcan los comandos de voz.You saw how tooltips were employed to make users aware of voice commands.
  • Vio varios tipos de comentarios usados para confirmar que se ha escuchado la voz del usuario.You saw several types of feedback used to acknowledge that the user's voice was heard.
  • Sabe cómo cambiar entre el reconocedor de palabras clave y el reconocedor de dictado y cómo estas dos características entienden e interpretan la voz.You know how to switch between the Keyword Recognizer and the Dictation Recognizer, and how these two features understand and interpret your voice.
  • Ha aprendido a usar un archivo SRGS y el reconocedor de gramática para el reconocimiento de voz en la aplicación.You learned how to use an SRGS file and the Grammar Recognizer for speech recognition in your application.