Reel — Edición dividida (panel 45 % sobre el orador)
Un panel crema permanente llena la parte superior del cuadro (1080 × split.panel_height,
por defecto 864 = 45 %) con widgets de estilo UI (tarjetas, medidores, alternadores, terminales,
chips) que ilustran exactamente lo que se está diciendo. El orador se coloca debajo a
escala 1 y nunca se mueve. Final: la palabra clave del comentario grande en pantalla, luego una
tarjeta de seguimiento. Ejemplo práctico: examples/split/ (plan + módulo de escena de un video
real de 100 s sobre cinco habilidades de Claude).
Argumentos: $ARGUMENTS
Valores predeterminados (cambiar solo si el usuario lo indica)
Leer primero reel.config.json (si no existe, usar reel.config.example.json).
| Elemento | Predeterminado |
|---|---|
| División | "split": split.panel_height (864 → panel 45 %, orador 55 %; 960 = 50/50) |
| Orador | escala 1, sin zoom, sin movimiento; rostro centrado en la región del orador (speaker_y) |
| Caja segura | "safe": split.safe = [64, 160, 64, 32] → el contenido de la escena vive en 952 × 672 comenzando 160 px hacia abajo (el encabezado de Instagram / la barra de estado del teléfono ocultan la parte superior) |
| Subtítulos / SFX / música | Ninguno añadido. Audio = la mezcla original de la toma, re-multiplexada por finish.py |
| Toma | Asumir que ya está cortada, etalonada, con música añadida → usar tal cual. Cruda/sin cortar → preguntar primero |
| CTA | Palabra clave del comentario (palabra o número) enorme en una tarjeta de burbuja de diálogo; tarjeta de seguimiento con "handle": creator.handle, solo texto, nunca un recorte de rostro |
| Paleta | split_palette: panel crema, texto tinta, rellenos de acento; texto sobre crema usa accent_deep (contraste) |
Entradas
El nombre de la toma y el tema provienen de los argumentos. Preguntar una vez, en un solo mensaje, solo lo que falta: ¿la toma ya está cortada/etalonada/con música?; la palabra clave del comentario; nombres o jerga que Whisper pueda malinterpretar (nombres de herramientas y productos).
Flujo de trabajo
PY = .venv/Scripts/python.exe -X utf8 (Windows) o .venv/bin/python -X utf8 (macOS/Linux). Pasos largos en segundo plano.
| # | Paso | Comando / acción | Verificar |
|---|---|---|---|
| 1 | Mirar | ffprobe; hoja de contacto ffmpeg -i raw/<take> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<take>/sheet.jpg y mirarla | ¿pared vacía sobre la cabeza? ¿ya editada? |
| 2 | Transcribir | $PY tools/transcribe.py <take> --prompt "<nombres, jerga>" | corregir nombres de herramientas; silencios > 3 s → re-transcribir ventana |
| 3 | Rostro | $PY tools/face_track.py <take> --split <panel_height> | imprime speaker_y |
| 4 | Plan de ritmo | una escena por idea, típicamente 3–7 s, cada widget anclado a una palabra hablada (señal = inicio de palabra). Las escenas cambian el contenido, nunca el diseño | |
| 5 | Archivo de plan | work/<take>/showcase.json a partir de examples/split/showcase.json: video ("../../raw/<file>"), split, speaker_y, safe, scenes_module, scenes[] {kind, start, end, cue{...}}, handle en la escena de seguimiento; _note registra los números de rostro | |
| 6 | Escenas | tools/scenes_<slug>.py a partir de examples/split/scenes_5skills.py: una sc_<kind>(i, s) -> (html, js) por tipo, diccionario RENDER, opcional CSS/JS. Coordenadas dentro de la caja segura (952 de ancho); ids s{i}-*; tiempos de señal absolutos. sc_comment, sc_follow son el CTA | |
| 7 | Construir | $PY tools/showcase_build.py <take>; en work/<take>/sc: npx hyperframes lint public → 0 errores; npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <mitad de cada escena>; leer hojas, corregir | texto dentro del panel, nada debajo del encabezado |
| 8 | Renderizado rápido | $PY tools/finish.py <take> --seconds 12; leer work/<take>/sc/quick_sheet.jpg | |
| 9 | Renderizado completo | $PY tools/finish.py <take> (segundo plano) → final/<take>/, verificar, qa/sheet.jpg | leer la hoja |
| 10 | Informe | ruta, duración, escenas, resultado de verificación. Si se aprendió algo nuevo, añadirlo a este skill |
Reglas del panel
- Los widgets ilustran la oración que se está diciendo en ese momento: una tarjeta de repositorio cuando nombran el repo, un medidor cuando comparan, un tachado cuando dicen "no esto".
- Cada escena se desvanece 0.25 s antes de la siguiente (el constructor lo hace); dentro de una escena, los elementos aparecen en sus palabras clave.
- Los números en pantalla deben ser recuentos reales de la toma.
- Los tipos de escena integrados en
showcase_build.py(hook,repo,cta, …) son anteriores a la caja segura del 45 % y pueden desbordarla; escribir tipos entools/scenes_<slug>.pybasados enexamples/split/scenes_5skills.pyen su lugar. - Texto en farsi / árabe: clase
.fa(RTL en el elemento, nuncadir="rtl"en<html>),letter-spacing: 0, dígitos mediantefa(), un cero grande como latín0. - Sin interpolaciones superpuestas en una propiedad, sin
Math.random/from:"random", las inserciones llevanautoAlpha:0en el estado de origen. - Si algún clip de origen es HDR (HLG), mapear tonos primero (
TONEMAPentools/story_assets.py) —finish.pyse detiene ante "HDR auto-promotion". hyperframes snapshotno es prueba del renderizado — el paso 8 lo es.