Blog de Amazon Web Services (AWS)

Creación de aplicaciones sin servidor con .NET, AWS Lambda y Amazon Translate para automatizar las traducciones

Por Leonardo Bonato Bizaro, Pasante de Servicios Profesionales, WWCO ProServe LATAM.

 

Los procesos de traducción de contenido siguen siendo un desafío. A pesar de que tenemos un software que combina una amplia base de conocimientos de idiomas y herramientas de traducción basadas en el aprendizaje automático y la automatización, todavía necesitamos el ojo humano para entender los matices, los cambios menores que forman parte de los regionalismos y el lenguaje coloquial de cada lugar. Sin embargo, todo esto no puede impedir que los procesos sean mejores y más robustos. Y ciertamente más rápido.

Y esa es la idea que vamos a proponer en este artículo. Constantemente vemos varios clientes con el proceso de traducción de textos y sitios web de gran tamaño que se realiza de forma manual, donde el usuario debe crear una nueva versión al idioma deseado y traducir todo el contenido disponible. Esta situación hace que el autor necesite conocer el idioma de destino para traducir y/o revisar su propio texto o para comprobar manualmente, párrafo por párrafo, la traducción realizada por cualquier herramienta utilizada, a fin de validar el acuerdo semántico. Para aportar mejoras y automatización a este proceso, se desarrolló una solución para utilizar la propia función Amazon Translate para traducir automáticamente todo el contenido de un sitio, independientemente de su tamaño; y también crear un archivo existente al final del proceso formateado y traducido, que se enviará automáticamente para su revisión humana, lo que generó un ahorro de tiempo considerable en el proceso final. E incluso poner el recurso a disposición de quienes no estén familiarizados con el uso de Amazon Translate.

La solución se creó utilizando recursos de bibliotecas de código abierto y paquetes nuget proporcionados por AWS, con el fin de buscar el contenido deseado simplemente proporcionando el enlace al sitio web (como blogs, por ejemplo). Posteriormente, se codificó una función Lambda para descargar el contenido, darle formato para mantener todo el texto estandarizado en formato .DOC (utilizando las bibliotecas de LibreOffice), traducirlo al idioma de destino y, a continuación, guardar el archivo final en el bucket S3 deseado, que puede ponerse a disposición del usuario que realizó la solicitud. Este proceso final puede tener incluso más automatizaciones si tiene, por ejemplo, un sistema que recibe solicitudes HTTP o correos electrónicos activados por una solución de Pub/Sub, como Amazon SNS.

 

Descripción de la solución

 

Figura1: Infraestructura de soluciones

 

La solución que se muestra arriba consta de tres pasos:

  • Descargar los recursos HTML;
  • Creación y subida de documentos a S3;
  • Ejecución de trabajos de traducción.

Todos estos pasos tienen un tratamiento de excepción y Lambda los realiza de forma asíncrona, es decir, sin esperar a que una tarea termine antes de iniciar la siguiente, lo que hace que el código sea más rápido, ya que no depende de una respuesta final cuando un se produce la solicitud.

En el momento en que el trabajo de traducción de Amazon Translate cambia de estado, se puede activar automáticamente un evento presente en Amazon EventBridge mediante la regla TranslationJobRule, cuyo objetivo es alertar a los usuarios a través de Amazon SNS, donde se definen los puntos de conexión.

 

Prerrequisitos

  • Se debe usar una cuenta de AWS para crear y configurar la herramienta.
  • Conocimientos previos en el uso de los recursos y servicios de AWS.
  • Descargue los paquetes Nuget de código abierto necesarios, que son: System.CodeDOM; AWSSDK.Core; Amazon.Lambda.Core; AWSSDK.S3; AWSSDK.translate; fSharp.core; CSQuery.
  • Configuración del perfil de usuario mediante el comando configure de la CLI de AWS, que se utilizó para implementar la solución a través de la CLI .NET.
  • Conocimientos en C# y Visual Studio.

Tutorial

Este tutorial describe la configuración y el funcionamiento completos de la función Lambda y su rendimiento en los demás servicios de AWS que se utilizan en la infraestructura. La aplicación se creó en .NET 6.0 y utiliza un FunctionHandler principal para Lambda, que se encargará de llamar a los demás métodos de la aplicación.

 

Figura 1 — Función principal de la aplicación.

 

Un detalle importante es que dentro de esta solución existe una clase interna llamada Html, que se encarga de mantener el formato del texto que se extraerá de la página web utilizada como fuente. Esta clase tiene como objetivo mantener el documento formateado de acuerdo con el mismo estándar utilizado por el sitio, y logra este objetivo insertando un estilo CSS al principio del archivo, como se muestra a continuación:

Figura 2 — Método responsable de dar formato al texto dentro de la clase Html.

 

De esta forma, la aplicación reconoce el título principal del texto e identifica cada párrafo como un capítulo, manteniendo dentro del cuerpo el formato deseado y el título de cada sección mediante la etiqueta h1 y el texto de la sección en h2.

Figura 3 — Método responsable de formatear el texto dentro de la clase Html.

 

Esta clase interna se usa luego dentro de la solución Lambda para aplicarla con respecto al reconocimiento del texto que se obtendrá mediante el enlace del contenido deseado.

Figura 4 — Uso de la clase Html.

 

El método principal de FuncEval es responsable de transformar la entrada Lambda (formateada en JSON) en un objeto .NET y reconocer cada elemento que hace referencia a la fuente (enlace al contenido de la fuente), a la salida (se desea el bucket S3 para almacenamiento), idioma de origen (idioma de contenido actual) e idioma de destino (deseado por el usuario). Estos nombres subrayados son los nombres de cada una de las inserciones que la interacción con el usuario realizará en la aplicación.

Una vez realizada la deserialización y reconociendo cada elemento del objeto, el programa recurre a los métodos downloadHTML necesarios para extraer la información deseada del HTML. A continuación, se invoca el método CreateTempFile, que formatea este contenido y crea un archivo .doc temporal; y, por último, el método SaveDocument, responsable de guardar el contenido en el bucket S3 e iniciar el trabajo de traducción.

Figura 5 — Estructura del método principal llamado por el FunctionHandler.

 

  1. Descargue los recursos HTML: En el método DownloadHtml, el enlace al sitio web se utiliza para buscar el contenido deseado mediante la clase WebClient. Cada recurso obtenido se asigna en una cadena que será manipulada por la biblioteca CSQuery a través de la clase CQ. Con esta función, podemos filtrar el contenido y extraer solo las secciones y etiquetas HTML pertinentes a los párrafos del texto. En este ejemplo, podemos extraer todo el contenido de un blog de AWS tomando la cadena completa presente en la etiqueta del artículo de la clase de publicación de blog.

Figura 6 — Método DownloadHTML y cómo funciona.

 

De esta forma, es posible ignorar todo el contenido anterior que no se ajuste a nuestras necesidades, que está fuera del artículo.

Figura 7: Ejemplo de estructura HTML estándar de un blog de AWS.

 

Dentro de esta etiqueta de artículo, también es posible separar más contenido a través de la sección de clase blog-post-contenido, donde se encuentran todos los párrafos de este blog, separados por la etiqueta<p>.  También es posible separar las líneas relevantes a los temas/títulos de cada parte del texto, que están presentes dentro de la etiqueta<h2>.

Figura 8 — Método DownloadHTML y cómo funciona

 

El resultado de este método es un objeto de la clase Html que contiene todo el texto de la página web y su contenido separados en capítulos, donde cada capítulo es un párrafo ya separado de forma ordenada dentro de una tupla.

Figura 9 — Método DownloadHTML y cómo funciona

 

Creación y subida de documentos a S3: Ahora, con el contenido extraído correctamente en la clase Html, podemos llamar al método createTempFile.  Este método creará un archivo temporal dentro de los repositorios de Lambda y, a continuación, se escribirá en él todo el contenido del objeto Html que ya se ha formateado de acuerdo con los estándares del sitio mediante el método TransformText mencionado anteriormente. archivo.

Figura 10 — Método createTempFile y cómo funciona.

 

Una vez creado el archivo temporal, se invoca el método SaveDocument para insertar este archivo en un bucket de S3 definido mediante la entrada del usuario a Lambda. A continuación, será necesario crear una instancia de S3Client y una solicitud PutObject, definiendo el objeto que se enviará en una solicitud asincrónica:

Figura 11 — Método SaveDocument y cómo funciona.

 

Con el archivo del idioma de origen ya almacenado en el bucket S3, podemos iniciar el proceso de traducción llamando al método TranslateDocument.

1.       Ejecución del trabajo de traducción: Dentro del método de traducción, crearemos un nuevo objeto de la clase AmazonTranslateClient para poder iniciar los trabajos de traducción y haremos lo mismo con la clase AmazonIdentityManagementServiceClient para solicitar un rol de IAM. que debes tener las políticas necesarias para dar permiso a Amazon Translate:

Figura 12 — Método TranslateDocument y cómo funciona

 

De esta forma, es posible iniciar una solicitud a Amazon Translate a través de la clase StartTextTranslationJobRequest, que utilizará como criterio:

  • Nombre del trabajo que se asignará con el nombre deseado para el trabajo;
  • dataAccessRolearn que debe corresponder al ARN del rol que utilizará Translate;
  • InputDataConfig que contiene el URI del documento presente en el bucket S3 que se utilizará, además de especificar el tipo de contenido (en este caso, text/html);
  • OutputDataConfig que corresponde al URI de salida S3 del nuevo archivo traducido;
  • SourceLanguageCode y TargetLanguageCodes, que son el idioma de origen y el idioma de destino, respectivamente.

Figura 13: Cómo funciona la solicitud de traducción en el método TranslateDocument.

 

El rol de IAM que utilizará Amazon Translate debe ajustarse para que su política de confianza respectiva esté relacionada con el IAM principal translate.amazonaws.com para la acción STS:AssumeRole. La política de permisos debe asignar acceso a los recursos de Amazon S3 para realizar las acciones GetObject y PutObject en el bucket de destino.

Con respecto a Lambda, el rol de IAM ejecutor debe tener políticas destinadas a acceder a los recursos de Amazon Translate, S3, y especialmente a la acción IAM:PassRole, para que Lambda pueda asignar el rol de IAM mencionado anteriormente al trabajo de Amazon Traduce. Con estas asignaciones de acceso, es posible probar y ahora usar Lambda en el entorno de AWS.

Figura 13 – Exemplo de execução da Lambda.

Com o TextTranslateJobId disponibilizado no output da execução da Lambda, é possível visualizar o Job dentro do Amazon Translate.

Figura 13: Detalles de la ejecución de un trabajo en Amazon Translate.

 

Puede ver el destino del archivo traducido en el campo «Ubicación del archivo de salida», que lo llevará al bucket S3 seleccionado en los parámetros de ejecución de Lambda.

Figura 14: El resultado de la traducción está disponible en S3.

 

Al descargar el documento, podemos ver que la traducción del archivo funcionó, sin comprometer el formato HTML original.

Figura 15 — Archivo final traducido y listo para usar.

 

Recursos adicionales

Si uno de los propósitos de la solución es automatizar la respuesta de un consumidor desde esta Lambda, es posible crear una regla dentro de Amazon EventBridge que realice una acción en respuesta al evento de cambio de estado del trabajo de Amazon Translate; y cómo Target directamente a un tema de Amazon SNS.

 

Figura 16: Ejemplo de una regla que se aplica en Amazon EventBridge.

 

Este tema de SNS puede tener como suscripciones el correo electrónico del usuario que utilizó la solución o incluso un punto final HTTP para enviar mensajes de notificación en una solicitud HTTP POST.

Figura 17: Ejemplo de un tema configurado en Amazon Simple Notification Service para cumplir con la regla de EventBridge.

 

Eliminando la solución

Si ya no está interesado en mantener la solución disponible en su cuenta de AWS, solo es necesario eliminar los recursos creados por los servicios utilizados, eliminando la función Lambda creada, el bucket de S3 utilizado para almacenar los archivos y las funciones y políticas de IAM creadas en IAM. También es posible eliminar todos los registros generados en Amazon CloudWatch durante las ejecuciones.

 

Conclusión

Con el desarrollo de esta solución, es posible traducir cualquier texto disponible en un sitio web y crear un documento formateado automatizado a partir del texto traducido. Una tarea que se realizaba de forma manual y que requería la realización de una serie de procesos, ahora se puede realizar automáticamente mediante la implementación de esta solución, lo que permite crear varias versiones de su contenido para cualquier idioma deseado y a gran escala.

 

Este artículo fue traducido del Blog de AWS en Portugués

 


Acerca des autor

Leonardo Bonato Bizaro es pasante de servicios profesionales en el equipo de ProServe LATAM. Presente desde marzo, ha aprovechado la gran oportunidad que se le brinda a través de la búsqueda constante de experiencia y aprendizaje en AWS para el crecimiento y el desarrollo profesional.

 

 

 

 

Revisor

JuanMa Silva quien es arquitecto de soluciones con especialidad en Microsoft para México y MCO. Cuenta con 15 años de experiencia en la industria de IT, en posiciones de Sysadmin, consultor para ayudar a migrar clientes a la nube y modernización de aplicaciones, soporte aplicaciones de misión critica basados en tecnologia Microsoft.