Presentamos Amazon Polly Bidireccional Streaming: síntesis de voz en tiempo real para IA conversacional

Crear experiencias conversacionales naturales requiere una síntesis del habla que siga el ritmo de las interacciones en tiempo real. Hoy, nos complace anunciar la nueva API de transmisión bidireccional para Amazon Polly, que permite la síntesis optimizada de texto a voz (TTS) en tiempo real, donde puede comenzar a enviar texto y recibir audio simultáneamente.

Esta nueva API está diseñada para aplicaciones de IA conversacionales que generan texto o audio de forma incremental, como respuestas de modelos de lenguaje grandes (LLM), donde los usuarios deben comenzar a sintetizar audio antes de que el texto completo esté disponible. Amazon Polly ya admite la transmisión de audio sintetizado a los usuarios. La nueva API va más allá y se centra en la comunicación bidireccional a través de HTTP/2, lo que permite una velocidad mejorada, una latencia más baja y un uso optimizado.

El desafío de la conversión de texto a voz tradicional

Las API tradicionales de conversión de texto a voz siguen un patrón de solicitud-respuesta. Esto requería que usted recopilara el texto completo antes de realizar una solicitud de síntesis. Amazon Polly transmite audio de forma incremental después de realizar una solicitud, pero el cuello de botella está en el lado de entrada: no se puede comenzar a enviar texto hasta que esté completamente disponible. En aplicaciones conversacionales impulsadas por LLM, donde el texto se genera token por token, esto significa esperar la respuesta completa antes de que comience la síntesis.

Considere un asistente virtual desarrollado por un LLM. El modelo genera tokens de forma incremental durante varios segundos. Con TTS tradicional, los usuarios deben esperar:

El LLM para terminar de generar la respuesta completa El servicio TTS para sintetizar el texto completo El audio para descargar antes de que comience la reproducción

La nueva API de transmisión bidireccional de Amazon Polly está diseñada para abordar estos cuellos de botella.

Novedades: Streaming bidireccional

La API StartSpeechSynthesisStream introduce un enfoque fundamentalmente diferente:

Envíe texto de forma incremental: transmita texto a Amazon Polly a medida que esté disponible; no es necesario esperar oraciones o párrafos completos. Reciba audio inmediatamente: recupere bytes de audio sintetizados en tiempo real a medida que se generan. Controle el tiempo de síntesis: utilice la configuración de descarga para activar la síntesis inmediata del texto almacenado en el búfer. Verdadera comunicación dúplex: envíe y reciba simultáneamente a través de una única conexión.

Componentes clave

Componente Dirección del evento Dirección Propósito TextEvent Cliente entrante → Amazon Polly Enviar texto a sintetizar CloseStreamEvent Cliente entrante → Amazon Polly Señal de fin de entrada de texto AudioEvent Saliente Amazon Polly → Cliente Recibir fragmentos de audio sintetizados StreamClosedEvent Saliente Amazon Polly → Cliente Confirmación de finalización de la transmisión

Comparación con los métodos tradicionales.

Implementaciones tradicionales de separación de archivos

Anteriormente, lograr TTS de baja latencia requería implementaciones a nivel de aplicación:

Este enfoque requirió:

Lógica de separación de texto del lado del servidor Múltiples llamadas paralelas a la API de Amazon Polly Reensamblaje de audio complejo

Después: Streaming bidireccional nativo

Diagrama de arquitectura de transmisión bidireccional que muestra la aplicación cliente conectada a Amazon Polly a través de una única secuencia HTTP/2 con entrada de texto y salida de audio fluyendo en ambas direcciones.

Beneficios:

No se requiere lógica de separación Conexión única persistente Transmisión nativa en ambas direcciones Complejidad de infraestructura reducida Menor latencia

Puntos de referencia de rendimiento

Para medir el impacto en el mundo real, comparamos tanto la API SynthesizeSpeech tradicional como la nueva API bidireccional StartSpeechSynthesisStream con la misma entrada: 7045 caracteres de prosa (970 palabras), usando la voz de Matthew con el motor generativo, salida MP3 a 24 kHz en us-west-2.

Cómo medimos: Ambas pruebas simulan un LLM que genera tokens a ~30 ms por palabra. La prueba API tradicional almacena palabras en buffer hasta que se alcanza el límite de una oración, luego envía la oración completa como una solicitud SynthesizeSpeech y espera la respuesta de audio completa antes de continuar. Estas pruebas reflejan cómo funcionan las integraciones TTS tradicionales, porque debes tener la oración completa antes de solicitar la síntesis. La prueba API de transmisión bidireccional envía cada palabra a la transmisión a medida que llega, lo que permite a Amazon Polly comenzar la síntesis antes de que el texto completo esté disponible. Ambas pruebas utilizan la misma configuración de texto, voz y salida.

Métrica Tradicional SynthesizeSpeech Mejora de la transmisión bidireccional Tiempo total de procesamiento 115 226 ms (~115 s) 70 071 ms (~70 s) Llamadas API 39 % más rápidas 27 1 27 veces menos oraciones enviadas 27 (secuencial) 27 (transmitidas a medida que llegan las palabras) — Total de bytes de audio 2 354 292 2 324 636 —

La ventaja clave es arquitectónica: la API bidireccional permite enviar texto de entrada y recibir audio sintetizado simultáneamente a través de una única conexión. En lugar de esperar a que se acumule cada oración antes de solicitar la síntesis, el texto se transmite a Amazon Polly palabra por palabra a medida que el LLM lo produce. Para la IA conversacional, esto significa que Amazon Polly recibe y procesa texto de forma incremental a lo largo de la generación, en lugar de recibirlo todo de una vez una vez finalizado el LLM. El resultado es menos tiempo de espera para la síntesis una vez completada la generación: la latencia general de extremo a extremo desde el aviso hasta el audio entregado por completo se reduce significativamente.

Implementación técnica

Empezando

Puede utilizar la API de transmisión bidireccional con AWS SDK para Java-2x, JavaScript v3, .NET v4, C++, Go v2, Kotlin, PHP v3, Ruby v3, Rust y Swift. Actualmente no se admite la compatibilidad con CLI (AWS Command Line Interface (AWS CLI) v1 y v2, PowerShell v4 y v5), Python y .NET v3. He aquí un ejemplo:

// Crea el cliente Polly asíncrono PollyAsyncClient pollyClient = PollyAsyncClient.builder() .region(Region.US_WEST_2) .credentialsProvider(DefaultCredentialsProvider.create()) .build(); // Crea la solicitud de transmisión StartSpeechSynthesisStreamRequest request = StartSpeechSynthesisStreamRequest.builder() .voiceId(VoiceId.JOANNA) .engine(Engine.GENERATIVE) .outputFormat(OutputFormat.MP3) .sampleRate("24000") .build();

Envío de eventos de texto

El texto se envía a Amazon Polly mediante un editor de flujos reactivos. Cada TextEvent contiene texto:

TextEvent textEvent = TextEvent.builder() .text("¡Hola, esto es transmisión de texto a voz!") .build();

Manejo de eventos de audio

El audio llega a través de un controlador de respuesta con un patrón de visitante:

StartSpeechSynthesisStreamResponseHandler ResponseHandler = StartSpeechSynthesisStreamResponseHandler.builder() .onResponse(respuesta -> System.out.println("Transmisión conectada")) .onError(error -> handleError(error)) .subscriber(StartSpeechSynthesisStreamResponseHandler.Visitor.builder() .onAudioEvent(audioEvent -> { // Procesar fragmento de audio inmediatamente byte[]audioData = audioEvent.audioChunk().asByteArray(); playOrBufferAudio(audioData); }) .onStreamClosedEvent(event -> { System.out.println("Síntesis completa. Caracteres procesados: " + event.requestCharacters()); }) .build()) .build();

Ejemplo completo: transmisión de texto desde un LLM

A continuación se muestra un ejemplo práctico que muestra cómo integrar la transmisión bidireccional con la generación incremental de texto:

clase pública LLMIntegrationExample { pollyClient final privado PollyAsyncClient pollyClient; Suscriptor privado super StartSpeechSynthesisStreamActionStream> textSubscriber; /** * Inicia una transmisión bidireccional y devuelve un identificador para enviar texto. */ public CompletableFuture startStream(VoiceId voice, AudioConsumer audioConsumer) { Solicitud StartSpeechSynthesisStreamRequest = StartSpeechSynthesisStreamRequest.builder() .voiceId(voice) .engine(Engine.GENERATIVE) .outputFormat(OutputFormat.PCM) .sampleRate("16000") .construir(); // Editor que permite la inyección de texto externo Editor textPublisher = suscriptor -> { this.textSubscriber = suscriptor; suscriptor.onSubscribe(new Subscription() { @Override public void request(long n) { /* Impulsado por la demanda por el suscriptor */ } @Override public void cancel() { textSubscriber = null; } }); }; Controlador StartSpeechSynthesisStreamResponseHandler = StartSpeechSynthesisStreamResponseHandler.builder() .subscriber(StartSpeechSynthesisStreamResponseHandler.Visitor.builder() .onAudioEvent(evento -> { if (event.audioChunk()!= nulo) { audioConsumer.accept(event.audioChunk().asByteArray()); } }) .onStreamClosedEvent(evento -> audioConsumer.complete()) .build()) .build(); devolver pollyClient.startSpeechSynthesisStream(solicitud, textPublisher, controlador); } /** * Enviar archivo de texto a la secuencia. Llame a esto cuando lleguen los tokens LLM. */ public void sendText(Texto de cadena, descarga booleana) { if (textSubscriber!= null) { Evento TextEvent = TextEvent.builder() .text(texto) .flushStreamConfiguration(FlushStreamConfiguration.builder() .force(flush) .build()) .build(); textSubscriber.onNext(evento); } } /** * Cierra la secuencia cuando se completa la generación del texto. */ public void closeStream() { if (textSubscriber!= null) { textSubscriber.onNext(CloseStreamEvent.builder().build()); textSubscriber.onComplete(); } } }

Patrón de integración con streaming LLM

A continuación se muestra cómo integrar patrones con la transmisión de LLM:

// Inicie la transmisión de Polly pollyStreamer.startStream(VoiceId.JOANNA, audioPlayer::playChunk);// A medida que LLM genera tokens… llmClient.streamCompletion(prompt, token -> { // Envíe cada token a Polly //Opcionalmente, vacíe los límites de las oraciones para forzar la síntesis //tenga en cuenta la compensación aquí: puede obtener el audio antes, pero la calidad del audio puede verse afectada boolean isSentenceEnd = token.endsWith(".") || token.endsWith("!") || token.endsWith("?"); pollyStreamer.sendText(token, isSentenceEnd }); // Cuando LLM completa pollyStreamer.closeStream();

Beneficios comerciales

Experiencia de usuario mejorada

La latencia impacta directamente en la satisfacción del usuario. Cuanto más rápido escuchen los usuarios una respuesta, más natural y atractiva se sentirá la interacción. La API de transmisión bidireccional permite:

Reducción del tiempo de espera percibido: la reproducción de audio comienza mientras el LLM aún se está generando, enmascarando el tiempo de procesamiento de backend. Mayor compromiso: interacciones más rápidas y con mayor capacidad de respuesta conducen a una mayor retención y satisfacción del usuario. Implementación simplificada: la configuración y administración de la solución de transmisión ahora es una única llamada API con enlaces y devoluciones de llamada claros para eliminar la complejidad.

Costos operativos reducidos

La optimización de su arquitectura se traduce directamente en ahorros de costos:

Factor de costo Fragmentación tradicional Infraestructura de transmisión bidireccional Servidores WebSocket, balanceadores de carga, middleware de fragmentación Conexión directa de cliente a Amazon Polly Desarrollo Lógica de fragmentación personalizada, reensamblaje de audio, manejo de errores SDK maneja la complejidad Mantenimiento Múltiples componentes para monitorear y actualizar Punto de integración único Llamadas API Múltiples llamadas por solicitud (una por fragmento) Sesión de transmisión única

Las organizaciones pueden esperar reducir los costos de infraestructura al eliminar servidores intermedios y disminuir el tiempo de desarrollo al utilizar la capacidad de transmisión nativa.

Casos de uso

Se recomienda la API de transmisión bidireccional para:

Asistentes conversacionales de IA: transmite las respuestas de LLM directamente a voz. Traducción en tiempo real: sintetiza el texto traducido a medida que se genera. Respuesta de voz interactiva (IVR): sistemas telefónicos dinámicos y responsivos. Herramientas de accesibilidad: lectores de pantalla en tiempo real y conversión de texto a voz. Juegos: diálogo y narración dinámica de NPC. Subtítulos en vivo: salida de audio para sistemas de transcripción en vivo.

Conclusión

La nueva API de transmisión bidireccional para Amazon Polly representa un avance significativo en la síntesis de voz en tiempo real. Al permitir una transmisión real en ambas direcciones, se eliminan los cuellos de botella de latencia que tradicionalmente han afectado a las aplicaciones de IA conversacional.

Conclusiones clave:

Latencia reducida: el audio comienza a reproducirse mientras aún se genera el texto. Arquitectura simplificada: no se necesitan soluciones alternativas de separación de archivos ni infraestructura compleja. Integración nativa de LLM: diseñada específicamente para transmitir texto desde modelos de lenguaje. Control flexible: control detallado sobre el tiempo de síntesis con configuración integrada.

Ya sea que esté creando un asistente virtual, una herramienta de accesibilidad o cualquier aplicación que requiera conversión de texto a voz responsiva, la API de transmisión bidireccional proporciona la base para experiencias verdaderamente conversacionales.

Próximos pasos

La API de transmisión bidireccional ahora está disponible con carácter general. Para empezar:

Actualice al último AWS SDK para Java 2.x con soporte de transmisión bidireccional. Revise la documentación de la API para obtener una referencia detallada. Pruebe el código de ejemplo en esta publicación para experimentar la transmisión de baja latencia.

Estamos emocionados de ver lo que construye con esta nueva capacidad. ¡Comparta sus comentarios y casos de uso con nosotros!

Sobre los autores

Foto profesional de un hombre de mediana edad con cabello oscuro y barba canosa que llevaba una camisa con cuello gris claro sobre un fondo blanco.

“Scott Mishra”

“Scott” es el arquitecto sénior de soluciones de Amazon Web Services. Scott es un asesor técnico confiable que ayuda a los clientes empresariales a diseñar e implementar soluciones en la nube a escala. Impulsa el éxito del cliente a través del liderazgo técnico, la orientación arquitectónica y la resolución innovadora de problemas mientras trabaja con tecnologías de nube de vanguardia. Scott se especializa en soluciones de inteligencia artificial generativa.

Foto profesional de un hombre con pelo corto oscuro y barba incipiente que llevaba una camisa de cuello blanco sobre un fondo oscuro

“Praveen Gadi”

“Praveen” es arquitecto senior de soluciones para Amazon Web Services. Praveen es un asesor técnico confiable para clientes empresariales. Permite a los clientes alcanzar sus objetivos comerciales y maximizar sus inversiones en la nube. Praveen se especializa en soluciones de integración y productividad de desarrolladores.

Foto profesional de un hombre asiático sonriente con el pelo corto y oscuro y una camisa de cuello a cuadros gris y negro sobre un fondo oscuro

“Pablo Wu”

“Paul” es arquitecto de soluciones para Amazon Web Services. Paul es un asesor técnico confiable para clientes empresariales. Permite a los clientes alcanzar sus objetivos comerciales y maximizar sus inversiones en la nube.

Foto profesional de un joven con cabello castaño y barba incipiente con una camiseta gris sobre un fondo oscuro

“Damián Pukaluk”

"Damian" es ingeniero de desarrollo de software en AWS Polly.