top of page
  • Foto del escritorRan Isenberg

Serverless potencia la accesibilidad: convierte texto en voz con Amazon Polly


Loro DALL-E sentado en una nube leyendo un libro mientras canta
Loro DALL-E sentado en una nube leyendo un libro mientras canta

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.


Consola Amazon Polly
El texto entra, el habla sale

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.

Diseño de alto nivel
Diseño de alto nivel

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!


Arquitectura de servicios
Arquitectura de servicios

Flujo de eventos

  1. El usuario agrega un nuevo archivo de texto a la carpeta 'texto' en la carpeta raíz del proyecto.

  2. El usuario implementa el servicio con AWS CDK (puede usar el comando 'make deployment').

  3. El archivo se carga en S3.

  4. 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.

  5. 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.

  6. 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.

  7. 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:

  1. 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.

  2. 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.

  3. 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


bottom of page