DEV Community

LeoJulieta
LeoJulieta

Posted on

Subtítulos IA en vivo para el Mundial 2026: guía paso a paso

Mundial 2026: Cómo montar un pipeline de subtítulos IA en vivo y escalarlo a 5 mil millones de espectadores


Introducción

En el Mundial 2026 la transmisión ya no es sólo fútbol: es una experiencia multilingüe que llega a más de 5 mil millones de personas en tres continentes. Para que cualquier aficionado pueda seguir el partido “sin barrera de idioma” es imprescindible ofrecer subtítulos generados por IA en tiempo real. En este artículo verás, paso a paso, cómo diseñar, implementar y poner en producción un sistema de subtitulado en vivo que cumpla con los requisitos de latencia, coste y normativa.


1. Arquitectura de referencia (diagrama textual)

[Fuente de audio] → (1) Captura de stream (RTMP/RTSP)  
        ↓
[Cola de mensajes] → (2) Kafka / Pulsar (particiones por idioma)  
        ↓
[Workers] → (3) Speech‑to‑Text (Google, Azure o Whisper)  
        ↓
[Transformador] → (4) Traducción (DeepL, Azure Translator o GPT‑4o)  
        ↓
[Renderizador] → (5) Generación de WebVTT / SCTE‑20  
        ↓
[CDN] → (6) Distribución a players (HLS/DASH) con pista de subtítulos
Enter fullscreen mode Exit fullscreen mode
  • Objetivo de latencia: < 2 s desde que el sonido llega al servidor hasta que el subtítulo aparece en pantalla.
  • Escalabilidad: Cada worker procesa ~ 150 kbps de audio; para 48 partidos simultáneos basta con 12 instancias de GPU (NVIDIA A100) o 40 instancias de CPU (2 vCPU + 8 GB RAM).

2. Selección de servicios y costes estimados

Servicio Precio por minuto (USD) Latencia típica Comentario
Google Cloud Speech‑to‑Text 0,006 1,2 s Muy preciso en inglés y español, facturación por 15 s.
Azure Speech Services 0,008 1,3 s Buen soporte de modelos personalizados.
Whisper (OpenAI) + GPU 0,004 (GPU) + 0,011 (GPT‑4o) ≈ 0,015 < 1 s Mejor latencia, pero requiere infraestructura propia.
DeepL API 0,020 (texto) 0,5 s Traducción de alta calidad, limitado a 12 idiomas en plan estándar.
Azure Translator 0,012 0,4 s Soporta más de 70 idiomas, precios por carácter.

Coste total práctico: 0,03 – 0,05 USD/minuto por idioma, incluyendo reconocimiento, traducción y generación de subtítulos. Con 12 idiomas simultáneos y 48 partidos, el gasto mensual ronda los US$ 1,5 M – una cifra competitiva frente a la contratación de traductores humanos.


3. Implementación paso a paso

3.1. Captura y envío a Kafka

# Instala FFmpeg y envía audio a Kafka (topic: audio_raw)
ffmpeg -i rtmp://origin/live/match01 \
       -vn -ac 1 -ar 16000 -f s16le - \
       | kafka-console-producer.sh \
         --broker-list kafka1:9092,kafka2:9092 \
         --topic audio_raw
Enter fullscreen mode Exit fullscreen mode
  • Tip: Usa -ac 1 -ar 16000 para reducir ancho de banda sin perder precisión.

3.2. Worker de reconocimiento (Python)

import os, json, asyncio
from google.cloud import speech_v1p1beta1 as speech
from aiokafka import AIOKafkaConsumer, AIOKafkaProducer

PROJECT_ID = os.getenv("GCP_PROJECT")
LANG = "es-ES"

async def transcribe():
    consumer = AIOKafkaConsumer(
        "audio_raw", bootstrap_servers="kafka1:9092", group_id="stt")
    producer = AIOKafkaProducer(bootstrap_servers="kafka1:9092")
    await consumer.start(); await producer.start()
    client = speech.SpeechClient()
    config = speech.RecognitionConfig(
        encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code=LANG,
        enable_automatic_punctuation=True)

    async for msg in consumer:
        audio = speech.RecognitionAudio(content=msg.value)
        response = client.recognize(config=config, audio=audio)
        for result in response.results:
            txt = result.alternatives[0].transcript
            await producer.send_and_wait(
                "transcript_es", json.dumps({"text": txt, "ts": msg.timestamp}).encode())
    await consumer.stop(); await producer.stop()

if __name__ == "__main__":
    asyncio.run(transcribe())
Enter fullscreen mode Exit fullscreen mode
  • Escalado: ejecuta este script en contenedores Docker y usa Kubernetes Horizontal Pod Autoscaler para añadir pods cuando la cola supere 500 msg/s.

3.3. Traducción con GPT‑4o (Node.js)

import { OpenAI } from "openai";
import { Kafka } from "kafkajs";

const kafka = new Kafka({ brokers: ["kafka1:9092"] });
const consumer = kafka.consumer({ groupId: "translate_es_en" });
const producer = kafka.producer();

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

await consumer.connect();
await producer.connect();
await consumer.subscribe({ topic: "transcript_es", fromBeginning: false });

await consumer.run({
  eachMessage: async ({ message }) => {
    const { text, ts } = JSON.parse(message.value.toString());
    const resp = await openai.chat.completions.create({
      model: "gpt-4o-mini",
      messages: [{ role: "user", content: `Traduce al inglés este texto de fútbol: "${text}"` }],
      temperature: 0,
    });
    const en = resp.choices[0].message.content.trim();
    await producer.send({
      topic: "subtitle_en",
      messages: [{ value: JSON.stringify({ text: en, ts }) }],
    });
  },
});
Enter fullscreen mode Exit fullscreen mode
  • Consejo de coste: limita la longitud del prompt a 150 tokens; la facturación de GPT‑4o‑mini es ~ 0,00015 USD/token.

3.4. Generación de WebVTT

import json, datetime

def ts_to_vtt(ts):
    dt = datetime.datetime.fromtimestamp(ts/1000.0)
    return dt.strftime("%H:%M:%S.%f")[:-3]

def build_vtt(messages):
    lines = ["WEBVTT\n"]
    for i, m in enumerate(messages):
        start = ts_to_vtt(m["ts"])
        end = ts_to_vtt(m["ts"] + 2000)   # 2 s de ventana
        lines.append(f"{i+1}\n{start} --> {end}\n{m['text']}\n")
    return "\n".join(lines)

# Consumir de Kafka y escribir en disco cada 5 s
Enter fullscreen mode Exit fullscreen mode

El archivo .vtt se sube a la CDN (Amazon CloudFront, Cloudflare) y se referencia en el manifiesto HLS:

#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",LANGUAGE="en",NAME="English",DEFAULT=NO,FORCED=NO,URI="en.vtt"
Enter fullscreen mode Exit fullscreen mode

4. Cumplimiento legal y de accesibilidad

  1. Licencias de contenido – Asegúrate de que el contrato de derechos incluye la generación de obras derivadas (subtítulos).
  2. GDPR y CCPA – No almacenes audio sin anonimizarlo; elimina los fragmentos después de 24 h.
  3. WCAG 2.1 – Los subtítulos deben estar sincronizados (+‑250 ms) y ofrecer un botón de activación/desactivación.
  4. Revisión humana – En EE. UU y la UE, los eventos de gran audiencia requieren que al menos el 5 % de los subtítulos sea revisado por un traductor certificado antes de la transmisión en vivo. Implementa un “modo de auditoría” que envíe los bloques a una interfaz de revisión (por ejemplo, una tabla en Airtable).

5. Monetización y modelo de negocio

Fuente de ingreso Estrategia concreta
Publicidad segmentada Inserta banners dinámicos en la pista de subtítulos (ej. “Compra la camiseta de [Equipo]” → URL con UTM).
Suscripción premium Ofrece paquetes “sin latencia” (GPU Whisper + GPT‑4o) a operadores de TV que pagan $0,02 /min extra.

Herramienta mencionada: DigitalOcean

Top comments (0)