Render — música, sonido, subtítulos, exportación final
Entrada: videos/<video>/ con un storyboard.json aprobado (ajustado a la voz: tiene audio
y timing) y un audio/voice-script.json aprobado. Salida:
audio/music.wav música seleccionada o generada
audio/mix.wav banda sonora final (voz + música con ducking + SFX), -14 LUFS
audio/mix.json cada evento de sonido (toma, cue, archivo, tiempo) para verificar
render/final.mp4 1080x1920 (según formato), 30 fps, H.264 + AAC
render/cover.png portada / miniatura a resolución completa
render/qc.json informe de control de calidad
Esta etapa no modifica visuales ni palabras. Animación o tiempos incorrectos → habilidades de guión gráfico / voz en off. Gratuito por defecto: música de biblioteca o generada por código, efectos de sonido generados por código. Música paga (generación por IA) solo si el usuario lo solicita o aprueba un presupuesto.
Paso 1 — Música
- Lee el
music.mood/notesdel guión gráfico y la duración del video. - Busca en
studio/library/music/(index.jsonlista pistas con etiquetas de estado de ánimo, bpm, licencia). Selecciona la mejor coincidencia; si ninguna encaja, indícalo. - Sin coincidencia → genera el respaldo gratuito, con el "drop" al inicio del shot de revelación
(tiempo de inicio de la escena — calculado a partir de duraciones/transiciones):
node studio/scripts/make-music.mjs --out videos/<video>/audio/music.wav --duration <s> --mood upbeat|calm|cinematic|tense --bpm <n> --drop <s> [--silence <from>-<to>](tense: tonalidad menor, pulso de latido, final irresuelto;--silencesilencia una ventana antes de un sonido de revelación — en modo tense un tictac lo sigue). Video de universo: sigueuniverse.json→music/sfx. Pistas de biblioteca: copia/convierte aaudio/music.wav; el recorte, fundido y ducking ocurren en la mezcla. - Regístralo en
storyboard.json→music.file,music.source(pista + licencia, o "code-generated"), opcionalmusic.db(por defecto -16 dB antes del ducking).
Paso 2 — Efectos de sonido
Las claves ya viven en sfx de cada toma (palabras simples, ancladas a fotogramas o palabras habladas por
la etapa de voz en off). El mezclador mapea palabras → sonidos mediante studio/library/sfx/index.json
(generado por node studio/scripts/make-sfx.mjs; los sonidos personalizados van en custom, se verifica primero).
repeat + every reproducen una clave varias veces; syncEnd: true la coloca al final de la toma;
los risers terminan en su clave. Los whooshes de transición son opcionales (--auto-whoosh) — el usuario
prefiere sonido contenido: solo momentos clave (≈ 1 clave por cada 2 s como máximo, ninguna en la mayoría de
las transiciones). Si un guión gráfico tiene muchas más claves que eso, redúcelas a los momentos clave
antes de mezclar e indícalo. Corrige cualquier línea de "No sound matched" del mezclador agregando
palabras clave o un sonido personalizado — nunca cambiando el diseño del guión gráfico.
Paso 3 — Mezcla
node studio/scripts/mix.mjs videos/<video> (--dry para previsualizar el conteo de eventos primero)
La voz se mantiene al frente; la música se atenúa por la voz (sidechain) y se desvanece al final; SFX a
-12 dB (--sfx-db, o storyboard.sfxDb); master limitado y normalizado a -14 LUFS / -1.5 dBTP. Establece
storyboard.finalAudio. Vuelve a ejecutar después de cualquier cambio de audio.
Paso 4 — Subtítulos
Activados por defecto para formatos sociales. En storyboard.json:
"captions": { "enabled": true, "y": 83, "size": 50, "skipLines": ["L11"] }
- Las frases (≤ 4 palabras, equilibradas, divididas en pausas) provienen de los tiempos de voz; la palabra hablada se resalta en el color de resalto de la marca.
skipLines: líneas de VO cuyas palabras ya están en pantalla (números de teléfono, URLs).- Por toma:
captionY(% del fotograma) para moverlos,captions: falsepara ocultarlos donde las mismas palabras están en pantalla (por ejemplo, un nombre en tercio inferior). - Mantenlos dentro de la zona segura (83% por defecto) y fuera de elementos de diseño importantes.
Verifica con una hoja de contacto (los subtítulos se muestran en fotogramas donde alguien habla):
node studio/scripts/render.mjs videos/<video>/storyboard.json --sheet --scale 0.25 --out <scratchpad>/captions-sheet.png
Mira una vez; corrige colisiones con captionY / captions: false.
Paso 5 — Render final, portada, QC
node studio/scripts/render.mjs videos/<video>/storyboard.json --final
node studio/scripts/render.mjs videos/<video>/storyboard.json --cover
node studio/scripts/qc.mjs videos/<video>
El QC debe pasar: resolución, tasa de fotogramas, códecs, duración = guión gráfico, loudness -14 ±1.5 LUFS.
Advertencias (pico verdadero, silencios, fotogramas negros) → explicar o corregir. No veas el MP4;
envía render/final.mp4 (y la portada) al usuario con el resumen del QC y lo que contiene la
mezcla (fuente de música, número de eventos de sonido, subtítulos activados/desactivados).
Paso 6 — Aprobar
Usuario satisfecho → "status": "final" en storyboard.json → render, listo. Cambios:
ajustes de música/sonido/subtítulos → Pasos 1–5 aquí; cambios visuales o de tiempos → habilidad de
guión gráfico / voz en off, luego vuelve a ejecutar esta etapa.