Saltar al contenido principal

Amazon Polly

Fecha de creación del post: 3 de septiembre de 2025
Autor: Abraham García


¿Qué es Amazon Polly?

Amazon Polly es un servicio de generación de voz con inteligencia artificial (IA) que permite convertir texto en una transmisión de audio de manera inmediata. Su principal objetivo es facilitar la creación de aplicaciones y sistemas que puedan hablar de forma natural, integrando voces realistas bajo demanda.


Tipos de salida por petición

Cada solicitud a Amazon Polly puede devolver uno de dos tipos de salida:

  1. Audio

    • Convierte el texto de entrada en una salida de voz en diferentes formatos de audio (por ejemplo, MP3, OGG, PCM).
    • Es la opción más utilizada para reproducir directamente en aplicaciones, asistentes virtuales, sistemas educativos o de accesibilidad.
  2. Archivo JSON con visemas

    • Genera un archivo con marcas temporales de visemas (movimientos faciales y de labios asociados al habla).
    • Este recurso es muy útil para aplicaciones que requieren sincronización de labios (lip-sync) en personajes animados o avatares virtuales.

Consideración importante

Amazon Polly solo puede entregar un tipo de salida por petición.
Esto significa que si se necesitan tanto el archivo de audio como las marcas de visemas, se deben realizar dos solicitudes independientes:

  • Una petición para obtener el audio sintetizado.
  • Otra petición para obtener el archivo JSON con visemas.

De esta forma se asegura la correcta integración de ambos recursos en la aplicación.

instalación.

Para el presente documento, Amazon Polly es consumido desde nodeJs, por lo que la instalacion se reqlizará desde npm .

npm install @aws-sdk/client-polly

Configuración de credenciales

Para utilizar el servicio se requiere obtener una API Key, la cual se genera creando un usuario en IAM (Identity and Access Management) de AWS.


Pasos para generar la API Key en IAM

  1. Inicia sesión en la consola de administración de AWS.
  2. Accede al servicio IAM desde el panel principal.
  3. En el menú lateral, selecciona Users (Usuarios).
  4. Haz clic en Add user (Agregar usuario).
  5. Ingresa un nombre de usuario descriptivo (ejemplo: polly-node-service).
  6. Selecciona el tipo de acceso: Programmatic access (Acceso programático).
  7. Asigna políticas de permisos:
    • Puedes usar la política administrada AmazonPollyFullAccess.
    • Alternativamente, crea una política personalizada con permisos mínimos necesarios.
  8. Completa el asistente y genera el usuario.
  9. Una vez creado, descarga el archivo .csv que contiene el Access Key ID y el Secret Access Key.

Variables de entorno

Se recomienda almacenar las credenciales en un archivo .env:


⚠️ Importante:

  • Guarda estas llaves de forma segura.
  • Nunca subas tus credenciales a repositorios públicos.

Estructura recomendada en Node.js

Para usar el servicio, se recomienda la siguiente estructura en código JavaScript:

import { PollyClient, SynthesizeSpeechCommand } from "@aws-sdk/client-polly";


const polly = new PollyClient({
region: process.env.AWS_REGION || "us-east-1",
credentials: {
accessKeyId: process.env.clave_acceso,
secretAccessKey: process.env.acceso_secreta,
},
});

const getAudio = async (Text) => {
const command = new SynthesizeSpeechCommand({
Text,// Text es la pregunta o entrada.
VoiceId: process.env.POLLY_VOICE || "Mia", // Se selecciona la voz deseada
OutputFormat: "mp3",
LanguageCode: "es-MX",
});

const { AudioStream } = await polly.send(command);

// Convierte el stream a base64 para mandar por JSON
const chunks = [];
for await (const chunk of AudioStream) {
chunks.push(chunk);
}
const buffer = Buffer.concat(chunks);
return buffer.toString("base64");
};


const getVisemes = async (Text) => {
const command = new SynthesizeSpeechCommand({
Text,
VoiceId: process.env.POLLY_VOICE || "Mia",
OutputFormat: "json",
SpeechMarkTypes: ["viseme"],
LanguageCode: "es-MX",
TextType: "text",
});

const { AudioStream } = await polly.send(command);
let json = "";
for await (const chunk of AudioStream) {
json += chunk.toString();
}
return json
.trim()
.split("\n")
.map((line) => JSON.parse(line));
};

// 🔹 generar audio + visemas en paralelo
const [audio, marks] = await Promise.all([
getAudio(output_text),
getVisemes(output_text),
]);

Ejecución en paralelo de peticiones

Debido a que la petición del audio no depende de la petición de las marcas, se recomienda realizar ambas solicitudes en paralelo utilizando Promise.all.
Esto permite optimizar el tiempo de respuesta y aprovechar mejor los recursos de la aplicación.


Estructura de la petición de marcas

Cuando se solicitan visemas, la respuesta de Polly se entrega en formato JSON, con una lista de marcas que indican la posición en el tiempo y el tipo de visema generado durante la síntesis de voz.

El formato esperado es el siguiente:

{
"audio": "audio data",
"marks": [
{ "time": 6, "type": "viseme", "value": "e" },
{ "time": 69, "type": "viseme", "value": "t" },
{ "time": 119, "type": "viseme", "value": "p" },
{ "time": 192, "type": "viseme", "value": "e" },
{ "time": 241, "type": "viseme", "value": "k" },
{ "time": 371, "type": "viseme", "value": "o" },
{ "time": 416, "type": "viseme", "value": "t" },
{ "time": 467, "type": "viseme", "value": "k" },
{ "time": 553, "type": "viseme", "value": "a" },
{ "time": 617, "type": "viseme", "value": "f" },
{ "time": 720, "type": "viseme", "value": "e" },
{ "time": 781, "type": "viseme", "value": "T" },
{ "time": 826, "type": "viseme", "value": "e" },
{ "time": 887, "type": "viseme", "value": "s" }
]
}

Investigaciones compatibles

Referencias