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.
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 a la 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.
Tras completar este curso, tendrá una aplicación de realidad mixta que podrá hacer lo siguiente:
- El usuario hablará en un micrófono conectado a un casco envolvente (VR) (o al micrófono integrado de HoloLens).
- La aplicación capturará el dictado y lo enviará a Azure Translator Text API.
- 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 de Translator Service en una aplicación de ejemplo basada en Unity. Dependerá de usted aplicar estos conceptos a una aplicación personalizada que pueda compilar.
Compatibilidad con dispositivos
Curso | HoloLens | Cascos envolventes |
---|---|---|
MR y Azure 301: traducción de idioma | ✔️ | ✔️ |
Nota:
Aunque este curso se centra principalmente en cascos envolventes de Windows Mixed Reality (VR), también puede aplicar lo que aprende en este curso a Microsoft HoloLens. A medida que siga el curso, verá notas sobre los cambios que podría 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 de este documento representan lo que se ha probado y comprobado en el momento de redactarlo (mayo de 2018). Puede usar el software más reciente, como se muestra en el artículo de 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:
- Un equipo de desarrollo, compatible con Windows Mixed Reality para el desarrollo de cascos envolventes (VR)
- Windows 10 Fall Creators Update (o posterior) con el modo desarrollador habilitado
- El SDK de Windows 10 más reciente
- Unity 2017.4
- Visual Studio 2017
- Casco envolvente (VR) de Windows Mixed Reality o Microsoft HoloLens con el modo desarrollador habilitado
- Un conjunto de auriculares con un micrófono integrado (si el casco no tiene un micrófono integrado y altavoces)
- Acceso a Internet para la configuración y recuperación de traducción de Azure
Antes de comenzar
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 carpeta 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 al equipo. 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 su PC habilite el dictado, vaya a Configuración privacidad voz, entrada manuscrita y escritura 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 De > audio y voz de realidad > mixta.
Advertencia
Tenga en cuenta que si está desarrollando para un casco envolvente para este laboratorio, puede experimentar problemas de dispositivo 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 se presente este problema.
Capítulo 1: Azure Portal
Para usar Azure Translator API, deberá configurar una instancia del servicio para que esté disponible para la aplicación.
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.
Una vez que haya iniciado sesión, haga clic en Nuevo en la esquina superior izquierda y busque "Translator Text API". Seleccione Entrar.
Nota:
Es posible que la palabra New se haya reemplazado por Create a resource (Crear un recurso) en portales más recientes.
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.
Una vez que haya hecho clic en Crear:
Inserte el nombre deseado para esta instancia de servicio.
Seleccione una suscripción adecuada.
Seleccione el plan de tarifa adecuado para usted, si es la primera vez que se crea un servicio Translator Text, debería estar disponible un nivel gratuito (denominado F0).
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.
Determine la ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos). Idealmente, la ubicación estaría en la región donde se ejecutaría la aplicación. Algunos recursos de Azure solo están disponibles en determinadas regiones.
También deberá confirmar que ha comprendido los Términos y Condiciones aplicados a este Servicio.
Seleccione Crear.
Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.
Aparecerá una notificación en el portal una vez creada la instancia de servicio.
Haga clic en la notificación para explorar la nueva instancia de servicio.
Haga clic en el botón Ir al recurso de la notificación para explorar la nueva instancia de servicio. Se le llevará a la nueva instancia del servicio Translator Text API.
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.
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 las claves de hipervínculo azul, ubicadas en el menú de navegación Servicios, indicado por el icono de tecla). Esto revelará las claves de servicio.
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 compatibilidad con la configuración de 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:
Abra Unity y haga clic en Nuevo.
Ahora deberá proporcionar un nombre de proyecto de Unity. Insertar MR_Translation. Asegúrese de que el tipo de proyecto esté establecido en 3D. Establezca la ubicación en algún lugar adecuado para usted (recuerde que más cerca de los directorios raíz es mejor). A continuación, haga clic en Crear proyecto.
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.
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.
Vaya a Configuración de compilación de archivos > y asegúrese de que:
El dispositivo de destino se establece en Cualquier dispositivo.
Para Microsoft HoloLens, establezca Dispositivo de destino en HoloLens.
Tipo de compilación se establece en D3D
El SDK se establece en Latest installed (Versión más reciente instalada)
La versión de Visual Studio se establece en Latest installed (Versión más reciente instalada)
Build and Run (Compilar y ejecutar ) está establecido en Equipo local
Guarde la escena y agréguela a la compilación.
Para ello, seleccione Agregar escenas abiertas. Aparecerá una ventana de guardado.
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 Scenes.
Abra la carpeta Escenas recién creada y, a continuación, en el campo Nombre de archivo: texto, escriba MR_TranslationScene y presione Guardar.
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.
La configuración restante, en Configuración de compilación, debe dejarse como predeterminada por ahora.
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.
En este panel, es necesario comprobar algunos valores:
En la pestaña Otros valores :
La versión del entorno de ejecución de scripting debe ser estable (equivalente a .NET 3.5).
El back-end de scripting debe ser .NET
El nivel de compatibilidad de API debe ser .NET 4.6
En la pestaña Configuración de publicación, en Funcionalidades, active:
InternetClient
Microphone
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 la realidad virtual), asegúrese de que se agrega el SDK de Windows Mixed Reality.
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.
Cierre la ventana Build Settings (Configuración de compilación).
Guarde la escena y el proyecto (FILE > SAVE SCENE /FILE > SAVE PROJECT).
Capítulo 3: Configuración de la cámara principal
Importante
Si desea omitir el componente Configuración 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, a continuación, continuar desde el capítulo 5. Todavía tendrá que crear un proyecto de Unity.
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.
Con el panel de Unity delante de usted, seleccione el GameObject de cámara principal. Observarás que el Panel inspector (que se encuentra a la derecha, dentro del Panel) mostrará los distintos componentes de ese GameObject, con Transformación 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.
Para ello, seleccione el icono engranaje situado junto al componente Transformar de la cámara y seleccione Restablecer.
A continuación, el componente Transformar debe tener el siguiente aspecto:
La posición se establece en 0, 0, 0
La rotación se establece en 0, 0, 0
Y Scale está establecido en 1, 1, 1
A continuación, con el objeto Cámara principal seleccionado, vea el botón Agregar componente situado en la parte inferior del Panel inspector.
Seleccione ese botón y busque (escribiendo Origen de audio en el campo de búsqueda o navegando por las secciones) para el componente llamado Origen de audio , como se muestra a continuación y selecciónelo (al presionar Entrar en él también funciona).
Se agregará un componente de origen de audio a la cámara principal, como se muestra a continuación.
Nota:
Para Microsoft HoloLens, también deberá cambiar lo siguiente, que forma 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: Configuración del 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 canvas UI, con varios objetos "Text" para mostrar los datos.
Haga clic con el botón derecho en un área vacía del Panel de jerarquía, en INTERFAZ de usuario, agregue un lienzo.
Con el objeto Canvas seleccionado, en el Panel inspector (dentro del componente "Canvas", cambie El modo de representación a Espacio mundial).
A continuación, cambie los parámetros siguientes en la transformación rect del Panel de inspectores:
POS - X 0 Y 0 Z 40
Ancho : 500
Alto - 300
Escala - X 0.13 Y 0.13 Z 0.13
Haga clic con el botón derecho en lienzo en el Panel jerarquía, en interfaz de usuario y agregue un panel. Este Panel proporcionará un fondo al texto que se mostrará en la escena.
Haga clic con el botón derecho en el Panel de jerarquía, en interfaz de usuario y agregue un objeto Text. Repita el mismo proceso hasta que haya creado cuatro objetos Text de interfaz de usuario en total (Sugerencia: si tiene seleccionado el primer objeto "Texto", simplemente puede presionar "Ctrl" + "D", para duplicarlo, hasta que tenga cuatro en total).
Para cada objeto de texto, selecciónelo y use las tablas siguientes para establecer los parámetros en el Panel de inspectores.
Para el componente Rect Transform (Rect Transform ):
Nombre Transformación: posición Ancho Height 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 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 Traducción: 20 Además, haga que el estilo de fuente negrita. Esto hará que el texto sea más fácil de leer.
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 INTERFAZ de usuario y, a continuación, seleccione Texto.
Para cada uno de estos elementos secundarios, selecciónelo y use las tablas siguientes para establecer los parámetros en el Panel de inspectores.
Para el componente Rect Transform (Rect Transform ):
Nombre Transformación: posición Ancho Height MicrophoneStatusText X 0 Y -30 Z 0 300 30 AzureResponseText X 0 Y -30 Z 0 300 30 DictationText X 0 Y -30 Z 0 300 30 TranslationResultText X 0 Y -30 Z 0 300 30 Para el componente Texto (script):
Nombre Texto Tamaño de fuente MicrophoneStatusText ?? 20 AzureResponseText ?? 20 DictationText ?? 20 TranslationResultText ?? 20
A continuación, seleccione la opción de alineación "centre" para cada componente de texto:
Para asegurarse de que los objetos Text de la interfaz de usuario secundarios son fáciles de leer, cambie su color. Para ello, haga clic en la barra (actualmente "Negro") junto a Color.
A continuación, en la nueva ventana, pequeño, Color , cambie el Color hexadecimal a: 0032EAFF
A continuación se muestra el aspecto de la interfaz de usuario .
En el Panel jerarquía:
En las vistas de escena y juego:
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:
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.
Con la carpeta Scripts creada, haga doble clic en ella para abrirla. A continuación, en esa carpeta, haga clic con el botón derecho y seleccione Crear >y, después, Script de C#. Asigne un nombre a los resultados del script.
Haga doble clic en el nuevo script Resultados para abrirlo con Visual Studio.
Inserte los siguientes espacios de nombres:
using UnityEngine; using UnityEngine.UI;
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;
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; }
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; }
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 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 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:
Haga doble clic en la carpeta Scripts para abrirlo.
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.
Haga doble clic en el nuevo script para abrirlo con Visual Studio.
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;
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;
Ahora es necesario agregar código para los métodos Awake() e Start(). Se llamará a estos 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"); } }
Puede eliminar el método Update(), ya que esta clase no la usará.
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.
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)); }
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 capítulo siguiente.
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:
Vaya a la carpeta Scripts que creó anteriormente.
Haga clic con el botón derecho en el Panel del proyecto, Crear > script de C#. Llame al script Translator.
Haga doble clic en el nuevo script de Translator para abrirlo con Visual Studio.
Agregue los siguientes espacios de nombres en la parte superior del archivo :
using System; using System.Collections; using System.Xml.Linq; using UnityEngine; using UnityEngine.Networking;
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 fue tratado en el capítulo 1.
Ahora es necesario agregar código para los métodos Awake() e Start().
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.
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.
A continuación, agregue la corrutina (con un método de secuencia de "soporte" justo debajo) para obtener la traducción del texto recibido por la clase MicrophoneManager . Este código crea una cadena de consulta para enviar 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); } }
Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.
Capítulo 8: Configurar la escena de Unity
De nuevo en el Editor de Unity, haga clic y arrastre la clase Results desde la carpeta Scripts al objeto Main Camera en el Panel de jerarquía.
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.
Arrastre los objetos Text adecuados desde el Panel jerarquía a esas cuatro ranuras, como se muestra en la imagen siguiente.
A continuación, haga clic y arrastre la clase Translator desde la carpeta Scripts al objeto Cámara principal en el Panel jerarquía.
A continuación, haga clic y arrastre la clase MicrophoneManager desde la carpeta Scripts al objeto Cámara principal en el Panel jerarquía.
Por último, haga clic en la Cámara principal y examine el Panel de inspectores. Observará que en el script que arrastró, hay dos cuadros desplegables que le permitirán establecer los idiomas.
Capítulo 9: Prueba en realidad mixta
En este momento debe probar que la escena se ha implementado correctamente.
Asegúrate de que:
- Todas las configuraciones mencionadas en el capítulo 1 se establecen correctamente.
- Los scripts Results, Translator y MicrophoneManager se adjuntan al objeto Main Camera .
- Ha colocado la clave de servicio de Azure Translator Text API dentro de la variable authorizationKey en Translator Script.
- Todos los campos del Panel 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).
Puede probar los cascos envolventes presionando 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 cascos 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.
Vaya a Configuración de compilación: Configuración de compilación de archivos > ...
En la ventana Configuración de compilación, haga clic en Compilar.
Si aún no es así, marque Proyectos de C# de Unity.
Haga clic en Generar. Unity iniciará una ventana de Explorador de archivos, donde debe crear y, a continuación, seleccionará una carpeta para 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.
Unity comenzará a compilar el proyecto en la carpeta Aplicación .
Una vez que Unity haya terminado de compilar (puede tardar algún tiempo), se 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:
Vaya a la nueva compilación de Unity (la carpeta Aplicación ) y abra el archivo de solución con Visual Studio.
En Configuración de la solución, seleccione Depurar.
En la Plataforma de soluciones, seleccione x86, Máquina local.
Para Microsoft HoloLens, es posible que le resulte más fácil establecerlo en Máquina remota, de modo que no esté anclado a su equipo. Sin embargo, también tendrá que hacer lo siguiente:
- Conoce la dirección IP de tu HoloLens, que se puede encontrar en las opciones avanzadas de Red de configuración > e Internet > Wi-Fi>; IPv4 es la dirección que debes usar.
- Asegúrese de que el modo de desarrollador está activado; se encuentra en Configuración > actualización y seguridad > para desarrolladores.
Vaya al menú Compilar y haga clic en Implementar solución para transferir localmente la aplicación al equipo.
La aplicación debería aparecer ahora en la lista de aplicaciones instaladas, lista para iniciarse.
Una vez iniciada, la aplicación le pedirá que autorice el acceso al micrófono. Asegúrese de hacer clic en el botón Sí .
¡Ya está listo para empezar a traducir!
La aplicación 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.
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 no es necesario volver a compilar la aplicación cada vez que quiera cambiar los idiomas.