HoloLens (1ª generación) y Azure 301: traducción de idioma


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. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles. Habrá una nueva serie de tutoriales que se publicarán en el futuro que demostrarán cómo desarrollar para HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.


En este curso, aprenderá a agregar funcionalidades de traducción a una aplicación de realidad mixta mediante Azure Cognitive Services, con Translator Text API.

Producto final

Translator Text API es un servicio de traducción que funciona casi en tiempo real. El servicio se basa en la nube y, mediante una llamada API rest, una aplicación puede usar la tecnología de traducción automática neuronal para traducir texto a otro idioma. Para más información, visite la página de Azure Translator Text API.

Al finalizar este curso, tendrá una aplicación de realidad mixta que podrá hacer lo siguiente:

  1. El usuario hablará en un micrófono conectado a un casco envolvente (VR) (o al micrófono integrado de HoloLens).
  2. La aplicación capturará el dictado y lo enviará a Azure Translator Text API.
  3. El resultado de la traducción se mostrará en un grupo de interfaz de usuario simple en la escena de Unity.

Este curso le enseñará a obtener los resultados del servicio Translator en una aplicación de ejemplo basada en Unity. Dependerá de usted aplicar estos conceptos a una aplicación personalizada que podría compilar.

Compatibilidad con dispositivos

Curso HoloLens Cascos envolventes
Realidad mixta y Azure (301): Traducción de idiomas ✔️ ✔️

Nota

Aunque este curso se centra principalmente en Windows Mixed Reality cascos envolventes (VR), también puede aplicar lo que aprende en este curso para Microsoft HoloLens. A medida que sigas con el curso, verás notas sobre los cambios que puedas necesitar para admitir HoloLens. Al usar HoloLens, es posible que observe algún eco durante la captura de voz.

Requisitos previos

Nota:

Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Unity y 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 (mayo de 2018). Puede usar el software más reciente, como se muestra en el artículo sobre la instalación de las herramientas , aunque no debe asumirse que la información de este curso coincidirá perfectamente con lo que encontrará en el software más reciente que lo que se muestra a continuación.

Se recomienda el siguiente hardware y software para este curso:

Antes de empezar

  • Para evitar encontrar problemas al compilar este proyecto, se recomienda encarecidamente crear el proyecto mencionado en este tutorial en una carpeta raíz o casi raíz (las rutas de acceso de carpetas largas pueden causar problemas en tiempo de compilación).

  • El código de este tutorial le permitirá grabar desde el dispositivo de micrófono predeterminado conectado a su PC. Asegúrese de que el dispositivo de micrófono predeterminado está establecido en el dispositivo que planea usar para capturar la voz.

  • Para permitir que el equipo habilite el dictado, vaya a Configuración > Voz de privacidad > , escriba & entrada manuscrita y seleccione el botón Activar servicios de voz y escribir sugerencias.

  • Si usa un micrófono y auriculares conectados a (o integrados) a los auriculares, asegúrese de que la opción "Cuando uso mis auriculares, cambie al micrófono de auriculares" esté activada en Configuración > Audio y voz de realidad > mixta.

    Configuración de realidad mixta

    Configuración del micrófono

Advertencia

Tenga en cuenta que si está desarrollando para un casco envolvente para este laboratorio, puede experimentar problemas con los dispositivos de salida de audio. Esto se debe a un problema con Unity, que se ha corregido en versiones posteriores de Unity (Unity 2018.2). El problema impide que Unity cambie el dispositivo de salida de audio predeterminado en tiempo de ejecución. Como solución alternativa, asegúrese de que ha completado los pasos anteriores y cierre y vuelva a abrir el Editor, cuando este problema se presente.

Capítulo 1: Azure Portal

Para usar Azure Translator API, deberá configurar una instancia del servicio para que esté disponible para la aplicación.

  1. Inicie sesión en Azure Portal.

    Nota

    Si aún no tiene una cuenta de Azure, deberá crear una. Si sigue este tutorial en una situación de clase o laboratorio, pida a su instructor o a uno de los proctores que le ayuden a configurar la nueva cuenta.

  2. Una vez que haya iniciado sesión, haga clic en Nuevo en la esquina superior izquierda y busque "Translator Text API". Seleccione Entrar.

    Nuevo recurso

    Nota

    Es posible que la palabra New se haya reemplazado por Create a resource (Crear un recurso) en portales más recientes.

  3. La nueva página proporcionará una descripción del servicio Translator Text API . En la parte inferior izquierda de esta página, seleccione el botón Crear para crear una asociación con este servicio.

    Creación del servicio Translator Text API

  4. Una vez que haya hecho clic en Crear:

    1. Inserte el nombre deseado para esta instancia de servicio.

    2. Seleccione una suscripción adecuada.

    3. Seleccione el plan de tarifa adecuado para usted, si es la primera vez que crea un servicio Translator Text, debe estar disponible un nivel gratuito (denominado F0).

    4. Elija un grupo de recursos o cree uno nuevo. 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. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos laboratorios) en un grupo de recursos común).

      Si desea obtener más información sobre los grupos de recursos de Azure, visite el artículo sobre el grupo de recursos.

    5. Determine la ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos). La ubicación ideal sería en la región donde se ejecutaría la aplicación. Algunos recursos de Azure solo están disponibles en determinadas regiones.

    6. También deberá confirmar que ha comprendido los Términos y Condiciones aplicados a este Servicio.

    7. Seleccione Crear.

      Seleccione el botón Crear.

  5. Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.

  6. Una notificación aparecerá en el portal una vez creada la instancia de servicio.

    Notificación de creación de servicios de Azure

  7. Haga clic en la notificación para explorar la nueva instancia de servicio.

    Vaya al elemento emergente de recursos.

  8. Haga clic en el botón Ir al recurso en la notificación para explorar la nueva instancia de servicio. Se le llevará a la nueva instancia del servicio Translator Text API.

    Página del servicio Translator Text API

  9. En este tutorial, la aplicación tendrá que realizar llamadas al servicio, que se realiza mediante el uso de la clave de suscripción del servicio.

  10. En la página Inicio rápido del servicio Translator Text , vaya al primer paso, Grabe las claves y haga clic en Claves (también puede hacerlo haciendo clic en el hipervínculo azul Claves, ubicado en el menú de navegación Servicios, indicado por el icono de clave). Esto revelará las claves de servicio.

  11. Realice una copia de una de las claves mostradas, ya que lo necesitará más adelante en el proyecto.

Capítulo 2: Configuración del proyecto de Unity

Configure y pruebe los cascos envolventes de realidad mixta.

Nota

No necesitará controladores de movimiento para este curso. Si necesita soporte técnico para configurar un casco envolvente, siga estos pasos.

A continuación se muestra una configuración típica para desarrollar con realidad mixta y, como tal, es una buena plantilla para otros proyectos:

  1. Abra Unity y haga clic en Nuevo.

    Inicie el nuevo proyecto de Unity.

  2. Ahora tendrá que proporcionar un nombre de proyecto de Unity. Inserte MR_Translation. Asegúrese de que el tipo de proyecto está establecido en 3D. Establezca la ubicación en un lugar adecuado para usted (recuerde, más cerca de los directorios raíz es mejor). A continuación, haga clic en Crear proyecto.

    Proporcione detalles para el nuevo proyecto de Unity.

  3. Con Unity abierto, vale la pena comprobar que el Editor de scripts predeterminado está establecido en Visual Studio. Vaya a Editar > preferencias y, a continuación, en la nueva ventana, vaya a Herramientas externas. Cambie el Editor de scripts externos a Visual Studio 2017. Cierre la ventana Preferencias.

    Actualice la preferencia del editor de scripts.

  4. A continuación, vaya a Configuración de > compilación de archivos y cambie la plataforma a Plataforma universal de Windows, haciendo clic en el botón Cambiar plataforma.

    Ventana Configuración de compilación, cambie la plataforma a UWP.

  5. Vaya a Configuración de compilación de archivos > y asegúrese de que:

    1. El dispositivo de destino se establece en Cualquier dispositivo.

      Para Microsoft HoloLens, establezca Dispositivo de destino en HoloLens.

    2. El tipo de compilación se establece en D3D.

    3. El SDK se establece en Latest installed (Más reciente instalado)

    4. La versión de Visual Studio se establece en Latest installed (Versión más reciente instalada)

    5. Build and Run (Compilación y ejecución ) está establecido en Local Machine (Máquina local).

    6. Guarde la escena y agréguela a la compilación.

      1. Para ello, seleccione Agregar escenas abiertas. Aparecerá una ventana de guardado.

        Haga clic en el botón Agregar escenas abiertas.

      2. Cree una nueva carpeta para esto y cualquier escena futura y, a continuación, seleccione el botón Nueva carpeta para crear una nueva carpeta, asígnela el nombre Escenas.

        Creación de una carpeta de scripts

      3. Abra la carpeta Escenas recién creada y, a continuación, en el campo Nombre de archivo: texto, escriba MR_TranslationScene y presione Guardar.

        Asigne un nombre a la nueva escena.

        Tenga en cuenta que debe guardar las escenas de Unity en la carpeta Assets , ya que deben estar asociadas al proyecto de Unity. La creación de la carpeta de escenas (y otras carpetas similares) es una forma típica de estructurar un proyecto de Unity.

    7. La configuración restante, en Configuración de compilación, debe dejarse como predeterminada por ahora.

  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 .

    Abra la configuración del reproductor.

  7. En este panel, es necesario comprobar algunas opciones de configuración:

    1. En la pestaña Otras configuraciones :

      1. La versión del entorno de ejecución de scripting debe ser estable (equivalente a .NET 3.5).

      2. El back-end de scripting debe ser .NET

      3. El nivel de compatibilidad de API debe ser .NET 4.6

        Actualice otras opciones de configuración.

    2. En la pestaña Configuración de publicación, en Funcionalidades, active:

      1. InternetClient

      2. Micrófono

        Actualización de la configuración de publicación.

    3. Más abajo en el panel, en Configuración de XR (que se encuentra a continuación de Configuración de publicación), marque Virtual Reality Supported (Compatible con Realidad virtual), asegúrese de que se agrega el SDK de Windows Mixed Reality.

      Actualice la configuración de X R.

  8. De nuevo en Configuración de compilación, los proyectos de C# de Unity ya no están atenuados; marque la casilla situada junto a esto.

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

  10. Guarde la escena y el proyecto (ARCHIVO > SAVE SCENE /FILE > SAVE PROJECT).

Capítulo 3: Configuración de la cámara principal

Importante

Si desea omitir el componente Set up de Unity de este curso y continuar directamente en el código, no dude en descargar este paquete .unitypackage, importarlo en el proyecto como paquete personalizado y continuar desde el capítulo 5. Todavía tendrá que crear un proyecto de Unity.

  1. En el Panel de jerarquía, encontrará un objeto denominado Cámara principal, este objeto representa el punto de vista "head" una vez que esté "dentro" de la aplicación.

  2. Con el panel de Unity delante de usted, seleccione el GameObject cámara principal. Observará que el Panel inspector (que se encuentra a la derecha, dentro del Panel) mostrará los distintos componentes de ese GameObject, con Transformar en la parte superior, seguido de Cámara y otros componentes. Tendrá que restablecer la transformación de la cámara principal, por lo que se coloca correctamente.

  3. Para ello, seleccione el icono engranaje situado junto al componente Transformar de la cámara y seleccione Restablecer.

    Restablezca la transformación Cámara principal.

  4. A continuación, el componente Transform debe tener el siguiente aspecto:

    1. La posición se establece en 0, 0, 0

    2. La rotación se establece en 0, 0, 0

    3. Y Scale está establecido en 1, 1, 1

      Transformación de la información de la cámara

  5. A continuación, con el objeto Cámara principal seleccionado, vea el botón Agregar componente situado en la parte inferior del Panel inspector.

  6. Seleccione ese botón y busque (escribiendo Origen de audio en el campo de búsqueda o navegando por las secciones) para el componente denominado Origen de audio , como se muestra a continuación y selecciónelo (presionando Entrar en él también funciona).

  7. Se agregará un componente de origen de audio a la cámara principal, como se muestra a continuación.

    Agregue un componente de origen de audio.

    Nota

    Para Microsoft HoloLens, también tendrá que cambiar lo siguiente, que forman parte del componente Cámara en la cámara principal:

    • Borrar marcas: Color sólido.
    • Fondo 'Negro, Alfa 0' – Color hexadecimal: #000000000.

Capítulo 4: Configurar lienzo de depuración

Para mostrar la entrada y salida de la traducción, debe crearse una interfaz de usuario básica. En este curso, creará un objeto de interfaz de usuario de Canvas, con varios objetos "Text" para mostrar los datos.

  1. Haga clic con el botón derecho en un área vacía del Panel de jerarquía, en INTERFAZ de usuario, agregue un lienzo.

    Agregue un nuevo objeto de interfaz de usuario de Canvas.

  2. Con el objeto Canvas seleccionado, en el Panel inspector (dentro del componente "Canvas", cambie El modo de representación a Espacio mundial).

  3. A continuación, cambie los parámetros siguientes en la transformación rect del Panel de inspectores:

    1. POS - X 0 Y 0 Z 40

    2. Ancho : 500

    3. Alto : 300

    4. Escala - X 0.13 Y 0.13 Z 0.13

      Actualice la transformación de rect para el lienzo.

  4. Haga clic con el botón derecho en el lienzo en el panel jerarquía, en la interfaz de usuario y agregue un panel. Este Panel proporcionará un fondo al texto que se mostrará en la escena.

  5. Haga clic con el botón derecho en el Panelde jerarquía, en la interfaz de usuario y agregue un objeto Text. Repita el mismo proceso hasta que haya creado cuatro objetos Text de la interfaz de usuario en total (Sugerencia: si tiene seleccionado el primer objeto "Text", simplemente puede presionar "Ctrl" + "D", para duplicarlo, hasta que tenga cuatro en total).

  6. Para cada objeto text, selecciónelo y use las tablas siguientes para establecer los parámetros en el Panel inspector.

    1. Para el componente Rect Transform (Rect Transform ):

      Nombre Transformación: posición Ancho Alto
      MicrophoneStatusLabel X -80 Y 90 Z 0 300 30
      AzureResponseLabel X -80 Y 30 Z 0 300 30
      DictadoLabel X -80 Y -30 Z 0 300 30
      TranslationResultLabel X -80 Y -90 Z 0 300 30
    2. Para el componente Texto (script):

      Nombre Texto Tamaño de fuente
      MicrophoneStatusLabel Estado del micrófono: 20
      AzureResponseLabel Respuesta web de Azure 20
      DictadoLabel Acabas de decir: 20
      TranslationResultLabel Conversión: 20

      Escriba los valores correspondientes para las etiquetas de la interfaz de usuario.

    3. Además, haga que el estilo de fuente negrita. Esto facilitará la lectura del texto.

      Fuente en negrita.

  7. Para cada objeto text de interfaz de usuario creado en el capítulo 5, cree un nuevo objeto text de interfaz de usuario secundario. Estos elementos secundarios mostrarán la salida de la aplicación. Cree objetos secundarios haciendo clic con el botón derecho en el elemento primario previsto (por ejemplo , MicrophoneStatusLabel) y, a continuación, seleccione UI y, a continuación, seleccione Texto.

  8. Para cada uno de estos elementos secundarios, selecciónelo y use las tablas siguientes para establecer los parámetros en el Panel de inspectores.

    1. Para el componente Rect Transform (Rect Transform ):

      Nombre Transformación: posición Ancho Alto
      MicrophoneStatusText X 0 Y -30 Z 0 300 30
      AzureResponseText X 0 Y -30 Z 0 300 30
      DictadoText X 0 Y -30 Z 0 300 30
      TranslationResultText X 0 Y -30 Z 0 300 30
    2. Para el componente Texto (script):

      Nombre Texto Tamaño de fuente
      MicrophoneStatusText ?? 20
      AzureResponseText ?? 20
      DictadoText ?? 20
      TranslationResultText ?? 20
  9. A continuación, seleccione la opción de alineación "central" para cada componente de texto:

    alinear texto.

  10. Para asegurarse de que los objetos Text de la interfaz de usuario secundarios son fácilmente legibles, cambie su Color. Para ello, haga clic en la barra (actualmente "Negro") junto a Color.

    Escriba los valores correspondientes para las salidas de texto de la interfaz de usuario.

  11. A continuación, en la nueva ventana, pequeño, Color , cambie el Color hexadecimal a: 0032EAFF

    Actualice el color al azul.

  12. A continuación se muestra el aspecto de la interfaz de usuario .

    1. En el Panel de jerarquía:

      Tener jerarquía en la estructura proporcionada.

    2. En las vistas de escena y juego:

      Tener las vistas de escena y juego en la misma estructura.

Capítulo 5: Crear la clase Results

El primer script que necesita crear es la clase Results , que es responsable de proporcionar una manera de ver los resultados de la traducción. La clase almacena y muestra lo siguiente:

  • Resultado de la respuesta de Azure.
  • Estado del micrófono.
  • Resultado del dictado (voz a texto).
  • Resultado de la traducción.

Para crear esta clase:

  1. Haga clic con el botón derecho en el Panel del proyecto y, a continuación, en Crear > carpeta. Asigne un nombre a la carpeta Scripts.

    Cree la carpeta scripts.

    Abra la carpeta scripts.

  2. Con la carpeta Scripts creada, haga doble clic en ella para abrirla. A continuación, dentro de esa carpeta, haga clic con el botón derecho y seleccione Crear > y, después , Script de C#. Asigne al script el nombre Results.

    Cree el primer script.

  3. Haga doble clic en el nuevo script Resultados para abrirlo con Visual Studio.

  4. Inserte los siguientes espacios de nombres:

        using UnityEngine;
        using UnityEngine.UI;
    
  5. Dentro de la clase, inserte las siguientes variables:

        public static Results instance;
    
        [HideInInspector] 
        public string azureResponseCode;
    
        [HideInInspector] 
        public string translationResult;
    
        [HideInInspector] 
        public string dictationResult;
    
        [HideInInspector] 
        public string micStatus;
    
        public Text microphoneStatusText;
    
        public Text azureResponseText;
    
        public Text dictationText;
    
        public Text translationResultText;
    
  6. A continuación, agregue el método Awake(), al que se llamará cuando se inicialice la clase.

        private void Awake() 
        { 
            // Set this class to behave similar to singleton 
            instance = this;           
        } 
    
  7. Por último, agregue los métodos responsables de generar la información de los distintos resultados en la interfaz de usuario.

        /// <summary>
        /// Stores the Azure response value in the static instance of Result class.
        /// </summary>
        public void SetAzureResponse(string result)
        {
            azureResponseCode = result;
            azureResponseText.text = azureResponseCode;
        }
    
        /// <summary>
        /// Stores the translated result from dictation in the static instance of Result class. 
        /// </summary>
        public void SetDictationResult(string result)
        {
            dictationResult = result;
            dictationText.text = dictationResult;
        }
    
        /// <summary>
        /// Stores the translated result from Azure Service in the static instance of Result class. 
        /// </summary>
        public void SetTranslatedResult(string result)
        {
            translationResult = result;
            translationResultText.text = translationResult;
        }
    
        /// <summary>
        /// Stores the status of the Microphone in the static instance of Result class. 
        /// </summary>
        public void SetMicrophoneStatus(string result)
        {
            micStatus = result;
            microphoneStatusText.text = micStatus;
        }
    
  8. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.

Capítulo 6: Creación de la clase MicrophoneManager

La segunda clase que va a crear es el MicrophoneManager.

Esta clase es responsable de:

  • Detectar el dispositivo de grabación conectado al casco o la máquina (lo que sea el valor predeterminado).
  • Capture el audio (voz) y use el dictado para almacenarlo como una cadena.
  • Una vez que la voz se haya pausado, envíe el dictado a la clase Translator.
  • Hospede un método que pueda detener la captura de voz si lo desea.

Para crear esta clase:

  1. Haga doble clic en la carpeta Scripts para abrirla.

  2. Haga clic con el botón derecho en la carpeta Scripts y haga clic en Crear > script de C#. Asigne al script el nombre MicrophoneManager.

  3. Haga doble clic en el nuevo script para abrirlo con Visual Studio.

  4. Actualice los espacios de nombres para que sean los mismos que los siguientes, en la parte superior de la clase MicrophoneManager :

        using UnityEngine; 
        using UnityEngine.Windows.Speech;
    
  5. A continuación, agregue las siguientes variables dentro de la clase MicrophoneManager :

        // Help to access instance of this object 
        public static MicrophoneManager instance; 
    
        // AudioSource component, provides access to mic 
        private AudioSource audioSource; 
    
        // Flag indicating mic detection 
        private bool microphoneDetected; 
    
        // Component converting speech to text 
        private DictationRecognizer dictationRecognizer; 
    
  6. Ahora es necesario agregar código para los métodos Awake() y Start(). Se llamará cuando se inicialice la clase:

        private void Awake() 
        { 
            // Set this class to behave similar to singleton 
            instance = this; 
        } 
    
        void Start() 
        { 
            //Use Unity Microphone class to detect devices and setup AudioSource 
            if(Microphone.devices.Length > 0) 
            { 
                Results.instance.SetMicrophoneStatus("Initialising..."); 
                audioSource = GetComponent<AudioSource>(); 
                microphoneDetected = true; 
            } 
            else 
            { 
                Results.instance.SetMicrophoneStatus("No Microphone detected"); 
            } 
        } 
    
  7. Puede eliminar el método Update(), ya que esta clase no la usará.

  8. Ahora necesita los métodos que usa la aplicación para iniciar y detener la captura de voz y pasarlo a la clase Translator , que compilará pronto. Copie el código siguiente y péguelo debajo del método Start().

        /// <summary> 
        /// Start microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StartCapturingAudio() 
        { 
            if(microphoneDetected) 
            {               
                // Start dictation 
                dictationRecognizer = new DictationRecognizer(); 
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; 
                dictationRecognizer.Start(); 
    
                // Update UI with mic status 
                Results.instance.SetMicrophoneStatus("Capturing..."); 
            }      
        } 
    
        /// <summary> 
        /// Stop microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StopCapturingAudio() 
        { 
            Results.instance.SetMicrophoneStatus("Mic sleeping"); 
            Microphone.End(null); 
            dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; 
            dictationRecognizer.Dispose(); 
        }
    

    Sugerencia

    Aunque esta aplicación no lo usará, el método StopCapturingAudio() también se ha proporcionado aquí, si desea implementar la capacidad de detener la captura de audio en la aplicación.

  9. Ahora debe agregar un controlador de dictado que se invocará cuando se detenga la voz. A continuación, este método pasará el texto dictado a la clase Translator .

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// Debugging message is delivered to the Results class.
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Results.instance.SetDictationResult(text);
    
            // Start the coroutine that process the dictation through Azure 
            StartCoroutine(Translator.instance.TranslateWithUnityNetworking(text));   
        }
    
  10. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.

Advertencia

En este momento observará un error que aparece en el Panel de consola del Editor de Unity ("El nombre "Translator" no existe..."). Esto se debe a que el código hace referencia a la clase Translator , que creará en el siguiente capítulo.

Capítulo 7: Llamada al servicio azure y traductor

El último script que necesita crear es la clase Translator .

Esta clase es responsable de:

  • Autenticación de la aplicación con Azure, a cambio de un token de autenticación.
  • Use el token de autenticación para enviar texto (recibido de la clase MicrophoneManager ) que se va a traducir.
  • Reciba el resultado traducido y páselo a la clase Results que se va a visualizar en la interfaz de usuario.

Para crear esta clase:

  1. Vaya a la carpeta Scripts que creó anteriormente.

  2. Haga clic con el botón derecho en el Panel del proyecto, Crear > script de C#. Llame al script Translator.

  3. Haga doble clic en el nuevo script de Translator para abrirlo con Visual Studio.

  4. Agregue los siguientes espacios de nombres a la parte superior del archivo:

        using System;
        using System.Collections;
        using System.Xml.Linq;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. A continuación, agregue las siguientes variables dentro de la clase Translator :

        public static Translator instance; 
        private string translationTokenEndpoint = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; 
        private string translationTextEndpoint = "https://api.microsofttranslator.com/v2/http.svc/Translate?"; 
        private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key"; 
    
        //Substitute the value of authorizationKey with your own Key 
        private const string authorizationKey = "-InsertYourAuthKeyHere-"; 
        private string authorizationToken; 
    
        // languages set below are: 
        // English 
        // French 
        // Italian 
        // Japanese 
        // Korean 
        public enum Languages { en, fr, it, ja, ko }; 
        public Languages from = Languages.en; 
        public Languages to = Languages.it; 
    

    Nota

    • Los idiomas insertados en la enumeración de idiomas son solo ejemplos. No dude en agregar más si lo desea; la API admite más de 60 idiomas (incluido Klingon).
    • Hay una página más interactiva que cubre los idiomas disponibles, aunque tenga en cuenta que la página solo parece funcionar cuando el idioma del sitio está establecido en "" (y es probable que el sitio de Microsoft redirija al idioma nativo). Puede cambiar el idioma del sitio en la parte inferior de la página o modificando la dirección URL.
    • El valor authorizationKey , en el fragmento de código anterior, debe ser la clave que recibió al suscribirse a Azure Translator Text API. Esto se trata en el capítulo 1.
  6. Ahora es necesario agregar código para los métodos Awake() y Start().

  7. En este caso, el código realizará una llamada a Azure mediante la clave de autorización para obtener un token.

        private void Awake() 
        { 
            // Set this class to behave similar to singleton  
            instance = this; 
        } 
    
        // Use this for initialization  
        void Start() 
        { 
            // When the application starts, request an auth token 
            StartCoroutine("GetTokenCoroutine", authorizationKey); 
        }
    

    Nota

    El token expirará después de 10 minutos. En función del escenario de la aplicación, es posible que tengas que realizar la misma llamada de corrutina varias veces.

  8. La corrutina para obtener el token es la siguiente:

        /// <summary> 
        /// Request a Token from Azure Translation Service by providing the access key. 
        /// Debugging result is delivered to the Results class. 
        /// </summary> 
        private IEnumerator GetTokenCoroutine(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new InvalidOperationException("Authorization key not set.");
            }
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(translationTokenEndpoint, string.Empty))
            {
                unityWebRequest.SetRequestHeader("Ocp-Apim-Subscription-Key", key);
                yield return unityWebRequest.SendWebRequest();
    
                long responseCode = unityWebRequest.responseCode;
    
                // Update the UI with the response code 
                Results.instance.SetAzureResponse(responseCode.ToString());
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Results.instance.azureResponseText.text = unityWebRequest.error;
                    yield return null;
                }
                else
                {
                    authorizationToken = unityWebRequest.downloadHandler.text;
                }
            }
    
            // After receiving the token, begin capturing Audio with the MicrophoneManager Class 
            MicrophoneManager.instance.StartCapturingAudio();
        }
    

    Advertencia

    Si edita el nombre del método IEnumerator GetTokenCoroutine(), debe actualizar los valores de cadena de llamada StartCoroutine y StopCoroutine en el código anterior. Según la documentación de Unity, para detener una corrutina específica, debe usar el método de valor de cadena.

  9. A continuación, agregue la corrutina (con un método de secuencia "support" justo debajo) para obtener la traducción del texto recibido por la clase MicrophoneManager . Este código crea una cadena de consulta para enviarla a Azure Translator Text API y, a continuación, usa la clase Unity UnityWebRequest interna para realizar una llamada "Get" al punto de conexión con la cadena de consulta. A continuación, el resultado se usa para establecer la traducción en el objeto Results. El código siguiente muestra la implementación:

        /// <summary> 
        /// Request a translation from Azure Translation Service by providing a string.  
        /// Debugging result is delivered to the Results class. 
        /// </summary> 
        public IEnumerator TranslateWithUnityNetworking(string text)
        {
            // This query string will contain the parameters for the translation 
            string queryString = string.Concat("text=", Uri.EscapeDataString(text), "&from=", from, "&to=", to);
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(translationTextEndpoint + queryString))
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + authorizationToken);
                unityWebRequest.SetRequestHeader("Accept", "application/xml");
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Debug.Log(unityWebRequest.error);
                    yield return null;
                }
    
                // Parse out the response text from the returned Xml
                string result = XElement.Parse(unityWebRequest.downloadHandler.text).Value;
                Results.instance.SetTranslatedResult(result);
            }
        }
    
  10. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.

Capítulo 8: Configurar la escena de Unity

  1. De nuevo en el Editor de Unity, haga clic y arrastre la clase Resultsde la carpeta Scripts al objeto Cámara principal en el Panel de jerarquía.

  2. Haga clic en la Cámara principal y examine el Panel inspector. Observará que en el componente script recién agregado hay cuatro campos con valores vacíos. Estas son las referencias de salida a las propiedades del código.

  3. Arrastre los objetos Text adecuados desde el Panel de jerarquía a esas cuatro ranuras, como se muestra en la imagen siguiente.

    Actualice las referencias de destino con valores especificados.

  4. A continuación, haga clic y arrastre la clase Translator desde la carpeta Scripts al objeto Cámara principal en el Panel de jerarquía.

  5. A continuación, haga clic y arrastre la clase MicrophoneManager desde la carpeta Scripts al objeto Cámara principal en el Panel de jerarquía.

  6. Por último, haga clic en la Cámara principal y examine el Panel inspector. Observará que en el script que arrastró, hay dos cuadros desplegables que le permitirán establecer los idiomas.

    Asegúrese de que los idiomas de traducción previstos sean de entrada.

Capítulo 9: Prueba en realidad mixta

En este momento, debe probar que la escena se ha implementado correctamente.

Asegúrese de que:

  • Todas las configuraciones mencionadas en el capítulo 1 se establecen correctamente.
  • Los scripts Results, Translator y MicrophoneManager se adjuntan al objeto Cámara principal .
  • Ha colocado la clave de servicio de Azure Translator Text API dentro de la variable authorizationKey en Translator Script.
  • Todos los campos del Panel del Inspector de cámara principal se asignan correctamente.
  • El micrófono funciona al ejecutar la escena (si no es así, compruebe que el micrófono conectado es el dispositivo predeterminado y que lo ha configurado correctamente en Windows).

Para probar el casco envolvente, presione el botón Reproducir en el Editor de Unity. La aplicación debe funcionar a través de los auriculares envolventes conectados.

Advertencia

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. Esto se debe a la forma en que el portal de realidad mixta se ocupa de micrófonos integrados para auriculares que los tienen. Si ve este error, basta con detener la escena e iniciarla de nuevo y las cosas deberían funcionar según lo previsto.

Capítulo 10: Compilar la solución para UWP y transferir localmente en la máquina local

Todo lo necesario para la sección unity de este proyecto ya se ha completado, por lo que es el momento de compilarlo desde Unity.

  1. Vaya a Configuración de compilación: Configuración de compilación de archivos > ...

  2. En la ventana Configuración de compilación, haga clic en Compilar.

    Compile la escena de Unity.

  3. Si aún no es así, marque Proyectos de C# de Unity.

  4. Haga clic en Generar. Unity iniciará una ventana de Explorador de archivos, donde debe crear y, a continuación, seleccionará una carpeta en la que compilará la aplicación. Cree esa carpeta ahora y asígnela el nombre App. A continuación, con la carpeta Aplicación seleccionada, presione Seleccionar carpeta.

  5. Unity comenzará a compilar el proyecto en la carpeta Aplicación .

  6. Una vez que Unity haya terminado de compilar (es posible que tarde algún tiempo), abrirá una ventana de Explorador de archivos en la ubicación de la compilación (compruebe la barra de tareas, ya que puede que no siempre aparezca encima de las ventanas, pero le notificará la adición de una nueva ventana).

Capítulo 11: Implementación de la aplicación

Para implementar la aplicación:

  1. Vaya a la nueva compilación de Unity (la carpeta Aplicación ) y abra el archivo de solución con Visual Studio.

  2. En Configuración de la solución, seleccione Depurar.

  3. En plataforma de soluciones, seleccione x86, Equipo local.

    Para la Microsoft HoloLens, es posible que le resulte más fácil establecer esto en Máquina remota, de modo que no esté anclado a su equipo. Sin embargo, también tendrá que hacer lo siguiente:

    • Conozca la dirección IP de HoloLens, que se puede encontrar en la red de configuración > & Internet > Wi-Fi > Opciones avanzadas; IPv4 es la dirección que debe usar.
    • Asegúrese de que el modo de desarrollador está activado; se encuentra en Configuración > Update & Security > Para desarrolladores.

    Implemente la solución desde Visual Studio.

  4. Vaya al menú Compilar y haga clic en Implementar solución para transferir localmente la aplicación a su PC.

  5. La aplicación debería aparecer ahora en la lista de aplicaciones instaladas, lista para iniciarse.

  6. Una vez iniciada, la aplicación le pedirá que autorice el acceso al micrófono. Asegúrese de hacer clic en el botón .

  7. ¡Ya está listo para empezar a traducir!

Aplicación de Translation Text API finalizada

Enhorabuena, ha creado una aplicación de realidad mixta que aprovecha Azure Translation Text API para convertir la voz en texto traducido.

Producto final.

Ejercicios extra

Ejercicio 1

¿Puede agregar funcionalidad de texto a voz a la aplicación para que se diga el texto devuelto?

Ejercicio 2

Haga posible que el usuario cambie los idiomas de origen y salida ("from" y "to") dentro de la propia aplicación, por lo que la aplicación no necesita volver a compilarse cada vez que quiera cambiar los idiomas.