Constructor de Reels
Motor: $(reelsmith root)/engine/ (build.py, template.html, music.py, pull_vo.py, capcut.py, fonts/). Una carpeta por reel: <reel-dir>/reel.json → <reel-dir>/out/reel.mp4. Si reelsmith dice que no está configurado, ejecuta reelsmith setup una vez.
reelsmith new reels/mi-reel # carpeta con src/, vo/ y un reel.json de plantilla
reelsmith sheet reels/mi-reel/src/* # hojas de contacto → elige `ss` para cada segmento
reelsmith build reels/mi-reel --stills # ~1 min: fotogramas, tiempos de palabras, subtítulos, out/qa_sheet.jpg
reelsmith stills reels/mi-reel 0.5,7.8,21.3 # fotogramas de verificación adicionales
reelsmith build reels/mi-reel # renderizado completo (~4–5 min para 60 s)
Ejecuta siempre --stills primero: lee la lista de subtítulos impresa y mira out/qa_sheet.jpg (rojo = zonas de la UI de Reels/TikTok; nada importante puede estar en rojo). Corrige reel.json, luego construye. Verifica las líneas de volumen impresas al final (−14 LUFS ±1, pico ≤ −1 dB). Luego revisa los fotogramas del MP4 final alrededor de cada efecto y transición antes de entregarlo.
Flujo de trabajo (tiempo del creador ≈ 10 min por reel)
- Guion: skill
reel-script→ el creador aprueba. Marca las palabras acentuadas con<em>…</em>; mantén los números como dígitos para su visualización. - Voz: ya sea la grabación propia del creador (
vo/vo.mp3) o ElevenLabs (consultadocs/voice.md): el texto TTS = guion sin etiquetas, los números escritos con letras, las marcas escritas fonéticamente. En el plan gratuito, genera en la interfaz web de ElevenLabs (Claude en Chrome puede manejarlo), luegoreelsmith voice <reel-dir>extrae las 2 tomas más recientes avo/con duraciones. Transcribe ambas, conserva la más limpia comovo/vo.mp3. Voces lentas:"speed": 1.07envo. - Material grabado: skill
footage-scout— solo clips nuevos (compruebaused_footage.md), hojas de contacto, verificación de privacidad. Las duraciones de los segmentos deben sumar el final de la voz + ~2 s. - Plan de edición: skill
reel-directorelige los 3–5 efectos para esta historia y dónde van las transiciones. - Escribe reel.json →
--stills→ corrige → construye → entregaout/reel.mp4+out/cover.jpg+out/caption.txt. - Pase de sonido opcional en CapCut: skill
reel-capcut(efectos de sonido de biblioteca + música elegida al oído).
reel.json
{
"vo": {"file": "vo/vo.mp3", "offset": 0.25, "speed": 1.07, "gaps": [[5.73, 0.8]]},
"script": "Llevo tres meses reescribiendo mi guía y ayer cambié la fuente de la portada <em>por cuarta vez</em>. …",
"hook": {"tag": "el escenario del borrador eterno", "lines": ["la guía está casi lista.", "<em>desde hace tres meses</em>"], "out": 5.55},
"end": {"from": 55.6, "lines": ["¿cuánto tiempo", "<em>ha estado esperando el tuyo?</em>"], "lines_at": [55.75, 56.6],
"sub": "dímelo en los comentarios", "sub_at": "@comments", "handle": "@tuhandle", "handle_at": 58.6},
"cover": {"from": 0, "to": 4.35, "title": "BORRADOR", "left": "N.º4 · Octubre", "right": "@tuhandle", "top": 330},
"cover_t": 2.0,
"stamps": [{"seg": ["I", "J"], "text": "tanya · 2 años en borradores"}],
"punch": [[3.02, 4.4], ["@mil", 9.0]],
"segments": [
{"id": "A", "clip": "src/mesa_nocturna.mp4", "ss": 9.5, "dur": 2.5, "crop": [0, 0.196, 0.75], "cut": true},
{"id": "B", "clip": "src/llaves.mp4", "ss": 1.3, "dur": 1.9, "move": "ninguno"},
{"id": "E", "clip": "src/caminar_telefono.mov", "ss": 0.8, "dur": 4.5, "cut": true, "in": "zoom"},
{"id": "I", "clip": "src/cafe.mp4", "ss": 0.3, "dur": 3.2, "look": "byn"},
{"id": "K", "clip": "src/caminar.mov", "ss": 14.0, "dur": 4.95, "look": "estallido"},
{"id": "N", "clip": "src/desayuno.mov", "ss": 0.0, "dur": 3.45, "rate": 0.4},
{"id": "Q", "clip": "src/pradera.mov", "ss": 13.2, "dur": 9.1, "move": "alejar", "in": "zoom"}
],
"caption": "…",
"music": "synth"
}
Un ejemplo real completo (ucraniano, 61 s, 17 segmentos, todos los efectos a continuación) está en $(reelsmith root)/examples/chernetka/reel.json; uno mínimo en examples/template/reel.json.
Voz y subtítulos
- lang: idioma Whisper de la voz en off (
"uk","en", …); omitido = detección automática (oREELSMITH_LANG). - vo.gaps
[tiempo_vo, segundos_extra]: una pausa de respiración insertada en el punto más silencioso cerca de ese tiempo de la voz (acelerada) — espacio para un montaje de fotos. vo.speed: factor atempo. - Anclajes "@palabra": cualquier tiempo en gancho / cierre / viñetas / glass / checklist / portada / órbita / muro / acercamiento / subs_skip puede ser
"@mil"(inicio de esa palabra del guion; coincidencia exacta primero, si no, prefijo),"@otravez#2"(2.ª aparición),"@dosveces+0.3". Las palabras que Whisper malinterpreta obtienen tiempos interpolados — usa segundos ahí.out/words.jsontiene los tiempos reales después de--stills. - subs / punch: omitidos = automáticos a partir de
script+ tiempos de palabras (5–7 palabras, 1–2 líneas, palabras acentuadas en color acento cursiva, sin punto final, una línea nunca termina en «y/en/de…»; acercamientos en hasta 4 frases acentuadas con ≥ 3 s de separación). Sobrescribe con"subs": [[a, b, "html"]],"punch": [[a, b]]. Los subtítulos se ocultan mientras la tarjeta de gancho está arriba, debajo de los títulos glass y listas de verificación, y una vez que comienza la tarjeta final (subs_from/subs_until/subs_skip [[a, b]]para ajustar).
Tarjetas y texto
- hook: tarjeta de papel visible desde el fotograma 0 (
at: [t…]revela líneas una por una,size,top). end: tarjeta desdefrom, líneas enlines_at,sub,handle. - stamps: píldora monocromática en la parte superior izquierda sobre los segmentos listados (lugar, fecha, nombre del personaje).
- cover (historia de portada + interrupción de fotograma): cabecera de revista ajustada al ancho, las letras caen; en segmentos con
"cut": truela persona se sitúa delante del título. Elige/recorta una toma donde la parte superior de la cabeza esté 40–80 px por debajo de la parte superior de la cabecera — nunca sobre los ojos.colorpara la cabecera,toppara moverla.cover_t≈ 2 para queout/cover.jpgmuestre la portada terminada. - glass (tipo glass):
{"from", "to", "lines", "at", "top"}título de vidrio esmerilado. - checklist:
{"from", "to", "title", "items": [{"text", "sub", "at", "sub_at"}]}tarjeta que crece elemento por elemento, los ticks se dibujan enat. - wall (muro de titulares):
{"from", "to", "items": [...], "every": 0.06}mosaicos de nombres de archivo/titulares que se apilan; coloca un título glass encima. - orbit:
{"from", "to", "seg", "text": "1000 SEGUIDORES · ", "speed", "scale", "tilt", "lift"}anillo de texto alrededor de la cabeza en un segmentocut; la mitad trasera pasa detrás de la persona. Mejor en un selfie cercano. - doodles (viñeta hirviente):
{"kind": "text"|"circle"|"underline"|"strike"|"arrow", "at", "to", "x", "y", …}— text:text, size, rot, write; circle/strike:w, h(strikenzigzags; 3 mantiene la palabra legible); underline:w; arrow:x2, y2, bend;color,width. Tinta acentuada con un halo crema, escrita de izquierda a derecha, temblando cada 3 fotogramas. Mantenlos por encima de y ≈ 1000 mientras la tarjeta de gancho está arriba y fuera de los rostros.
Segmentos
- rutas: relativas a la carpeta del reel, luego al directorio actual, luego al repositorio. Las fotos HEIC/JPG mediante
imgestán bien. ssinicio en el clip,dursegundos;pos0–1 encuadre horizontal para fuentes anchas;crop [x, y, size]= recorte de acercamiento del fotograma vertical (se mantiene nítido desde 4K);rate< 1 = cámara lenta cuando solo una parte corta es utilizable.- cut:
true= máscaras de persona Vision de macOS para este segmento (reelsmith masks, ~0.2 s/fotograma, en caché). Necesario para portada y órbita. - in:
"zoom"(la toma saliente entra rápidamente con desenfoque, la nueva aterriza desde un zoom) o"whip"(deslizamiento rápido borroso, sin bordes negros). Úsalo en 4–6 cortes clave, no en todos. - look:
""película cálida ·"memory"zoom-through desvanecido para montajes de fotos (dateagrega un sello de fecha de cámara naranja) ·"bw"blanco y negro (la música se amortigua) ·"burst"gris → floración de color (la música se abre). - move:
push(empuje lento hacia adentro predeterminado) ·tilt-up·pull-out·none.
Sonido y color
- music:
"synth"(una base lo-fi generada moldeada por los looks — funciona como marcador de posición, los creadores suelen preferir una pista real), una ruta a un archivo de audio del que tengas los derechos, onull. El sonido del clip original nunca se usa. - music_gain: predeterminado 0.16 bajo la voz (sidechain-ducked).
- colors:
{"accent": "#D4573A", "cream": "#F4EFE6", "ink": "#1F1A17"}(predeterminados: beige / terracota).
Reglas que surgieron de comentarios reales
- Los efectos deben leerse en tamaño de teléfono en la primera visualización: grandes, de color acento, animados. Viñetas crema pequeñas y un panel de vidrio tenue fueron interpretados como «¿dónde están los efectos?».
- Sin destellos blancos repetidos en los cortes. Silencia el sonido del clip original. 3–5 técnicas por reel, no todas.
- Nunca pongas texto, tarjetas o viñetas sobre los ojos; mueve la tarjeta o reencuadra la toma.
- Revisa las pantallas y fondos de los clips a resolución completa: mensajes de otras personas, matrículas, nombres de calles, paneles privados → salta esos segundos.
- Material fresco en cada reel (
used_footage.md). Pregunta antes de usar tomas con rostros de otras personas.