Duolingo es una (la) plataforma social de aprendizaje de idiomas y su uso de AWS es bastante intenso. En éste post veremos algunos de los servicios más utilizados y ejemplos de aplicación.
Por ejemplo, Duolingo, utiliza Amazon DynamoDB para almacenar más de 31 billones (americanos) de artículos en apoyo de su plataforma de aprendizaje en línea. Actualmente cuentan con alrededor de 200 millones de usuarios (2018) mensuales en todo el mundo que realizan más de seis billones de ejercicios/test utilizando todo el poder de Amazon DynamoDB para su storage.
Duolingo depende en gran medida de Amazon DynamoDB no sólo por su base de datos altamente escalable, sino también por su alto rendimiento que alcanza las 24.000 unidades de lectura por segundo y las 3.300 unidades de escritura por segundo. Además, Amazon DynamoDB utiliza otros servicios de AWS como Amazon ElastiCache para aumentar el rendimiento y la accesibilidad, Amazon S3 para almacenar datos relacionados con las imágenes (realmente el poder de UX de la plataforma es altísimo) y Amazon RDS para el almacenamiento permanente de datos.
Pero realmente su servicio estrella es Amazon Polly, del cual ya hemos hablado por aquí. Cuando se enseña un idioma extranjero, la pronunciación precisa es importante. Los estudiantes desarrollan sus habilidades de escucha y habla de manera deficiente si se exponen a una pronunciación incorrecta, lo que compromete a su capacidad para comunicarse eficazmente. Duolingo utiliza el sistema de texto a voz (TTS) para proporcionar una educación lingüística de alta calidad.
Según he podido investigar, la elección de usar TTS en lugar de grabaciones humanas fue a razón de un marco cuantitativo y cualitativo que diseñó Duolingo para poder decidir si las voces humanas eran mejores o, bien, demostrar que Amazon Polly sería una mejor elección. Tras meses de trabajo, demostraron que Amazon Polly había proporcionado una experiencia muy superior.
En resumen, TTS tiene una clara ventaja a la hora de hacer operativo el proceso de creación de audio, y no está muy por detrás de las grabaciones humanas en cuanto a calidad de voz. De hecho, por lo validado mediante Amazon Polly, TTS de última generación es tan bueno como el habla humana natural.
El proceso para usar TTS implica evaluar la calidad de la voz y añadir un poco de código para que la generación de audio se gestione automáticamente. Con Amazon Polly y boto3 (el SDK de Python de AWS), se hizo to la mágia para tener un escenario básico.
Cuando se sirven archivos de audio a millones de usuarios, tenemos dos factores cruciales a considerar: el primero, el costo y, el segundo, la latencia de la red. El equipo de Engineering de Duolingo se lanzó a contruir microservicios que se centraran en lo siguiente:
- Gestionar la creación de TTS para evitar generar TTS para el mismo texto varias veces.
- Almacenamiento de TTS pre-generados.
- Entrega de TTS pre-generados en un punto final geográficamente cercano al usuario.
El flujo de datos parte de la Incubadora de Duolingo, su plataforma para la creación de nuevos contenidos. En la Incubadora, el proceso comienza cuando un colaborador prepara una lección que requiere nuevos archivos de audio. El backend envía entonces una petición HTTP al microservicio de TTS, con el texto del audio que se va a generar, el idioma del texto, una URL de devolución de llamada, etc…
El microservicio TTS, construido sobre AWS Elastic Beanstalk, recibe el mensaje en su entorno de servidor web, comprueba si ya se ha creado un archivo de audio y guarda todos los metadatos generados en una tabla de Amazon DynamoDB.
Si los metadatos indican que se ha creado el audio, se envía una respuesta a la Incubadora de Duolingo con el estado de creación “creado”. De lo contrario, el servidor web envía un mensaje a través de una cola de Amazon SQS al entorno de trabajo para su ejecución asíncrona. Este mensaje fija el status en “solicitado”. Este estado evita generar audio varias veces para la misma frase.
El siguiente paso será solicitar a Amazon Polly el archivo de audio TTS. Después de generar el archivo de audio, se carga en Amazon S3. El nuevo archivo se almacena automáticamente en caché en los servicios desplegados de Amazon CloudFront, de modo que se sirve más rápidamente a los usuarios finales. Finalmente, el estado pasa a “creado”, y se llama a la URL de devolución de llamada dada la solicitud inicial, notificando así que el proceso ha finalizado y que el archivo está listo para ser utilizado por la aplicación.
Realmente, como podéis ver, el uso de Amazon Polly por parte de Duolingo es brillante pero no sólo eso, también el resto de servicios que utilizan como por ejemplo el microservicio responsable de toda la pipeline de generación de audios que es el responsable de manejar toda la funcionalidad común de TTS, que incluye la asincronía de las solicitudes, la generación de archivos de audio, el almacenamiento en caché y su distribución.