Vivimos en una era increÃble de avances tecnológicos e innovaciones que transforman todos los aspectos de nuestras vidas. Desde la inteligencia artificial y el aprendizaje automático hasta la automatización y el big data, no se puede negar que el futuro ya está aquÃ.
Por ejemplo, el tÃtulo de esta entrada del blog se escribió con la ayuda de ChatGPT para optimizarlo para SEO. La imagen del loro se creó con la ayuda de DALL-E.
¿Qué pasa con el reproductor de audio que lee este texto por ti? Bueno, resulta que eso también se puede automatizar.
Y eso es lo que discutiremos hoy, automatizar la conversión de texto a voz (TTS) con la ayuda de Amazon Polly.
Proporcionaré una solución Serverless totalmente funcional en GitHub con código Python y AWS CDK. Puede implementar el código y disfrutar de la transformación de texto a voz en minutos.
Haga clic aquà para acceder al proyecto de GitHub.
Tabla de contenido
La accesibilidad es importante
Comencé mi sitio web, RanTheBuilder , para compartir mis conocimientos sobre AWS y Serverless con el mundo. Un sitio web accesible promueve la inclusión y garantiza que todas las personas puedan acceder e interactuar con el contenido. La accesibilidad ha cobrado protagonismo en los últimos años y cada vez más sitios web lo tienen en cuenta.
Recientemente noté que Medium habÃa agregado un reproductor de audio para las publicaciones del blog que lee las publicaciones por usted, lo cual es una excelente caracterÃstica de accesibilidad.
No tenÃa idea de cómo lo hacÃan y parecÃa fuera de mi alcance.
Sin embargo, me inspiré para tomar acción inmediata cuando vi el siguiente video en YouTube:
En el video, el desarrollador de la comunidad de AWS, Johannes Koch, entrevista a Jimmy Dahlqvist , un desarrollador colega. Hablan sobre cómo Jimmy automatizó la creación de su blog con AWS Step Functions, lo que dio como resultado la versión en voz del texto de la publicación con Amazon Polly.
Nunca habÃa oÃdo hablar de Amazon Polly, pero me sentà inspirado a probarlo yo mismo y finalmente resolver una caracterÃstica de accesibilidad faltante importante en mi sitio web.
He diseñado una solución sencilla que se adapta perfectamente a mis necesidades, que son relativamente modestas.
Antes de pasar a los detalles, conozcamos Amazon Polly.
Introducción al servicio de texto a voz Amazon Polly
Amazon Polly es un servicio de conversión de texto a voz (TTS) basado en la nube. Utiliza tecnologÃas avanzadas de aprendizaje profundo para convertir texto escrito en voz realista, lo que permite a los desarrolladores crear aplicaciones habilitadas para voz con voces que suenan naturales.
Polly admite una amplia gama de idiomas (24 en el momento de escribir este artÃculo) y los usuarios pueden elegir entre varias voces masculinas y femeninas con diferentes acentos y tonos (47 en total). El servicio también ofrece funciones avanzadas como reconocimiento automático de voz (ASR) y lenguaje de marcado de sÃntesis de voz (SSML), lo que permite a los desarrolladores ajustar la pronunciación, el énfasis y la entonación de la salida de voz.
Una de las mayores ventajas de Amazon Polly es que es un servicio sin servidor. Genera archivos de audio directamente en un contenedor S3, lo que facilita su incorporación a cualquier arquitectura basada en eventos. Manejará automáticamente cualquier tamaño de texto que le envÃes, no necesitas poner en marcha más máquinas y solo pagas por la cantidad de caracteres que transformas en voz.
Durante el poco tiempo que llevo usándolo, es sencillo: el texto entra y el archivo mp3 sale a un depósito S3.
El nivel gratuito es impresionante y se adaptará a las necesidades de muchas personas, incluidas las mÃas.
Lea más sobre los precios .
Veamos cómo automatizar la creación de texto a voz con la API de Amazon Polly.
Mi servicio de conversión de texto a voz en Python
Repasemos el objetivo del servicio, el diseño y los detalles de implementación.
El objetivo
Quiero poder crear archivos .mp3 de mis publicaciones de blog y subirlos a mi sitio web cuando esté trabajando en nuevas publicaciones. El servicio debe ser sin servidor, fácil de usar e implementado con AWS CDK.
Quiero que el uso sea lo más sencillo posible:
Agregue un nuevo archivo de texto a la carpeta 'texto' del servicio TST (texto a voz).
Implementar el servicio en AWS.
Recibe un archivo mp3 enviado a mi dirección de correo electrónico.
Luego puedo cargar el archivo mp3 en mi sitio web y publicar la nueva entrada del blog con un reproductor de audio integrado en la publicación que reproduce el archivo mp3, resolviendo asà una importante caracterÃstica de accesibilidad que faltaba en mi sitio web.
En resumen: agregue un archivo de texto a la carpeta "text", impleméntelo en AWS, espere un minuto y reciba un archivo mp3 en su bandeja de entrada. ¡Simple!
Si quieres probarlo tú mismo, dirÃgete al proyecto en GitHub y sigue el archivo README para obtener instrucciones y uso.
Diseño de alto nivel
Desde una perspectiva de diseño, el servicio es bastante simple. Tienes tu propia entidad de almacenamiento en la nube que se utiliza para la entrada y el procesamiento intermedio.
Entonces tenemos dos actores principales: el productor y el consumidor.
El productor carga archivos de texto al almacenamiento en la nube, que se envÃan al consumidor.
El consumidor transformará el archivo de texto en un archivo mp3 y lo enviará por correo electrónico a una dirección de correo electrónico como archivo adjunto.
Arquitectura de servicios
Veamos la arquitectura y cómo implementé cada entidad.
Descargo de responsabilidad: este servicio a nivel de prueba de concepto proporciona automatización para mis necesidades de la manera más sencilla posible. ¡Agradezco las contribuciones de código!
Flujo de eventos
El usuario agrega un nuevo archivo de texto a la carpeta 'texto' en la carpeta raÃz del proyecto.
El usuario implementa el servicio con AWS CDK (puede usar el comando 'make deployment').
El archivo se carga en S3.
La función Lambda del consumidor se activa con un evento "objeto creado en S3" y lee el nombre del archivo y el nombre del depósito del evento.
La función Lambda del consumidor envÃa el contenido de texto a Amazon Polly y permanece en reposo/sondeo hasta que se completa la tarea.
Una vez que se completa la tarea, el archivo mp3 de salida se descarga del depósito S3 y se elimina de él. Dado que lo enviamos por correo electrónico, no es necesario almacenarlo en S3, pero puede desactivarlo y enviar por correo electrónico el enlace del objeto en lugar del archivo mp3.
La función Lambda utiliza Amazon SES para enviar por correo electrónico el archivo mp3 como archivo adjunto a una dirección de correo electrónico predefinida.
Detalles de las entidades de servicio
Usamos un depósito de Amazon S3 para el almacenamiento de entrada y de salida de Amazon Polly para la entidad de almacenamiento en la nube. Polly tiene integración nativa con Polly, por lo que tiene todo el sentido. El código CDK del depósito se puede encontrar aquà .
El productor es una construcción especial de AWS CDK que carga archivos a S3 desde una carpeta especÃfica. Normalmente, agrego un archivo a la vez e implemento el servicio. También podrÃa cargar un archivo manualmente al depósito, pero eso no tiene sentido; queremos automatización. El código CDK del productor se puede encontrar aquà .
El consumidor es una función Lambda que se suscribe a los eventos 'al crear objeto' del bucket S3 y se activa cuando se escriben nuevos objetos.
La función tomará cada evento, lo leerá y enviará su contenido a Amazon Polly. Utiliza la API 'start_speech_synthesis_task'. Utilicé el contenedor SDK de muestra oficial de Amazon Polly, que obtiene el contenido del archivo de texto y devuelve el archivo mp3 como salida. ¡Bastante simple!
El código CDK del consumidor se puede encontrar aquà .
Y el código de la función Lambda se puede encontrar aquà .
El uso del contenedor Polly en mi código se puede encontrar aquà .
Rendimiento y cuestiones abiertas
En mi caso de uso, una publicación de blog de 11 000 caracteres tarda entre 40 y 50 segundos en convertirse en un archivo mp3 en mi dirección de correo electrónico una vez que se realiza la implementación. No está mal.
Quizás te preguntes por qué borro el archivo mp3 de S3 y lo envÃo como archivo adjunto en un correo electrónico.
Bueno, quiero eliminar el archivo mp3 y enviarlo como archivo adjunto en un correo electrónico porque quiero subirlo a mi sitio web, donde ya está pagado el almacenamiento, en lugar de almacenarlo y reproducirlo desde mi cuenta de desarrollo personal de AWS.
También te preguntarás: "Es una buena implementación, pero ¿es óptima? ¿Es la mejor opción de diseño?".
Bueno, no.
La función Lambda del consumidor espera y sondea a Polly hasta que finaliza su tarea de sÃntesis, lo que es una mala práctica tanto en términos de rendimiento como de costos. Sin embargo, para un proyecto de prueba de concepto que se ejecuta una vez cada dos semanas (cuando publico una nueva publicación), eso es aceptable, al menos por ahora.
Una mejor solución es usar funciones de paso con un estado de espera. Polly puede notificar a un tema de SNS cuando se completa la tarea; ese SNS puede enviar un mensaje a un mensaje de SQS y luego a un Lambda que activará la función de paso con un token de espera para continuar enviando el archivo a mi correo electrónico.
Entonces, ¿por qué elegà una función Lambda en lugar de una implementación de máquina de estados de función escalonada? Un par de razones:
El contenedor AWS Polly me permitió avanzar rápidamente y hace todo en el mismo proceso (realiza la suspensión y el sondeo por usted), por lo que la función Lambda es fácil de usar en comparación con la función de paso, que no podrá usar el SDK.
A diferencia de las funciones Lambda, no se pueden desarrollar ni depurar funciones de pasos en el IDE. QuerÃa aportar valor lo más rápido posible para este caso de uso y obtener resultados rápidamente.
Se trata más de proporcionar accesibilidad y aprender algo nuevo, y menos de crear la mejor solución posible lista para producción.
Entonces, en este caso, ¿deberÃa utilizar la máquina de estados de la función Step en lugar de una función Lambda?
SÃ, por supuesto. Lo haré como parte de la versión 2 del servicio, pero también son bienvenidas las contribuciones de código.
Otra área de mejora es que no estoy usando léxicos ni lenguaje de marcado de sÃntesis (SSML), lo que permite a los desarrolladores ajustar la pronunciación, el énfasis y la entonación de la salida de voz. Esto puede ser un cambio radical, pero requiere más investigación para comprender la función y cómo automatizarla.
Y, por último, todavÃa es necesario crear el manejo de errores, los reintentos y las pruebas. Probé el código en el IDE (llamé al controlador Lambda con un evento generado) y durante el tiempo de implementación como una prueba de extremo a extremo.
¿Quieres saber más sobre cómo probar aplicaciones sin servidor? Consulta mi publicación aquà .
Comments