¿Qué hace Vertical Reels Video Studio (básico)?
Un pipeline simple y paso a paso para un video vertical de 30 a 90 segundos.
0. Primera ejecución: preguntar al usuario por SUS ajustes (nunca usar valores predeterminados)
Antes del primer video, si brand.config.json no existe, tiene "configured": false o aún contiene @yourhandle,
pregunta al usuario (una pregunta a la vez) y guarda las respuestas en brand.config.json:
- Handles de redes sociales: Instagram, Threads, TikTok, X (los que use).
- Texto de la marca de agua (exactamente como debe aparecer, p. ej.
@yourhandleo@ig / @x) y posición (bottom-center,bottom-left,top-left,top-right). - Texto del CTA y el handle que menciona.
- Voz: su ID de voz de ElevenLabs + modelo + idioma, o "Grabaré mi propia voz". La clave API se solicita solo como secreto
ELEVENLABS_API_KEY. - Idioma y tono; cómo debe pronunciar la voz su nombre/handle.
Luego establece "configured": true. Nunca inventes un handle, nunca reutilices el de otra persona (incluido el autor de este kit) y nunca renderices una marca de agua que aún diga @yourhandle.
Los marcadores de posición a continuación se asignan a brand.config.json:
| Marcador | Clave de configuración | Significado |
|---|---|---|
{{HANDLE}} | handles.* | El/los handle(s) del usuario |
{{WATERMARK}} | watermark.text, watermark.position | Texto y posición de la marca de agua, tal como los dio el usuario |
{{LANGUAGE}} | language, tone | Idioma y tono de la locución y subtítulos |
{{VOICE_ID}} | voice.voiceId | La voz elegida por el usuario |
{{TTS_MODEL}} | voice.model | Modelo de ElevenLabs, p. ej. eleven_multilingual_v2 |
{{CTA}} | cta.text, cta.handle | El llamado a la acción del usuario |
La clave API siempre proviene de la variable de entorno ELEVENLABS_API_KEY. Nunca la imprimas, nunca la escribas en un archivo que se suba al repositorio.
El flujo
- Preguntar por los ajustes del usuario (primera ejecución) → 1. Tema → 2. Investigación y verificación de datos → 3. Borrador del guion → 4. Aprobación del usuario →
- Locución → 6. Temporización → 7. Construir escenas → 8. Renderizar → 9. Exportación optimizada para Reels →
- Control de calidad → 11. Portadas y subtítulos → 12. Entrega. Si el usuario solicita un cambio, retrocede al paso más temprano que afecte el cambio (una nueva línea de texto implica una nueva locución solo para esa línea).
1–2. Tema e investigación
- Una historia por video. Escribe para principiantes.
- Verifica cada número, fecha, nombre y cita contra una fuente primaria (página oficial, publicación del autor, captura de pantalla con fecha). Descarta cualquier cosa que no puedas verificar. Nunca inventes hechos.
- Mantén un breve
sources.mdcon los enlaces que utilizaste.
3–4. Borrador, luego espera
- Ofrece 2–4 opciones de gancho para los primeros 2 segundos (una pregunta o un contraste sorprendente).
- Escribe una tabla temporizada:
tiempo | texto en pantalla | locución. Apunta a 45–65 s, nunca más de 90 s. - Detente y envía el borrador al usuario. No generes audio ni renderices hasta que lo apruebe.
5. Locución
- Genera el guion aprobado con
{{VOICE_ID}}(verscripts/tts.py). Mantén dos textos: el texto mostrado (lo que muestran los subtítulos) y el texto TTS (deletreado para la voz, p. ej.A.I.para "IA", números escritos como palabras). - Escúchalo. Regenera solo las líneas que están mal. Nunca dejes la misma línea dos veces en el audio.
- Si no tienes cuenta de ElevenLabs, graba tu propia voz. Funciona igual de bien.
6. Temporización
- Obtén marcas de tiempo de palabras (alineación de ElevenLabs, o Whisper en el audio) y guarda
timing.json:{duration, words:[{w,s,e}], scenes:[{id,start}]}. - Las animaciones comienzan en el fotograma donde se pronuncia su palabra:
frame = Math.round(seconds * 30).
7. Construir escenas (Remotion, 1080 × 1920, 30 fps)
- Fondo oscuro, un color de texto claro, un color de acento. Un título grande por latido.
- Texto cinético: cada palabra del título aparece al pronunciarse (escala 0.6 → 1 con un pequeño rebasamiento).
- Un elemento nuevo en pantalla cada 1.5–3 s. Mantén los números al menos 1.5 s para que la gente pueda leerlos.
- El texto del gancho es visible desde el fotograma 0, para que el primer fotograma funcione como una imagen fija.
- Zona segura: mantén el texto entre y = 200 y y = 1500. Coloca el texto
{{WATERMARK}}pequeño en la posición elegida por el usuario (por defecto abajo: y ≈ 1430). - Usa capturas de pantalla reales y logotipos con crédito. Etiqueta los mock-ups como "ilustración".
8–9. Renderizar y exportar
npx remotion render src/index.ts <CompositionId> out/raw.mp4
bash scripts/reels-export.sh out/raw.mp4 out/final-reels.mp4
La exportación produce: 1080 × 1920, H.264 High ≤ 4.1, yuv420p (rango TV), BT.709, 30 fps constantes, 8–12 Mbps, AAC 48 kHz, +faststart, −14 LUFS / ≤ −1 dBTP. Mantén el video por debajo de 90 s.
10. Control de calidad (siempre, antes de entregar)
Ejecuta bash scripts/qa-check.sh out/final-reels.mp4 y revisa la salida de scripts/contact-sheet.sh. Verifica:
- Audio: las palabras son claras, nada cortado, ninguna línea repetida, sonoridad ≈ −14 LUFS.
- Video: sin texto cortado, nada fuera de la zona segura, ningún clip congelado, ningún primer o último segundo vacío.
Corrige y vuelve a renderizar antes de enviar cualquier cosa.
11–12. Portadas, subtítulos, entrega
- 2–4 opciones de portada, 1080 × 1920 más una versión de cuadrícula 1080 × 1350. Un gancho grande, una imagen principal, como máximo 2–3 tarjetas numéricas pequeñas. Mantén el texto clave dentro del centro 1080 × 1080.
- Subtítulos: Instagram (gancho, cuerpo,
{{CTA}}, algunos hashtags), Threads (más corto, sin hashtags), TikTok. - Entrega el MP4 final, una vista previa pequeña (< 40 MB), portadas, subtítulos, un archivo
.srty la lista de fuentes.
Reglas
- Nunca publiques, subas ni compres nada. Entrega los archivos al usuario.
- Sin hechos inventados. Acredita cada fuente y cada autor de código abierto que muestres.
- Usa solo música, clips y voces para los que tengas derecho de uso.