English summary. OpenSimultánea is an open source (MIT) live captioning and translation platform for multi-room conferences. Each room's audio (mic, file or HLS) is transcribed live with Gemini Live (or Gemma 4 locally, with no audio leaving the machine) and translated between Spanish, English, Portuguese, French, German and Italian. The audience picks a room and language from their phone, no account needed. Production gets an OBS/vMix overlay to burn captions into the stream, a monitoring panel, SRT/VTT/TXT exports, and a technical glossary suggested from the talk's slides. Measured over 40 minutes with two simultaneous rooms: local Gemma had 0 gaps, original captions p95 ≤ 1.0 s and translation p95 ≤ 1.2 s.

Inspiración

Una charla puede ser valiosa y aun así resultar difícil de seguir por el idioma, el ruido de la sala o la necesidad de leer lo que se está diciendo. Cuando una conferencia tiene varios escenarios en paralelo, ofrecer subtítulos también se vuelve un problema de operación.

OpenSimultánea nace del desafío de Nerdearla: una alternativa open source de subtítulos y traducción en vivo que otras comunidades puedan instalar, adaptar y mejorar. Producción conecta el audio de cada sala y cada asistente elige qué charla seguir y en qué idioma leerla desde su navegador.

Qué hace

  • Original y traducción en vivo: el original aparece en menos de un segundo, con texto provisional mientras se habla; la traducción llega a continuación y queda asociada a su frase. Español, inglés, portugués, francés, alemán e italiano como entrada o salida, elegidos por charla.
  • Varias salas en paralelo: cada sala tiene su propio procesamiento, contexto e historial. Sumar espectadores no agrega llamadas de IA: una transcripción y una traducción por frase, compartidas por todos.
  • Charlas largas sin cortes: la conexión con Gemini Live se renueva cada ~8 minutos con un relevo que corta en fin de turno o en una pausa y reconcilia el solapamiento, sin huecos ni duplicados. Si una conexión queda muda, se reemplaza y se reenvía el audio retenido; lo que no se pudo recuperar se informa.
  • Glosario desde la presentación: se sube la presentación de la charla (PDF, PDF escaneado, imagen, PowerPoint, Keynote, OpenDocument o Markdown) y el modelo propone nombres propios, siglas y términos técnicos con su página. Cada término se verifica contra el texto del archivo y nada se aplica hasta que producción lo revisa. Una entrada término = traducción fija la traducción preferida, y el prompter puede resaltar en negrita los términos confirmados.
  • Overlay para OBS y vMix: una fuente web transparente por sala que quema los subtítulos en el stream, con tamaño, líneas, posición, fondo, color y retardo configurables y vista previa en 720p/1080p.
  • Panel de monitoreo: todas las salas en una vista, con fuente, último audio, conexiones, relevos, demoras p50/p95 con cantidad de muestras, errores, historial y alertas con histéresis.
  • Exportaciones: VTT, SRT y TXT por idioma al terminar cada charla, con aviso si quedó incompleta (una traducción faltante nunca aparece como traducida).
  • Organización y permisos: organizaciones, eventos públicos o privados, salas con agenda, acceso por código de correo, roles e invitaciones de un solo uso. Los eventos públicos se siguen sin cuenta.
  • Modo local: con AI_MODE=local, transcripción y traducción corren con Gemma 4 E2B en llama.cpp; el audio no sale del equipo.

Cómo lo construimos

Capa Tecnología
Interfaz React 19, Vite, TypeScript y el Pyrion Design System
Backend Node.js 24, Fastify 5 y TypeScript
Audio Web Audio API + AudioWorklet en el navegador; FFmpeg para archivos y HLS
Transcripción Gemini Live (inputAudioTranscription) o Gemma 4 E2B local
Traducción y glosario Gemini de texto (con modelos alternativos ante 429) o Gemma local
Presentaciones pdf.js (unpdf), fflate y un lector propio de Keynote (IWA + Snappy)
Identidad y datos Supabase Auth y PostgreSQL con RLS
Tiempo real WebSocket para el audio y Server-Sent Events para los subtítulos
Verificación Vitest (89 pruebas) y Playwright (23 recorridos en navegador)
Despliegue Docker (Coolify) con Supabase alojado

La entrega en vivo está separada del guardado: el texto se distribuye por SSE en cuanto existe y se persiste en Supabase con una cola acotada, así una base lenta no demora los subtítulos.

Desafíos

  • Renovar la conexión de Live sin partir frases: la frontera se fija en el fin de turno que informa Live, en una pausa o, si no llega, con preámbulo y solapamiento.
  • Conexiones de Live que dejan de responder con voz entrando: un vigilante las detecta, las reemplaza y reenvía el audio retenido, y los tramos que no alcanzan se informan en vez de ocultarse.
  • Mantener el orden aunque una traducción llegue tarde, y los permisos de eventos privados también en conexiones abiertas y exportaciones.
  • Tratar el contenido de la presentación y del audio como datos: una instrucción escrita en una diapositiva no se obedece.

Resultados medidos

Dos salas simultáneas durante 40 minutos, con audio de prueba y reproducción a velocidad real:

Perfil Huecos Original p95 Traducción p95 WER
Gemma 4 E2B local 0 ≤ 1,0 s ≤ 1,2 s 0,05–0,07
Gemini Live + Gemma (híbrido) tramos por conexiones mudas ≤ 0,7 s ≤ 2,6 s 0,06–0,14
Gemini (clave gratuita) tramos por conexiones mudas 0,6 s cortada por cuota diaria 0,05–0,13

Con Gemini hubo 4–5 relevos de conexión por sala sin cortar frases. La clave gratuita no alcanza para un evento: la traducción agotó su cuota diaria a los ~20 minutos. Todo el detalle y la evidencia están en docs/qa/ del repositorio. No afirmamos capacidad para cinco o diez salas porque no la medimos; el README explica cómo escalar (una conexión por sala, procesos por grupos de salas y un bus compartido para los eventos SSE).

Aprendizajes

Diseñar para un evento completo obliga a pensar más allá de convertir audio en texto: el público necesita saber si la charla sigue en vivo, producción necesita ver qué sala tiene un problema y cada permiso tiene que valer también en las conexiones abiertas. Separamos el original de la traducción, la emisión del guardado y la identidad de la autorización, y distinguimos siempre las pruebas simuladas de las pruebas con servicios reales.

Próximos pasos

  • Varios idiomas de destino a la vez por charla.
  • Biblioteca de glosarios reutilizables por evento, con importación y exportación.
  • Overlay para eventos privados con un enlace de solo lectura revocable.
  • Validar en OBS y vMix reales y con cinco o más salas en nivel pago.

Built With

Share this project:

Updates

Submission history