MR y Azure 303: comprensión del lenguaje natural (LUIS)MR and Azure 303: Natural language understanding (LUIS)


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. Habrá una nueva serie de tutoriales que se publicarán en el futuro que mostrarán cómo desarrollar para HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.This notice will be updated with a link to those tutorials when they are posted.


En este curso, aprenderá a integrar Language Understanding en una aplicación de realidad mixta con Azure Cognitive Services, con la Language Understanding API.In this course, you will learn how to integrate Language Understanding into a mixed reality application using Azure Cognitive Services, with the Language Understanding API.

Resultado de laboratorio

Language Understanding (Luis) es un servicio de Microsoft Azure, que proporciona a las aplicaciones la capacidad de ser el significado de los datos proporcionados por el usuario, como por ejemplo, al extraer lo que una persona podría querer, en sus propias palabras.Language Understanding (LUIS) is a Microsoft Azure service, which provides applications with the ability to make meaning out of user input, such as through extracting what a person might want, in their own words. Esto se consigue a través del aprendizaje automático, que comprende y aprende la información de entrada y, a continuación, puede responder con información detallada, relevante.This is achieved through machine learning, which understands and learns the input information, and then can reply with detailed, relevant, information. Para obtener más información, visite la Página de Azure Language Understanding (Luis).For more information, visit the Azure Language Understanding (LUIS) page.

Una vez finalizado este curso, tendrá una aplicación de auriculares con un casco de realidad mixta que podrá hacer lo siguiente:Having completed this course, you will have a mixed reality immersive headset application which will be able to do the following:

  1. Capture la voz de entrada del usuario con el micrófono conectado al casco envolvente.Capture user input speech, using the Microphone attached to the immersive headset.
  2. Envíe el dictado capturado a Azure Language Understanding Intelligent Service (Luis).Send the captured dictation the Azure Language Understanding Intelligent Service (LUIS).
  3. Tenga el significado de LUIS Extract de la información de envío, que se analizará y se realizará un intento de determinar la intención de la solicitud del usuario.Have LUIS extract meaning from the send information, which will be analyzed, and attempt to determine the intent of the user’s request will be made.

El desarrollo incluirá la creación de una aplicación en la que el usuario podrá usar la voz o la mirada para cambiar el tamaño y el color de los objetos de la escena.Development will include the creation of an app where the user will be able to use voice and/or gaze to change the size and the color of the objects in the scene. No se tratará el uso de controladores de movimiento.The use of motion controllers will not be covered.

En su aplicación, depende del modo en que va a integrar los resultados con el diseño.In your application, it is up to you as to how you will integrate the results with your design. Este curso está diseñado para enseñarle a integrar un servicio de Azure con su proyecto de Unity.This course is designed to teach you how to integrate an Azure Service with your Unity Project. Es su trabajo usar el conocimiento que obtiene de este curso para mejorar su aplicación de realidad mixta.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Esté preparado para entrenar a LUIS varias veces, que se trata en el capítulo 12.Be prepared to Train LUIS several times, which is covered in Chapter 12. Obtendrá mejores resultados cuanto más se haya entrenado a LUIS.You will get better results the more times LUIS has been trained.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
MR y Azure 303: comprensión del lenguaje natural (LUIS)MR and Azure 303: Natural language understanding (LUIS) ✔️✔️ ✔️✔️

Nota

Aunque este curso se centra principalmente en los auriculares de Windows Mixed Reality inmersivo (VR), también puede aplicar lo que aprenda en este curso a Microsoft HoloLens.While this course primarily focuses on Windows Mixed Reality immersive (VR) headsets, you can also apply what you learn in this course to Microsoft HoloLens. A medida que siga con el curso, verá notas sobre cualquier cambio que deba usar para admitir HoloLens.As you follow along with the course, you will see notes on any changes you might need to employ to support HoloLens. Al usar HoloLens, puede observar algún Eco durante la captura de voz.When using HoloLens, you may notice some echo during voice capture.

Requisitos previosPrerequisites

Nota

Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Unity y C#.This tutorial is designed for developers who have basic experience with Unity and C#. Tenga en cuenta también que los requisitos previos y las instrucciones escritas dentro de este documento representan lo que se ha probado y comprobado en el momento de la escritura (2018 de mayo).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (May 2018). Puede usar el software más reciente, como se indica en el artículo instalar las herramientas , aunque no se debe suponer que la información de este curso se ajusta perfectamente a lo que encontrará en el software más reciente que el que se indica a continuación.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you'll find in newer software than what's listed below.

Se recomienda el siguiente hardware y software para este curso:We recommend the following hardware and software for this course:

Antes de comenzarBefore you start

  1. Para evitar que se produzcan problemas al compilar este proyecto, se recomienda encarecidamente que cree el proyecto mencionado en este tutorial en una carpeta raíz o cerca de la raíz (las rutas de acceso de carpeta largas pueden producir problemas en tiempo de compilación).To avoid encountering issues building this project, it is strongly suggested that you create the project mentioned in this tutorial in a root or near-root folder (long folder paths can cause issues at build-time).

  2. Para permitir que el equipo habilite el dictado, vaya a configuración de Windows > privacidad > voz, entrada manuscrita & escriba y presione el botón activar servicios de voz y sugerencias de escritura.To allow your machine to enable Dictation, go to Windows Settings > Privacy > Speech, Inking & Typing and press on the button Turn On speech services and typing suggestions.

  3. El código de este tutorial le permitirá grabar desde el dispositivo de micrófono predeterminado del equipo.The code in this tutorial will allow you to record from the Default Microphone Device set on your machine. Asegúrese de que el dispositivo de micrófono predeterminado esté establecido como el que desea usar para capturar la voz.Make sure the Default Microphone Device is set as the one you wish to use to capture your voice.

  4. Si el casco tiene un micrófono integrado, asegúrese de que la opción "al gastar el casco, cambiar al micrófono de auriculares" está activada en la configuración del portal de realidad mixta .If your headset has a built-in microphone, make sure the option “When I wear my headset, switch to headset mic” is turned on in the Mixed Reality Portal settings.

    Configuración de auriculares inmersivo

Capítulo 1: configuración del portal de AzureChapter 1 – Setup Azure Portal

Para usar el servicio de Language Understanding en Azure, tendrá que configurar una instancia del servicio para que esté disponible para la aplicación.To use the Language Understanding service in Azure, you will need to configure an instance of the service to be made available to your application.

  1. Inicie sesión en Azure Portal.Log in to the Azure Portal.

    Nota

    Si aún no tiene una cuenta de Azure, tendrá que crear una.If you do not already have an Azure account, you will need to create one. Si sigue este tutorial en una situación de aula o de laboratorio, pregunte al instructor o a uno de los Proctors para obtener ayuda para configurar la nueva cuenta.If you are following this tutorial in a classroom or lab situation, ask your instructor or one of the proctors for help setting up your new account.

  2. Una vez que haya iniciado sesión, haga clic en nuevo en la esquina superior izquierda y busque Language Understanding y haga clic en entrar.Once you are logged in, click on New in the top left corner, and search for Language Understanding, and click Enter.

    Creación de un recurso de LUIS

    Nota

    Es posible que la palabra nuevo se haya reemplazado por crear un recurso, en portales más recientes.The word New may have been replaced with Create a resource, in newer portals.

  3. La nueva página a la derecha proporcionará una descripción del servicio de Language Understanding.The new page to the right will provide a description of the Language Understanding service. En la parte inferior izquierda de esta página, seleccione el botón crear para crear una instancia de este servicio.At the bottom left of this page, select the Create button, to create an instance of this service.

    Creación del servicio LUIS: Aviso legal

  4. Una vez que haya hecho clic en crear:Once you have clicked on Create:

    1. Inserte el nombre que desee para esta instancia de servicio.Insert your desired Name for this service instance.

    2. Seleccione una opción en Suscripción.Select a Subscription.

    3. Seleccione el plan de tarifa adecuado para usted; si es la primera vez que crea un servicio Luis, debe tener a su disposición un nivel gratis (denominado F0).Select the Pricing Tier appropriate for you, if this is the first time creating a LUIS Service, a free tier (named F0) should be available to you. La asignación gratuita debe ser más que suficiente para este curso.The free allocation should be more than sufficient for this course.

    4. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar la facturación de una colección de recursos de Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).It is recommended to keep all the Azure services associated with a single project (e.g. such as these courses) under a common resource group).

      Si desea leer más información sobre los grupos de recursos de Azure, visite el artículo sobre el grupo de recursos.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Determine la Ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos).Determine the Location for your resource group (if you are creating a new Resource Group). Idealmente, la ubicación estará en la región donde se ejecutará la aplicación.The location would ideally be in the region where the application would run. Algunos recursos de Azure solo están disponibles en determinadas regiones.Some Azure assets are only available in certain regions.

    6. También deberá confirmar que ha comprendido los términos y condiciones que se aplican a este servicio.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Seleccione Crear.Select Create.

      Crear el servicio LUIS: entrada del usuario

  5. Una vez que haya hecho clic en crear, tendrá que esperar a que se cree el servicio, lo que puede tardar un minuto.Once you have clicked on Create, you will have to wait for the service to be created, this might take a minute.

  6. Una vez que se crea la instancia de servicio, aparecerá una notificación en el portal.A notification will appear in the portal once the Service instance is created.

    Nueva imagen de notificación de Azure

  7. Haga clic en la notificación para explorar la nueva instancia de servicio.Click on the notification to explore your new Service instance.

    Notificación de creación de recursos correcta

  8. Haga clic en el botón ir a recurso de la notificación para explorar la nueva instancia de servicio.Click the Go to resource button in the notification to explore your new Service instance. Se le dirigirá a la nueva instancia de servicio de LUIS.You will be taken to your new LUIS service instance.

    Acceso a claves de LUIS

  9. En este tutorial, la aplicación necesitará realizar llamadas al servicio, lo que se realiza mediante el uso de la clave de suscripción del servicio.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. En la página de Inicio rápido , del servicio de API de Luis , navegue hasta el primer paso, grabe sus claves y haga clic en claves (también puede conseguirlo haciendo clic en las teclas de hipervínculo azul, que se encuentran en el menú de navegación servicios, indicado por el icono de llave).From the Quick start page, of your LUIS API service, navigate to the first step, Grab your keys, and click Keys (you can also achieve this by clicking the blue hyperlink Keys, located in the services navigation menu, denoted by the key icon). Esto revelará las claves de servicio.This will reveal your service Keys.

  11. Realice una copia de una de las claves que se muestran, ya que la necesitará más adelante en el proyecto.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. En la página servicio , haga clic en Language Understanding portal para redirigirse a la página web que usará para crear el nuevo servicio, dentro de la aplicación Luis.In the Service page, click on Language Understanding Portal to be redirected to the webpage which you will use to create your new Service, within the LUIS App.

Capítulo 2: portal de Language UnderstandingChapter 2 – The Language Understanding Portal

En esta sección, aprenderá a crear una aplicación de LUIS en el portal de LUIS.In this section you will learn how to make a LUIS App on the LUIS Portal.

Importante

Tenga en cuenta que la configuración de las entidades, las intenciones y grabaciones en este capítulo es solo el primer paso para crear el servicio de Luis: también tendrá que volver a entrenar el servicio, varias veces, para que sea más preciso.Please be aware, that setting up the Entities, Intents, and Utterances within this chapter is only the first step in building your LUIS service: you will also need to retrain the service, several times, so to make it more accurate. El reciclaje del servicio se trata en el último capítulo de este curso, por lo que debe asegurarse de que lo completa.Retraining your service is covered in the last Chapter of this course, so ensure that you complete it.

  1. Al llegar al portal de Language Understanding, puede que tenga que iniciar sesión, si aún no lo está, con las mismas credenciales que el Azure portal.Upon reaching the Language Understanding Portal, you may need to login, if you are not already, with the same credentials as your Azure portal.

    Página de inicio de sesión de LUIS

  2. Si esta es la primera vez que usa LUIS, tendrá que desplazarse hacia abajo hasta la parte inferior de la Página principal, para buscar y hacer clic en el botón crear aplicación de Luis .If this is your first time using LUIS, you will need to scroll down to the bottom of the welcome page, to find and click on the Create LUIS app button.

    Página crear aplicación LUIS

  3. Una vez que haya iniciado sesión, haga clic en mis aplicaciones (si no está en esa sección actualmente).Once logged in, click My apps (if you are not in that section currently). Después, puede hacer clic en crear nueva aplicación.You can then click on Create new app.

    LUIS: imagen de mis aplicaciones

  4. Asigne un nombre a la aplicación.Give your app a Name.

  5. Si se supone que la aplicación comprende un idioma distinto del inglés, debe cambiar la referencia cultural al idioma adecuado.If your app is supposed to understand a language different from English, you should change the Culture to the appropriate language.

  6. Aquí también puede Agregar una Descripción de la nueva aplicación Luis.Here you can also add a Description of your new LUIS app.

    LUIS: creación de una nueva aplicación

  7. Una vez que presione listo, escribirá la página compilación de la nueva aplicación Luis .Once you press Done, you will enter the Build page of your new LUIS application.

  8. Hay algunos conceptos importantes que debe comprender aquí:There are a few important concepts to understand here:

    • Intención, representa el método al que se llamará después de una consulta del usuario.Intent, represents the method that will be called following a query from the user. Un intento puede tener una o más entidades.An INTENT may have one or more ENTITIES.
    • Entidad, es un componente de la consulta que describe la información relevante para la intención.Entity, is a component of the query that describes information relevant to the INTENT.
    • Grabaciones, son ejemplos de consultas proporcionadas por el desarrollador que Luis usará para entrenarse.Utterances, are examples of queries provided by the developer, that LUIS will use to train itself.

Si estos conceptos no están perfectamente claros, no se preocupe, ya que este curso lo aclarará más adelante en este capítulo.If these concepts are not perfectly clear, do not worry, as this course will clarify them further in this chapter.

Comenzará creando las entidades necesarias para compilar este curso.You will begin by creating the Entities needed to build this course.

  1. En el lado izquierdo de la página, haga clic en entidades y, a continuación, haga clic en crear nueva entidad.On the left side of the page, click on Entities, then click on Create new entity.

    Crear nueva entidad

  2. Llame al nuevo color de entidad, establezca su tipo en simple y, después, haga clic en listo.Call the new Entity color, set its type to Simple, then press Done.

    Crear un color de entidad simple

  3. Repita este proceso para crear tres (3) entidades más simples denominadas:Repeat this process to create three (3) more Simple Entities named:

    • actualizarupsize
    • reducirdownsize
    • Destinotarget

El resultado debería ser similar a la imagen siguiente:The result should look like the image below:

Resultado de la creación de entidades

Llegados a este punto, puede empezar a crear intenciones.At this point you can begin creating Intents.

Advertencia

No elimine ningún intento.Do not delete the None intent.

  1. En el lado izquierdo de la página, haga clic en intenciones y, a continuación, haga clic en crear nuevo intento.On the left side of the page, click on Intents, then click on Create new intent.

    Crear nuevas intenciones

  2. Llame al nuevo intento ChangeObjectColor.Call the new Intent ChangeObjectColor.

    Importante

    Este nombre de intención se usa en el código más adelante en este curso, por lo que para obtener los mejores resultados, use este nombre exactamente como se indica.This Intent name is used within the code later in this course, so for best results, use this name exactly as provided.

Una vez que confirme el nombre, se le redirigirá a la página de intents.Once you confirm the name you will be directed to the Intents Page.

LUIS-página de intents

Observará que hay un cuadro de texto que le pide que escriba 5 o más grabaciones diferentes.You will notice that there is a textbox asking you to type 5 or more different Utterances.

Nota

LUIS convierte todos los grabaciones a minúsculas.LUIS converts all Utterances to lower case.

  1. Inserte el siguiente utterance en el cuadro de texto superior (actualmente con el tipo de texto sobre 5 ejemplos...Insert the following Utterance in the top textbox (currently with the text Type about 5 examples… ) y presione entrar:), and press Enter:
The color of the cylinder must be red

Observará que el nuevo utterance aparecerá en una lista debajo de.You will notice that the new Utterance will appear in a list underneath.

Siguiendo el mismo proceso, inserte los seis (6) grabaciones siguientes:Following the same process, insert the following six (6) Utterances:

make the cube black

make the cylinder color white

change the sphere to red

change it to green

make this yellow

change the color of this object to blue

Para cada utterance que haya creado, debe identificar qué palabras deben usar los LUIS como entidades.For each Utterance you have created, you must identify which words should be used by LUIS as Entities. En este ejemplo, debe etiquetar todos los colores como una entidad de color y todas las referencias posibles a un destino como entidad de destino .In this example you need to label all the colors as a color Entity, and all the possible reference to a target as a target Entity.

  1. Para ello, intente hacer clic en la palabra cilindro en el primer utterance y seleccione destino.To do so, try clicking on the word cylinder in the first Utterance and select target.

    Identificación de los destinos de utterance

  2. Ahora, haga clic en la palabra red del primer utterance y seleccione color.Now click on the word red in the first Utterance and select color.

    Identificación de las entidades utterance

  3. Etiquete la siguiente línea también, donde Cube debe ser un destino y el negro debe ser un color.Label the next line also, where cube should be a target, and black should be a color. Observe también el uso de las palabras ' this ', ' it ' y ' this Object ', que ofrecemos, por lo que para tener también disponibles tipos de destino no específicos.Notice also the use of the words ‘this’, ‘it’, and ‘this object’, which we are providing, so to have non-specific target types available also.

  4. Repita el proceso anterior hasta que todos los grabaciones tengan las entidades etiquetadas.Repeat the process above until all the Utterances have the Entities labelled. Si necesita ayuda, consulte la siguiente imagen.See the below image if you need help.

    Sugerencia

    Al seleccionar las palabras que quiere etiquetar como entidades:When selecting words to label them as entities:

    • Solo tiene que hacer clic en las palabras individuales.For single words just click them.
    • Para un conjunto de dos o más palabras, haga clic en al principio y, a continuación, al final del conjunto.For a set of two or more words, click at the beginning and then at the end of the set.

    Nota

    Puede usar el botón de alternancia de la vista tokens para cambiar entre la vista de entidades y tokens.You can use the Tokens View toggle button to switch between Entities / Tokens View!

  5. Los resultados deben ser tal como se muestra en las imágenes siguientes, mostrando la vista de entidades o tokens:The results should be as seen in the images below, showing the Entities / Tokens View:

    Tokens & vistas de entidades

  6. En este punto, presione el botón entrenar situado en la parte superior derecha de la página y espere a que el pequeño indicador redondo se convierta en verde.At this point press the Train button at the top-right of the page and wait for the small round indicator on it to turn green. Esto indica que LUIS se ha entrenado correctamente para reconocer este intento.This indicates that LUIS has been successfully trained to recognize this Intent.

    Entrenar a LUIS

  7. Como ejercicio, cree un nuevo intento llamado ChangeObjectSize con las entidades target , up y reducir.As an exercise for you, create a new Intent called ChangeObjectSize, using the Entities target, upsize, and downsize.

  8. Siguiendo el mismo proceso que la intención anterior, inserte los ocho (8) grabaciones siguientes para el cambio de tamaño :Following the same process as the previous Intent, insert the following eight (8) Utterances for Size change:

    increase the dimensions of that
    
    reduce the size of this
    
    i want the sphere smaller
    
    make the cylinder bigger
    
    size down the sphere
    
    size up the cube
    
    decrease the size of that object
    
    increase the size of this object
    
  9. El resultado debería ser como el de la imagen siguiente:The result should be like the one in the image below:

    Configuración de las entidades o tokens de ChangeObjectSize

  10. Una vez que se han creado y entrenado las opciones intents, ChangeObjectColor y ChangeObjectSize, haga clic en el botón publicar de la parte superior de la página.Once both Intents, ChangeObjectColor and ChangeObjectSize, have been created and trained, click on the PUBLISH button on top of the page.

    Publicar el servicio LUIS

  11. En la página publicar , finalizará y publicará la aplicación Luis para que el código pueda acceder a ella.On the Publish page you will finalize and publish your LUIS App so that it can be accessed by your code.

    1. Establezca la lista desplegable publicar en como producción.Set the drop down Publish To as Production.

    2. Establezca la zona horaria en la zona horaria.Set the Timezone to your time zone.

    3. Active la casilla incluir todas las puntuaciones de intención previstas.Check the box Include all predicted intent scores.

    4. Haga clic en publicar en ranura de producción.Click on Publish to Production Slot.

      Configuración de publicación

  12. En la sección recursos y claves:In the section Resources and Keys:

    1. Seleccione la región que estableció para instancia de servicio en Azure portal.Select the region you set for service instance in the Azure Portal.
    2. Observará un Starter_Key elemento siguiente y lo omitirá.You will notice a Starter_Key element below, ignore it.
    3. Haga clic en Agregar clave e inserte la clave que obtuvo en Azure portal al crear la instancia de servicio.Click on Add Key and insert the Key that you obtained in the Azure Portal when you created your Service instance. Si el portal de Azure y LUIS están conectados al mismo usuario, se le proporcionarán menús desplegables para el nombre del inquilino, el nombre de la suscripción y la clave que quiere usar (tendrá el mismo nombre que proporcionó anteriormente en Azure portal).If your Azure and the LUIS portal are logged into the same user, you will be provided drop-down menus for Tenant name, Subscription Name, and the Key you wish to use (will have the same name as you provided previously in the Azure Portal.

    Importante

    Debajo de punto de conexión, realice una copia del punto de conexión correspondiente a la clave que ha insertado. lo usará pronto en el código.Underneath Endpoint, take a copy of the endpoint corresponding to the Key you have inserted, you will soon use it in your code.

Capítulo 3: configuración del proyecto de UnityChapter 3 – Set up the Unity project

Lo siguiente es una configuración típica para desarrollar con la realidad mixta y, como tal, es una buena plantilla para otros proyectos.The following is a typical set up for developing with the mixed reality, and as such, is a good template for other projects.

  1. Abra Unity y haga clic en nuevo.Open Unity and click New.

    Inicie el nuevo proyecto de Unity.

  2. Ahora tendrá que proporcionar un nombre de proyecto de Unity, insertar MR_LUIS.You will now need to provide a Unity Project name, insert MR_LUIS. Asegúrese de que el tipo de proyecto está establecido en 3D.Make sure the project type is set to 3D. Establezca la Ubicación en algún lugar adecuado para usted (Recuerde que, más cerca de los directorios raíz es mejor).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). A continuación, haga clic en crear proyecto.Then, click Create project.

    Proporcione los detalles del nuevo proyecto de Unity.

  3. Con Unity abierto, merece la pena comprobar que el Editor de scripts predeterminado está establecido en Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Vaya a editar > preferencias y, a continuación, en la nueva ventana, vaya a herramientas externas.Go to Edit > Preferences and then from the new window, navigate to External Tools. Cambie el Editor de script externo a Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Cierre la ventana preferencias .Close the Preferences window.

    Actualice las preferencias del editor de scripts.

  4. A continuación, vaya a archivo > configuración de compilación y cambie la plataforma a plataforma universal de Windows, haciendo clic en el botón cambiar plataforma .Next, go to File > Build Settings and switch the platform to Universal Windows Platform, by clicking on the Switch Platform button.

    Ventana Configuración de compilación, cambiar plataforma a UWP.

  5. Vaya a archivo > configuración de compilación y asegúrese de que:Go to File > Build Settings and make sure that:

    1. El dispositivo de destino se establece en cualquier dispositivoTarget Device is set to Any Device

      Para Microsoft HoloLens, establezca el dispositivo de destino en hololens.For the Microsoft HoloLens, set Target Device to HoloLens.

    2. El tipo de compilación se establece en D3DBuild Type is set to D3D

    3. SDK está establecido en la versión más reciente instaladaSDK is set to Latest installed

    4. La versión de Visual Studio está establecida en la más reciente instaladaVisual Studio Version is set to Latest installed

    5. Compilar y ejecutar está establecido en equipo localBuild and Run is set to Local Machine

    6. Guarde la escena y agréguela a la compilación.Save the scene and add it to the build.

      1. Para ello, seleccione Agregar escenas abiertas.Do this by selecting Add Open Scenes. Aparecerá una ventana de guardar.A save window will appear.

        Haga clic en el botón Agregar escenas abiertas

      2. Cree una nueva carpeta para este, y en cualquier momento, en el futuro, seleccione el botón nueva carpeta para crear una nueva carpeta, asígnele el nombre Scenes.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Crear nueva carpeta de scripts

      3. Abra la carpeta escenas recién creada y, a continuación, en el campo nombre de archivo:, escriba MR_LuisScene y, a continuación, presione Guardar.Open your newly created Scenes folder, and then in the File name: text field, type MR_LuisScene, then press Save.

        Asigne un nombre a la nueva escena.

    7. El resto de la configuración, en la configuración de compilación, debe dejarse como predeterminada por ahora.The remaining settings, in Build Settings, should be left as default for now.

  6. En la ventana configuración de compilación , haga clic en el botón Configuración del reproductor ; se abrirá el panel relacionado en el espacio donde se encuentra el Inspector .In the Build Settings window, click on the Player Settings button, this will open the related panel in the space where the Inspector is located.

    Abra configuración del reproductor.

  7. En este panel, deben comprobarse algunas opciones de configuración:In this panel, a few settings need to be verified:

    1. En la pestaña otros valores :In the Other Settings tab:

      1. La versión de scripting en tiempo de ejecución debe ser estable (.net 3,5 equivalente).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. El back-end de scripting debe ser .netScripting Backend should be .NET

      3. El nivel de compatibilidad de API debe ser .net 4,6API Compatibility Level should be .NET 4.6

        Actualice otras opciones de configuración.

    2. En la pestaña configuración de publicación , en capacidades, seleccione:Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. MicrófonoMicrophone

        Actualizando la configuración de publicación.

    3. Más abajo en el panel, en la configuración de XR (se encuentra debajo de configuración de publicación), tick Virtual Reality compatible, asegúrese de que se agrega el SDK de Windows Mixed Reality .Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Actualice la configuración de X R.

  8. De nuevo en la configuración de compilación , los proyectos de C# de Unity ya no están atenuados; Marque la casilla situada junto a este.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Cierre la ventana Build Settings (Configuración de compilación).Close the Build Settings window.

  10. Guarde la escena y el proyecto (archivo > guardar la escena o el archivo > guardar proyecto).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capítulo 4: creación de la escenaChapter 4 – Create the scene

Importante

Si desea omitir el componente de configuración de Unity de este curso y continuar directamente en el código, no dude en descargar este . unitypackage Tools, impórtelo en el proyecto como un paquete personalizadoy, después, continúe con el capítulo 5.If you wish to skip the Unity Set up component of this course, and continue straight into code, feel free to download this .unitypackage, import it into your project as a Custom Package, and then continue from Chapter 5.

  1. Haga clic con el botón secundario en un área vacía del Panel de jerarquías, en objeto 3D, agregar un plano.Right-click in an empty area of the Hierarchy Panel, under 3D Object, add a Plane.

    Cree un plano.

  2. Tenga en cuenta que al hacer clic con el botón secundario en la jerarquía de nuevo para crear más objetos, si todavía tiene el último objeto seleccionado, el objeto seleccionado será el elemento primario del nuevo objeto.Be aware that when you right-click within the Hierarchy again to create more objects, if you still have the last object selected, the selected object will be the parent of your new object. Evite este clic con el botón secundario en un espacio vacío dentro de la jerarquía y, a continuación, haga clic con el botón derecho en.Avoid this left-clicking in an empty space within the Hierarchy, and then right-clicking.

  3. Repita el procedimiento anterior para agregar los objetos siguientes:Repeat the above procedure to add the following objects:

    1. SphereSphere
    2. CilindroCylinder
    3. CuboCube
    4. Texto 3D3D Text
  4. La jerarquía de escenas resultante debe ser similar a la de la imagen siguiente:The resulting scene Hierarchy should be like the one in the image below:

    Configuración de la jerarquía de escenas.

  5. Haga clic con el botón izquierdo en la cámara principal para seleccionarla y, en el Panel de inspector , verá el objeto de cámara con todos sus componentes.Left click on the Main Camera to select it, look at the Inspector Panel you will see the Camera object with all the its components.

  6. Haga clic en el botón Agregar componente situado en la parte inferior del panel Inspector.Click on the Add Component button located at the very bottom of the Inspector Panel.

    Agregar origen de audio

  7. Busque el componente denominado origen de audio, como se mostró anteriormente.Search for the component called Audio Source, as shown above.

  8. Asegúrese también de que el componente de transformación de la cámara principal esté establecido en (0,0). para ello, presione el icono de engranaje situado junto al componente de transformación de la cámara y seleccione restablecer.Also make sure that the Transform component of the Main Camera is set to (0,0,0), this can be done by pressing the Gear icon next to the Camera’s Transform component and selecting Reset. El componente de transformación debería tener el siguiente aspecto:The Transform component should then look like:

    1. La posición se establece en 0, 0,0.Position is set to 0, 0, 0.
    2. La rotación se establece en 0, 0,0.Rotation is set to 0, 0, 0.

    Nota

    En el caso de Microsoft HoloLens, también deberá cambiar lo siguiente, que forman parte del componente de cámara , que se encuentra en la cámara principal:For the Microsoft HoloLens, you will need to also change the following, which are part of the Camera component, which is on your Main Camera:

    • Borrar marcas: Color sólido.Clear Flags: Solid Color.
    • Información general ' Black, Alpha 0 ' – color Hex: #00000000.Background ‘Black, Alpha 0’ – Hex color: #00000000.
  9. Haga clic con el botón izquierdo en el plano para seleccionarlo.Left click on the Plane to select it. En el panel Inspector , establezca el componente de transformación con los siguientes valores:In the Inspector Panel set the Transform component with the following values:

    Eje XX Axis Eje YY Axis Eje ZZ Axis
    00 -1-1 00
  10. Haga clic con el botón izquierdo en la esfera para seleccionarlo.Left click on the Sphere to select it. En el panel Inspector , establezca el componente de transformación con los siguientes valores:In the Inspector Panel set the Transform component with the following values:

    Eje XX Axis Eje YY Axis Eje ZZ Axis
    22 11 22
  11. Haga clic con el botón izquierdo en el cilindro para seleccionarlo.Left click on the Cylinder to select it. En el panel Inspector , establezca el componente de transformación con los siguientes valores:In the Inspector Panel set the Transform component with the following values:

    Eje XX Axis Eje YY Axis Eje ZZ Axis
    -2-2 11 22
  12. Haga clic con el botón izquierdo en el cubo para seleccionarlo.Left click on the Cube to select it. En el panel Inspector , establezca el componente de transformación con los siguientes valores:In the Inspector Panel set the Transform component with the following values:

    Transformación: posiciónTransform - Position | Transformación- giroTransform - Rotation
    XX SY ZZ | XX SY ZZ
    00 11 44 | 4545 4545 00
  13. Haga clic con el botón izquierdo en el nuevo objeto de texto para seleccionarlo.Left click on the New Text object to select it. En el panel Inspector , establezca el componente de transformación con los siguientes valores:In the Inspector Panel set the Transform component with the following values:

    Transformación: posiciónTransform - Position | Transformación de escalaTransform - Scale
    XX SY ZZ | XX SY ZZ
    -2-2 66 99 | 0,10.1 0,10.1 0,10.1
  14. Cambie el tamaño de fuente en el componente de malla de texto a 50.Change Font Size in the Text Mesh component to 50.

  15. Cambie el nombre del objeto de malla de texto a texto de dictado.Change the name of the Text Mesh object to Dictation Text.

    Crear objeto de texto 3D

  16. La estructura del panel de jerarquías debería tener ahora el siguiente aspecto:Your Hierarchy Panel structure should now look like this:

    malla de texto en la vista de escenas

  17. La escena final debe ser similar a la imagen siguiente:The final scene should look like the image below:

    Vista de la escena.

Capítulo 5: crear la clase MicrophoneManagerChapter 5 – Create the MicrophoneManager class

El primer script que va a crear es la clase MicrophoneManager .The first Script you are going to create is the MicrophoneManager class. Después, creará el LuisManager, la clase de comportamientos y, por último, la clase de miras (no dude en crearlos ahora, aunque se cubrirá cuando llegue a cada capítulo).Following this, you will create the LuisManager, the Behaviours class, and lastly the Gaze class (feel free to create all these now, though it will be covered as you reach each Chapter).

La clase MicrophoneManager es responsable de:The MicrophoneManager class is responsible for:

  • Detección del dispositivo de grabación conectado a los auriculares o al equipo (lo que sea el predeterminado).Detecting the recording device attached to the headset or machine (whichever is the default one).
  • Capture el audio (voz) y use el dictado para almacenarlo como una cadena.Capture the audio (voice) and use dictation to store it as a string.
  • Una vez que se haya pausado la voz, envíe el dictado a la clase LuisManager .Once the voice has paused, submit the dictation to the LuisManager class.

Para crear esta clase:To create this class:

  1. Haga clic con el botón derecho en el panel Proyecto, cree > carpeta.Right-click in the Project Panel, Create > Folder. Llame a los scripts de la carpeta.Call the folder Scripts.

    Crear carpeta de scripts.

  2. Con la carpeta scripts creada, haga doble clic en ella para abrirla.With the Scripts folder created, double click it, to open. Después, en esa carpeta, haga clic con el botón secundario en, cree > script de C#.Then, within that folder, right-click, Create > C# Script. Asigne al script el nombre MicrophoneManager.Name the script MicrophoneManager.

  3. Haga doble clic en MicrophoneManager para abrirlo con Visual Studio.Double click on MicrophoneManager to open it with Visual Studio.

  4. Agregue los siguientes espacios de nombres al principio del archivo:Add the following namespaces to the top of the file:

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. A continuación, agregue las siguientes variables dentro de la clase MicrophoneManager :Then add the following variables inside the MicrophoneManager class:

        public static MicrophoneManager instance; //help to access instance of this object
        private DictationRecognizer dictationRecognizer;  //Component converting speech to text
        public TextMesh dictationText; //a UI object used to debug dictation result
    
  6. Ahora es necesario agregar el código para los métodos activo () e Inicio () .Code for Awake() and Start() methods now needs to be added. Se llamará cuando se inicialice la clase:These will be called when the class initializes:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
        void Start()
        {
            if (Microphone.devices.Length > 0)
            {
                StartCapturingAudio();
                Debug.Log("Mic Detected");
            }
        }
    
  7. Ahora necesita el método que usa la aplicación para iniciar y detener la captura de voz y pasarlo a la clase LuisManager , que creará pronto.Now you need the method that the App uses to start and stop the voice capture, and pass it to the LuisManager class, that you will build soon.

        /// <summary>
        /// Start microphone capture, by providing the microphone as a continual audio source (looping),
        /// then initialise the DictationRecognizer, which will capture spoken words
        /// </summary>
        public void StartCapturingAudio()
        {
            if (dictationRecognizer == null)
            {
                dictationRecognizer = new DictationRecognizer
                {
                    InitialSilenceTimeoutSeconds = 60,
                    AutoSilenceTimeoutSeconds = 5
                };
    
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
                dictationRecognizer.DictationError += DictationRecognizer_DictationError;
            }
            dictationRecognizer.Start();
            Debug.Log("Capturing Audio...");
        }
    
        /// <summary>
        /// Stop microphone capture
        /// </summary>
        public void StopCapturingAudio()
        {
            dictationRecognizer.Stop();
            Debug.Log("Stop Capturing Audio...");
        }
    
  8. Agregue un controlador de dictado que se invocará cuando la voz se ponga en pausa.Add a Dictation Handler that will be invoked when the voice pauses. Este método pasará el texto de dictado a la clase LuisManager .This method will pass the dictation text to the LuisManager class.

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// This method will stop listening for audio, send a request to the LUIS service 
        /// and then start listening again.
        /// </summary>
        private void DictationRecognizer_DictationResult(string dictationCaptured, ConfidenceLevel confidence)
        {
            StopCapturingAudio();
            StartCoroutine(LuisManager.instance.SubmitRequestToLuis(dictationCaptured, StartCapturingAudio));
            Debug.Log("Dictation: " + dictationCaptured);
            dictationText.text = dictationCaptured;
        }
    
        private void DictationRecognizer_DictationError(string error, int hresult)
        {
            Debug.Log("Dictation exception: " + error);
        }
    

    Importante

    Elimine el método Update () , ya que esta clase no lo usará.Delete the Update() method since this class will not use it.

  9. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

    Nota

    En este punto, observará que aparece un error en el Panel de la consola del editor de Unity.At this point you will notice an error appearing in the Unity Editor Console Panel. Esto se debe a que el código hace referencia a la clase LuisManager que creará en el siguiente capítulo.This is because the code references the LuisManager class which you will create in the next Chapter.

Capítulo 6: crear la clase LUISManagerChapter 6 – Create the LUISManager class

Es el momento de crear la clase LuisManager , que realizará la llamada al servicio de Luis de Azure.It is time for you to create the LuisManager class, which will make the call to the Azure LUIS service.

El propósito de esta clase es recibir el texto de dictado de la clase MicrophoneManager y enviarlo al Language Understanding API de Azure que se va a analizar.The purpose of this class is to receive the dictation text from the MicrophoneManager class and send it to the Azure Language Understanding API to be analyzed.

Esta clase deserializará la respuesta JSON y llamará a los métodos adecuados de la clase de comportamientos para desencadenar una acción.This class will deserialize the JSON response and call the appropriate methods of the Behaviours class to trigger an action.

Para crear esta clase:To create this class:

  1. Haga doble clic en la carpeta scripts para abrirla.Double click on the Scripts folder, to open it.

  2. Haga clic con el botón derecho en la carpeta scripts y haga clic en crear > script de C#.Right-click inside the Scripts folder, click Create > C# Script. Asigne al script el nombre LuisManager.Name the script LuisManager.

  3. Haga doble clic en el script para abrirlo con Visual Studio.Double click on the script to open it with Visual Studio.

  4. Agregue los siguientes espacios de nombres al principio del archivo:Add the following namespaces to the top of the file:

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Comenzará creando tres clases dentro de la clase LuisManager (dentro del mismo archivo de script, encima del método Start () ) que representará la respuesta JSON deserializada de Azure.You will begin by creating three classes inside the LuisManager class (within the same script file, above the Start() method) that will represent the deserialized JSON response from Azure.

        [Serializable] //this class represents the LUIS response
        public class AnalysedQuery
        {
            public TopScoringIntentData topScoringIntent;
            public EntityData[] entities;
            public string query;
        }
    
        // This class contains the Intent LUIS determines 
        // to be the most likely
        [Serializable]
        public class TopScoringIntentData
        {
            public string intent;
            public float score;
        }
    
        // This class contains data for an Entity
        [Serializable]
        public class EntityData
        {
            public string entity;
            public string type;
            public int startIndex;
            public int endIndex;
            public float score;
        }
    
  6. A continuación, agregue las siguientes variables dentro de la clase LuisManager :Next, add the following variables inside the LuisManager class:

        public static LuisManager instance;
    
        //Substitute the value of luis Endpoint with your own End Point
        string luisEndpoint = "https://westus.api.cognitive... add your endpoint from the Luis Portal";
    
  7. Asegúrese de colocar el punto de conexión de LUIS en este momento (que tendrá del portal de LUIS).Make sure to place your LUIS endpoint in now (which you will have from your LUIS portal).

  8. Ahora es necesario agregar el código para el método activo () .Code for the Awake() method now needs to be added. Se llamará a este método cuando se inicialice la clase:This method will be called when the class initializes:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. Ahora necesita los métodos que esta aplicación usa para enviar el dictado recibido de la clase MicrophoneManager a Luis y, a continuación, recibir y deserializar la respuesta.Now you need the methods this application uses to send the dictation received from the MicrophoneManager class to LUIS, and then receive and deserialize the response.

  10. Una vez que se ha determinado el valor de la intención y las entidades asociadas, se pasan a la instancia de la clase de comportamientos para desencadenar la acción deseada.Once the value of the Intent, and associated Entities, have been determined, they are passed to the instance of the Behaviours class to trigger the intended action.

        /// <summary>
        /// Call LUIS to submit a dictation result.
        /// The done Action is called at the completion of the method.
        /// </summary>
        public IEnumerator SubmitRequestToLuis(string dictationResult, Action done)
        {
            string queryString = string.Concat(Uri.EscapeDataString(dictationResult));
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(luisEndpoint + queryString))
            {
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Debug.Log(unityWebRequest.error);
                }
                else
                {
                    try
                    {
                        AnalysedQuery analysedQuery = JsonUtility.FromJson<AnalysedQuery>(unityWebRequest.downloadHandler.text);
    
                        //analyse the elements of the response 
                        AnalyseResponseElements(analysedQuery);
                    }
                    catch (Exception exception)
                    {
                        Debug.Log("Luis Request Exception Message: " + exception.Message);
                    }
                }
    
                done();
                yield return null;
            }
        }
    
  11. Cree un nuevo método llamado AnalyseResponseElements () que leerá el AnalysedQuery resultante y determine las entidades.Create a new method called AnalyseResponseElements() that will read the resulting AnalysedQuery and determine the Entities. Una vez que se determinen esas entidades, se pasarán a la instancia de la clase de comportamientos que se va a usar en las acciones.Once those Entities are determined, they will be passed to the instance of the Behaviours class to use in the actions.

        private void AnalyseResponseElements(AnalysedQuery aQuery)
        {
            string topIntent = aQuery.topScoringIntent.intent;
    
            // Create a dictionary of entities associated with their type
            Dictionary<string, string> entityDic = new Dictionary<string, string>();
    
            foreach (EntityData ed in aQuery.entities)
            {
                entityDic.Add(ed.type, ed.entity);
            }
    
            // Depending on the topmost recognized intent, read the entities name
            switch (aQuery.topScoringIntent.intent)
            {
                case "ChangeObjectColor":
                    string targetForColor = null;
                    string color = null;
    
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForColor = pair.Value;
                        }
                        else if (pair.Key == "color")
                        {
                            color = pair.Value;
                        }
                    }
    
                    Behaviours.instance.ChangeTargetColor(targetForColor, color);
                    break;
    
                case "ChangeObjectSize":
                    string targetForSize = null;
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForSize = pair.Value;
                        }
                    }
    
                    if (entityDic.ContainsKey("upsize") == true)
                    {
                        Behaviours.instance.UpSizeTarget(targetForSize);
                    }
                    else if (entityDic.ContainsKey("downsize") == true)
                    {
                        Behaviours.instance.DownSizeTarget(targetForSize);
                    }
                    break;
            }
        }
    

    Importante

    Elimine los métodos Start () y Update () , ya que esta clase no los usará.Delete the Start() and Update() methods since this class will not use them.

  12. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Nota

En este punto, observará que aparecen varios errores en el Panel de la consola del editor de Unity.At this point you will notice several errors appearing in the Unity Editor Console Panel. Esto se debe a que el código hace referencia a la clase de comportamientos que creará en el siguiente capítulo.This is because the code references the Behaviours class which you will create in the next Chapter.

Capítulo 7: creación de la clase de comportamientosChapter 7 – Create the Behaviours class

La clase de comportamientos desencadenará las acciones mediante las entidades proporcionadas por la clase LuisManager .The Behaviours class will trigger the actions using the Entities provided by the LuisManager class.

Para crear esta clase:To create this class:

  1. Haga doble clic en la carpeta scripts para abrirla.Double click on the Scripts folder, to open it.

  2. Haga clic con el botón derecho en la carpeta scripts y haga clic en crear > script de C#.Right-click inside the Scripts folder, click Create > C# Script. Asigne un nombre a los comportamientos del script.Name the script Behaviours.

  3. Haga doble clic en el script para abrirlo con Visual Studio.Double click on the script to open it with Visual Studio.

  4. A continuación, agregue las siguientes variables dentro de la clase de comportamientos :Then add the following variables inside the Behaviours class:

        public static Behaviours instance;
    
        // the following variables are references to possible targets
        public GameObject sphere;
        public GameObject cylinder;
        public GameObject cube;
        internal GameObject gazedTarget;
    
  5. Agregue el código del método activo () .Add the Awake() method code. Se llamará a este método cuando se inicialice la clase:This method will be called when the class initializes:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. La clase LuisManager (que ha creado anteriormente) llama a los métodos siguientes para determinar qué objeto es el destino de la consulta y, a continuación, desencadenar la acción adecuada.The following methods are called by the LuisManager class (which you have created previously) to determine which object is the target of the query and then trigger the appropriate action.

        /// <summary>
        /// Changes the color of the target GameObject by providing the name of the object
        /// and the name of the color
        /// </summary>
        public void ChangeTargetColor(string targetName, string colorName)
        {
            GameObject foundTarget = FindTarget(targetName);
            if (foundTarget != null)
            {
                Debug.Log("Changing color " + colorName + " to target: " + foundTarget.name);
    
                switch (colorName)
                {
                    case "blue":
                        foundTarget.GetComponent<Renderer>().material.color = Color.blue;
                        break;
    
                    case "red":
                        foundTarget.GetComponent<Renderer>().material.color = Color.red;
                        break;
    
                    case "yellow":
                        foundTarget.GetComponent<Renderer>().material.color = Color.yellow;
                        break;
    
                    case "green":
                        foundTarget.GetComponent<Renderer>().material.color = Color.green;
                        break;
    
                    case "white":
                        foundTarget.GetComponent<Renderer>().material.color = Color.white;
                        break;
    
                    case "black":
                        foundTarget.GetComponent<Renderer>().material.color = Color.black;
                        break;
                }          
            }
        }
    
        /// <summary>
        /// Reduces the size of the target GameObject by providing its name
        /// </summary>
        public void DownSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale -= new Vector3(0.5F, 0.5F, 0.5F);
        }
    
        /// <summary>
        /// Increases the size of the target GameObject by providing its name
        /// </summary>
        public void UpSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale += new Vector3(0.5F, 0.5F, 0.5F);
        }
    
  7. Agregue el método FindTarget () para determinar cuál de GameObjects es el destino de la intención actual.Add the FindTarget() method to determine which of the GameObjects is the target of the current Intent. Este método usa de forma predeterminada el destino en el GameObject que se "mira" si no se define ningún destino explícito en las entidades.This method defaults the target to the GameObject being “gazed” if no explicit target is defined in the Entities.

        /// <summary>
        /// Determines which object reference is the target GameObject by providing its name
        /// </summary>
        private GameObject FindTarget(string name)
        {
            GameObject targetAsGO = null;
    
            switch (name)
            {
                case "sphere":
                    targetAsGO = sphere;
                    break;
    
                case "cylinder":
                    targetAsGO = cylinder;
                    break;
    
                case "cube":
                    targetAsGO = cube;
                    break;
    
                case "this": // as an example of target words that the user may use when looking at an object
                case "it":  // as this is the default, these are not actually needed in this example
                case "that":
                default: // if the target name is none of those above, check if the user is looking at something
                    if (gazedTarget != null) 
                    {
                        targetAsGO = gazedTarget;
                    }
                    break;
            }
            return targetAsGO;
        }
    

    Importante

    Elimine los métodos Start () y Update () , ya que esta clase no los usará.Delete the Start() and Update() methods since this class will not use them.

  8. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 8: crear la clase fijamenteChapter 8 – Create the Gaze Class

La última clase que necesitará para completar esta aplicación es la clase fijamente .The last class that you will need to complete this app is the Gaze class. Esta clase actualiza la referencia a GameObject actualmente en el foco visual del usuario.This class updates the reference to the GameObject currently in the user’s visual focus.

Para crear esta clase:To create this Class:

  1. Haga doble clic en la carpeta scripts para abrirla.Double click on the Scripts folder, to open it.

  2. Haga clic con el botón derecho en la carpeta scripts y haga clic en crear > script de C#.Right-click inside the Scripts folder, click Create > C# Script. Asigne un nombre al script.Name the script Gaze.

  3. Haga doble clic en el script para abrirlo con Visual Studio.Double click on the script to open it with Visual Studio.

  4. Inserte el código siguiente para esta clase:Insert the following code for this class:

        using UnityEngine;
    
        public class Gaze : MonoBehaviour
        {        
            internal GameObject gazedObject;
            public float gazeMaxDistance = 300;
    
            void Update()
            {
                // Uses a raycast from the Main Camera to determine which object is gazed upon.
                Vector3 fwd = gameObject.transform.TransformDirection(Vector3.forward);
                Ray ray = new Ray(Camera.main.transform.position, fwd);
                RaycastHit hit;
                Debug.DrawRay(Camera.main.transform.position, fwd);
    
                if (Physics.Raycast(ray, out hit, gazeMaxDistance) && hit.collider != null)
                {
                    if (gazedObject == null)
                    {
                        gazedObject = hit.transform.gameObject;
    
                        // Set the gazedTarget in the Behaviours class
                        Behaviours.instance.gazedTarget = gazedObject;
                    }
                }
                else
                {
                    ResetGaze();
                }         
            }
    
            // Turn the gaze off, reset the gazeObject in the Behaviours class.
            public void ResetGaze()
            {
                if (gazedObject != null)
                {
                    Behaviours.instance.gazedTarget = null;
                    gazedObject = null;
                }
            }
        }
    
  5. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 9: completar la configuración de la escenaChapter 9 – Completing the scene setup

  1. Para completar la instalación de la escena, arrastre cada script que ha creado desde la carpeta scripts hasta el objeto cámara principal del Panel jerarquía.To complete the setup of the scene, drag each script that you have created from the Scripts Folder to the Main Camera object in the Hierarchy Panel.

  2. Seleccione la cámara principal y mire en el panel del inspector, podrá ver cada script que ha adjuntado y observará que hay parámetros en cada script que todavía se deben establecer.Select the Main Camera and look at the Inspector Panel, you should be able to see each script that you have attached, and you will notice that there are parameters on each script that are yet to be set.

    Establecer los destinos de referencia de la cámara.

  3. Para establecer estos parámetros correctamente, siga estas instrucciones:To set these parameters correctly, follow these instructions:

    1. MicrophoneManager:MicrophoneManager:

      • En el Panel jerarquía, arrastre el objeto de texto dictado al cuadro valor del parámetro de texto de dictado .From the Hierarchy Panel, drag the Dictation Text object into the Dictation Text parameter value box.
    2. Comportamientos, en el Panel jerarquía:Behaviours, from the Hierarchy Panel:

      • Arrastre el objeto Sphere al cuadro destino de referencia Sphere .Drag the Sphere object into the Sphere reference target box.
      • Arrastre el cilindro al cuadro destino de referencia del cilindro .Drag the Cylinder into the Cylinder reference target box.
      • Arrastre el cubo al cuadro destino de referencia del cubo .Drag the Cube into the Cube reference target box.
    3. Mira fijamente:Gaze:

      • Establezca la distancia máxima de miración en 300 (si aún no lo está).Set the Gaze Max Distance to 300 (if it is not already).
  4. El resultado debería ser similar a la imagen siguiente:The result should look like the image below:

    Que muestra los destinos de referencia de la cámara, ahora establecido.

Capítulo 10: prueba en el editor de UnityChapter 10 – Test in the Unity Editor

Compruebe que la configuración de la escena está implementada correctamente.Test that the Scene setup is properly implemented.

Asegúrese de que:Ensure that:

  • Todos los scripts se adjuntan al objeto de cámara principal .All the scripts are attached to the Main Camera object.
  • Todos los campos del panel Inspector de cámara principal están asignados correctamente.All the fields in the Main Camera Inspector Panel are assigned properly.
  1. Presione el botón reproducir en el Editor de Unity.Press the Play button in the Unity Editor. La aplicación debe ejecutarse dentro de los auriculares inmersivo agregados.The App should be running within the attached immersive headset.

  2. Pruebe unos cuantos grabaciones, como:Try a few utterances, such as:

    make the cylinder red
    
    change the cube to yellow
    
    I want the sphere blue
    
    make this to green
    
    change it to white
    

    Nota

    Si ve un error en la consola de Unity sobre el cambio del dispositivo de audio predeterminado, es posible que la escena no funcione según lo previsto.If you see an error in the Unity console about the default audio device changing, the scene may not function as expected. Esto se debe a la forma en que el portal de realidad mixta trata los micrófonos integrados para los auriculares que los tienen.This is due to the way the mixed reality portal deals with built-in microphones for headsets that have them. Si ve este error, simplemente detenga la escena e iníciela de nuevo y las cosas deberían funcionar según lo previsto.If you see this error, simply stop the scene and start it again and things should work as expected.

Capítulo 11: compilar y transferir localmente la solución de UWPChapter 11 – Build and sideload the UWP Solution

Una vez que se ha asegurado de que la aplicación funciona en el editor de Unity, está listo para compilar e implementar.Once you have ensured that the application is working in the Unity Editor, you are ready to Build and Deploy.

Para compilar:To Build:

  1. Guarde la escena actual haciendo clic en archivo > guardar.Save the current scene by clicking on File > Save.

  2. Vaya a archivo > configuración de compilación.Go to File > Build Settings.

  3. Marque el cuadro denominado proyectos de C# de Unity (útil para ver y depurar el código una vez creado el proyecto de UWP.Tick the box called Unity C# Projects (useful for seeing and debugging your code once the UWP project is created.

  4. Haga clic en Agregar escenas abiertas y luego haga clic en compilar.Click on Add Open Scenes, then click Build.

    Ventana Configuración de compilación

  5. Se le pedirá que seleccione la carpeta en la que desea compilar la solución.You will be prompted to select the folder where you want to build the Solution.

  6. Cree una carpeta compilaciones y, dentro de esa carpeta, cree otra carpeta con un nombre adecuado de su elección.Create a BUILDS folder and within that folder create another folder with an appropriate name of your choice.

  7. Haga clic en Seleccionar carpeta para iniciar la compilación en esa ubicación.Click Select Folder to begin the build at that location.

    Crear carpeta de compilaciones Seleccionar carpeta de compilaciones Create Builds Folder Select Builds Folder

  8. Una vez que Unity termine de compilar (puede tardar algún tiempo), debe abrir una ventana del Explorador de archivos en la ubicación de la compilación.Once Unity has finished building (it might take some time), it should open a File Explorer window at the location of your build.

Para implementar en la máquina local:To Deploy on Local Machine:

  1. En Visual Studio, abra el archivo de solución que se creó en el capítulo anterior.In Visual Studio, open the solution file that has been created in the previous Chapter.

  2. En la plataforma de la solución, seleccione x86, equipo local.In the Solution Platform, select x86, Local Machine.

  3. En la configuración de soluciones , seleccione depurar.In the Solution Configuration select Debug.

    En el caso de Microsoft HoloLens, es posible que le resulte más fácil establecer esto en el equipo remoto, de modo que no esté anclado al equipo.For the Microsoft HoloLens, you may find it easier to set this to Remote Machine, so that you are not tethered to your computer. Sin embargo, también tendrá que hacer lo siguiente:Though, you will need to also do the following:

    • Conozca la dirección IP de HoloLens, que puede encontrarse en la configuración > red & Internet > Wi-Fi > opciones avanzadas. IPv4 es la dirección que debe usar.Know the IP Address of your HoloLens, which can be found within the Settings > Network & Internet > Wi-Fi > Advanced Options; the IPv4 is the address you should use.
    • Asegurarse de que el modo de desarrollador está activado; se encuentra en configuración > actualizar & > de seguridad para desarrolladores.Ensure Developer Mode is On; found in Settings > Update & Security > For developers.

    Implementación de una aplicación

  4. Vaya al menú compilar y haga clic en implementar solución para transferir localmente la aplicación a la máquina.Go to the Build menu and click on Deploy Solution to sideload the application to your machine.

  5. La aplicación debe aparecer ahora en la lista de aplicaciones instaladas, lista para su lanzamiento.Your App should now appear in the list of installed apps, ready to be launched!

  6. Una vez iniciado, la aplicación le pedirá que autorice el acceso al micrófono.Once launched, the App will prompt you to authorize access to the Microphone. Use los controladores de movimiento, la entrada de voz o el teclado para presionar el botón .Use the Motion Controllers, or Voice Input, or the Keyboard to press the YES button.

Capítulo 12: mejorar el servicio de LUISChapter 12 – Improving your LUIS service

Importante

Este capítulo es increíblemente importante, por lo que es posible que tenga que repetirse varias veces, ya que le ayudará a mejorar la precisión del servicio LUIS: Asegúrese de que lo completa.This chapter is incredibly important, and may need to be iterated upon several times, as it will help improve the accuracy of your LUIS service: ensure you complete this.

Para mejorar el nivel de comprensión proporcionado por LUIS, debe capturar nuevos grabaciones y usarlos para volver a entrenar su aplicación de LUIS.To improve the level of understanding provided by LUIS you need to capture new utterances and use them to re-train your LUIS App.

Por ejemplo, es posible que haya entrenado a LUIS para comprender "aumento" y "tamaño", pero no desea que la aplicación también entienda palabras como "agrandar"?For example, you might have trained LUIS to understand “Increase” and “Upsize”, but wouldn’t you want your app to also understand words like “Enlarge”?

Una vez que haya usado la aplicación varias veces, se recopilará todo lo que haya dicho en LUIS y estará disponible en el PORTAL de LUIS.Once you have used your application a few times, everything you have said will be collected by LUIS and available in the LUIS PORTAL.

  1. Vaya a la aplicación de portal que sigue a este vínculoe inicie sesión.Go to your portal application following this LINK, and Log In.

  2. Una vez que haya iniciado sesión con sus credenciales de MS, haga clic en el nombre de la aplicación.Once you are logged in with your MS Credentials, click on your App name.

  3. Haga clic en el botón revisar extremo grabaciones situado a la izquierda de la página.Click the Review endpoint utterances button on the left of the page.

    Revisar grabaciones

  4. Se le mostrará una lista de los grabaciones enviados a LUIS por la aplicación de realidad mixta.You will be shown a list of the Utterances that have been sent to LUIS by your mixed reality Application.

    Lista de grabaciones

Observará algunas entidades resaltadas.You will notice some highlighted Entities.

Al mantener el mouse sobre cada palabra resaltada, puede revisar cada utterance y determinar qué entidad se reconoció correctamente, qué entidades son erróneas y qué entidades se han perdido.By hovering over each highlighted word, you can review each Utterance and determine which Entity has been recognized correctly, which Entities are wrong and which Entities are missed.

En el ejemplo anterior, se encontró que la palabra "Spear" se resaltó como destino, por lo que era necesario corregir el error, lo que se realiza al mantener el mouse sobre la palabra con el mouse y hacer clic en quitar etiqueta.In the example above, it was found that the word “spear” had been highlighted as a target, so it necessary to correct the mistake, which is done by hovering over the word with the mouse and clicking Remove Label.

Comprobar grabaciones  quitar etiqueta de imagenCheck utterances Remove Label Image

  1. Si encuentra grabaciones que son completamente incorrectas, puede eliminarlos mediante el botón eliminar situado en el lado derecho de la pantalla.If you find Utterances that are completely wrong, you can delete them using the Delete button on the right side of the screen.

    Eliminar grabaciones erróneo

  2. O bien, si cree que LUIS ha interpretado el utterance correctamente, puede validar su comprensión mediante el botón Agregar a intento alineado .Or if you feel that LUIS has interpreted the Utterance correctly, you can validate its understanding by using the Add To Aligned Intent button.

    Agregar a intención alineada

  3. Una vez que haya ordenado todo el grabaciones que se muestra, intente volver a cargar la página para ver si hay más disponibles.Once you have sorted all the displayed Utterances, try and reload the page to see if more are available.

  4. Es muy importante repetir este proceso tantas veces como sea posible para mejorar la comprensión de la aplicación.It is very important to repeat this process as many times as possible to improve your application understanding.

¡Que te diviertas!Have fun!

Su aplicación integrada de LUIS finalizadaYour finished LUIS Integrated application

Enhorabuena, ha creado una aplicación de realidad mixta que aprovecha el servicio de inteligencia de Language Understanding de Azure para comprender lo que un usuario dice y actuar sobre esa información.Congratulations, you built a mixed reality app that leverages the Azure Language Understanding Intelligence Service, to understand what a user says, and act on that information.

Resultado de laboratorio

Ejercicios extraBonus exercises

Ejercicio 1Exercise 1

Al usar esta aplicación, es posible que observe que si mira el objeto Floor y pide cambiar su color, lo hará.While using this application you might notice that if you gaze at the Floor object and ask to change its color, it will do so. ¿Puede averiguar cómo evitar que la aplicación cambie el color del piso?Can you work out how to stop your application from changing the Floor color?

Ejercicio 2Exercise 2

Intente ampliar las funcionalidades de LUIS y App, agregando funcionalidad adicional a los objetos de la escena. por ejemplo, cree nuevos objetos en el punto de Miración de la mirada, en función de lo que indique el usuario y, a continuación, podrá usar esos objetos junto con los objetos de la escena actual con los comandos existentes.Try extending the LUIS and App capabilities, adding additional functionality for objects in scene; as an example, create new objects at the Gaze hit point, depending on what the user says, and then be able to use those objects alongside current scene objects, with the existing commands.