← Volver al blog
Guías #webinars

Receta: webinars con grabación, VOD y subtítulos SRT

Hacé un webinar, grabalo en tu propio S3, publicá el VOD, y generá subtítulos automáticamente con un worker Whisper local. El pipeline completo de reunión a transcripción.

4 min de lectura
Read in English

Por qué ser dueño de tus webinars

Un webinar es tu contenido y, muchas veces, tus leads. Correrlo en la plataforma de otro significa su marca, su almacenamiento, la calidad de su transcripción y su precio por asistente. StreamHub te deja hospedar la reunión, grabarla en un bucket tuyo, publicar la repetición, y convertirla en un activo buscable y subtitulado — todo en tu infraestructura.

La arquitectura en palabras

Los participantes entran a una sala con tokens de LiveKit. Cuando grabás, egress escribe un MP4 que un job en segundo plano sube al S3 de la app y lo indexa como VOD. Si la transcripción está activa, el core extrae el audio, deja un job de archivo para un worker Whisper local, arma un SRT con el resultado, y lo sube al lado del VOD — así cada grabación obtiene subtítulos sin costo de API.

1. Crear la app y configurar S3

export BASE="https://your-server.example.com/api/v1"
export TOKEN="sk_...."

curl -s -X POST $BASE/apps -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"name":"webinars","displayName":"Webinars"}'

curl -X PUT $BASE/apps/webinars/s3 -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"provider":"aws","bucket":"webinar-vods","region":"us-east-1","key":"AKIA...","secret":"..."}'

Las credenciales van a data/secrets.json, nunca a la config ni a un log.

2. Admitir participantes

Generá tokens de ingreso por persona. Un host publica; los asistentes pueden ser solo-suscripción:

# host
curl -s -X POST $BASE/apps/webinars/tokens -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"room":"q3-launch","identity":"host","canPublish":true}'

# asistente (solo mirar)
curl -s -X POST $BASE/apps/webinars/tokens -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"room":"q3-launch","identity":"guest-42","canPublish":false,"canSubscribe":true}'

3. Grabar la sesión

curl -s -X POST $BASE/apps/webinars/recording/start -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"roomName":"webinars-q3-launch"}'
# → { "data": { "vodId": 12, "egressId": "EG_xxx", "status": "recording" } }

Cuando egress termina, corre el job de subida y el VOD pasa por uploading a ready, disparando vod_ready. La grabación respeta max_recording_minutes_month.

4. Activar la transcripción

Instalá la app de transcripción con el proveedor Whisper local (open source, sin factura de API):

curl -X POST $BASE/apps/webinars/plugins/transcription/install -H "Authorization: Bearer $TOKEN"

curl -X PATCH $BASE/apps/webinars/plugins/transcription -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"enabled": true, "config": {"provider": "local", "model": "small", "language": "auto", "autoTranscribe": true}}'

Con autoTranscribe: true, cada VOD se transcribe cuando pasa a ready. El core deja jobs en apps/webinars/transcripts/jobs/, el worker escribe resultados en .../results/, y el SRT se sube a tu bucket al lado del MP4.

5. Traer el VOD y los subtítulos

curl -s $BASE/apps/webinars/vods -H "Authorization: Bearer $TOKEN"
curl -s $BASE/apps/webinars/vods/12/transcript -H "Authorization: Bearer $TOKEN"
curl -s $BASE/apps/webinars/vods/12/transcript.srt -H "Authorization: Bearer $TOKEN" -o q3-launch.srt

GET .../transcript devuelve el estado, el texto completo, los segmentos con tiempos y una srtUrl prefirmada fresca; .../transcript.srt reconstruye el archivo desde los segmentos guardados incluso si la subida a S3 falló. Para re-correr a demanda, POST .../vods/12/transcribe.

Qué deberías ver

Cuando termina el webinar, aparece un VOD y pasa a ready; poco después, el estado de su transcripción pasa a ready con un SRT en tu bucket y subtítulos descargables. Apuntá tu reproductor de VOD a la url y cargá el SRT como pista de subtítulos.

Resolución de problemas

  • La transcripción nunca aparece — confirmá que la app de transcripción esté habilitada y que el VOD haya llegado a ready (la transcripción corre sobre la grabación terminada).
  • Un solo subtítulo gigante — los modelos gpt-4o-transcribe de OpenAI devuelven solo texto; usá el worker local o whisper-1, que devuelven segmentos con tiempos para un SRT correcto.
  • Grabación pesada en CPU — la grabación compuesta usa Chrome headless; para un webinar de un solo presentador, recordMode: track graba un publicador vía ffmpeg en su lugar.

Cierre

Tus webinars, tu bucket, tus transcripciones — sin precio por asistente y sin servicio de transcripción de terceros. Si querés un portal de repeticiones con acceso restringido, capitulado automático, o subtítulos traducidos sobre este pipeline, nuestro equipo lo arma sobre el core open source.