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.
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-transcribede OpenAI devuelven solo texto; usá el worker local owhisper-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: trackgraba 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.