Subtítulos incrustados
Un catálogo, elegido al inicio (CATALOG.md — 17 identidades; los tres motores detrás son detalle de backend). Estándar (por defecto) construye un riel limpio y textual (subtítulo inferior que lleva la mayor parte del texto) + un clímax incrustado compuesto dentro de la escena detrás del sujeto en el pico. Cinemático es puramente incrustado — sin riel, cada subtítulo compuesto detrás del sujeto (tipografía heroica, acumulación, oclusión como efecto). Tema es una constitución temática completa — paradigma del cuerpo × pieza heroica × efectos frontales × reacción de placa, compuesta desde registros (themes/README.md): ordnance terminal neonsign stardust stomp. La mayoría de los videos explicativos / voz en off usan Estándar; la incrustación es el pico escaso y ganado — incrustar cada palabra es el error común; Tema es para solicitudes de nivel VFX ("炸", "特效", "como hecho en AE").
Flujo operativo (resumen)
El texto detallado a continuación es extenso; el pipeline en sí es corto — y todo lo determinista se calcula o compila, nunca se escribe a mano:
- Compuerta de decisión (rechazar clips malos) → elegir UNA identidad de CATALOG.md (17 identidades; motor/compilador derivado por búsqueda — nunca preguntar por modo/categoría)
hyperframes init(omitir si el directorio del proyecto ya existe con el video dentro —matte.cjs/transcribe.cjsadoptan cualquier video en el dir como source.mp4) →bash scripts/prepare.sh <proyecto>(matte ∥ transcribir ∥ envolvente de audio en paralelo, luego zonas seguras v2 con paleta de escena/óptica/iluminación — un comando, nada olvidado)- autoría de un pequeño JSON de elecciones creativas (leer
safe-zones.jsonprimero): Cinemático →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Tema →theme.json→make-theme.cjs(paradigmas de riel/panel/poema/toma;anchores el riel silencioso por defecto) - QA visual:
node scripts/preview-frames.cjs <proyecto>→ previsualizaciones compuestas fieles en ~2s/fotograma (sin render). Consultar § QA visual antes de pagar por un render. render-and-composite.sh→ compuertas (timing / oclusión+heroico / desbordamiento / entrega) →final.mp4
Reglas importantes que la gente olvida:
- riel (por defecto) + incrustado (promoción).
drop(relleno, no mostrado) /riel(subtítulo inferior textual, al frente, lleva la mayor parte del texto) /incrustado(una palabra pico compuesta detrás del sujeto). El modo Estándar hace ambos, incrustando solo los picos. Ver § Modelo de subtítulos. - El video se entrega SIN TOCAR (Estándar/Cinemático; el presupuesto de PLACA del modo Tema es la única excepción sancionada — reacciones de placa registradas (carga-oscurecimiento, golpe, sacudida, grano) definidas por ADN del tema y aplicadas DESPUÉS de la composición del matte para que sujeto+texto+placa se muevan como un solo fotograma) — los subtítulos son lo único añadido; el matte solo permite que el sujeto ocluya la pista incrustada. Nunca graduar/recolorear/añadir líneas de escaneo al metraje.
- Dos libros de reglas: riel → references/rail.md (delgado), técnica de incrustado → references/composition-craft.md (rico, solo incrustado). Leer según necesidad.
Modelo de subtítulos — riel + incrustado
Cada frase hablada es una de tres cosas:
| Qué | Cómo se muestra | |
|---|---|---|
| drop | relleno — um/eh, tartamudeos, autocorrecciones | no se muestra |
| riel | el valor por defecto — contenido hablado ordinario (textual) | subtítulo inferior limpio, al frente, legible. Una palabra destacada puede tener un resalte emphasis en línea (color de acento / palabra activa) — permanece en el riel. |
| incrustado | un pico promocionado — el latido del titular | una palabra grande compuesta detrás del sujeto (oclusión del matte), entrada y salida diseñadas |
El riel lleva la mayor parte del texto; la incrustación es el pico escaso y ganado. La escasez es por latido/bloque, no por clip: ≤1 heroico por bloque (pensamiento), nunca dos co-visibles, ≥ un latido de aire entre ventanas heroicas (el compilador advierte por debajo de 0.6s). Un clip corto → normalmente 1–2; un explicativo largo → ~uno por sección. Entre múltiples heroicos, el más grande autorizado es el APEX (solo él recibe la incrustación completa de bloqueo + elevación de ajuste de ancho); los más pequeños son picos MENORES que viajan en su columna como líneas de énfasis sobredimensionadas (fg, movimiento amortiguado) — no todo latido necesita la exhibición del matte, que es exactamente lo que mantiene el ápice como un evento. Incrustar cada palabra sigue siendo el error común.
Las identidades de superficie de riel construyen exactamente esto (riel = rail.html, incrustado = el clímax en index.html). Las identidades de flujo de columna eliminan el riel y hacen todo al estilo incrustado — recomendarlas solo para solicitudes de ambiente sobre texto, nunca para explicativos / voz en off donde las palabras deben leerse (CATALOG.md codifica esto por identidad)
Paso 0 — elegir UNA identidad del CATÁLOGO
Un front-end, tres motores detrás. El usuario elige una IDENTIDAD de CATALOG.md (17 entradas: 12 clásicas + 5 temáticas); el motor, compilador y archivo de autoría se derivan por búsqueda de la fila del catálogo. Nunca preguntar "Estándar vs Cinemático vs Tema" — esos son nombres de backend (un producto tiene una UX incluso con varios motores). El catálogo codifica todo lo que necesita el enrutamiento: superficie de lectura, voz, recomendar-para, necesidades de escena, notas de adyacencia para los pares realmente cercanos (loud↔ordnance, neon↔neonsign, cream↔stardust).
Procedimiento: sondear el clip → preseleccionar 2–3 identidades del catálogo → recomendar UNA con una línea de por qué → el usuario elige → autorizar el archivo de esa identidad. Las identidades están bloqueadas por motor (sin combinaciones cruzadas; abrir una es un evento de validación — ver dna/README.md).
Siempre presentar tu recomendación y dejar que el usuario elija antes de autorizar. No predeterminar en silencio.
(La tabla completa de identidades está en CATALOG.md — fuente única de verdad para el enrutamiento. Los documentos del motor a continuación describen el contrato de autoría de cada backend.)
Heurística de recomendación: usar las "Heurísticas de preselección" en CATALOG.md — son a nivel de identidad (p. ej., "炸" preselecciona ordnance/stomp/terminal/loud y elige según QUÉ debe explotar), nunca a nivel de categoría. En caso de duda → anchor.
- Cinemático → escribir
plan.jsonpara una plantilla bloqueada, compilada pormake-composition.cjs. - Tema → leer themes/README.md, autorizar
theme.json, ejecutarscripts/render-theme.sh(compila + renderiza + reacción de placa → final_fx.mp4).
Compuerta de decisión — EJECUTAR PRIMERO
Sondear el video y clasificar la escena antes de cualquier modo.
ffprobe <video.mp4> # especificaciones
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # al 20/50/80%
Leer las muestras. Rechazar si:
- Múltiples hablantes / cortes bruscos (dividir y renderizar cada toma, o rechazar)
- Sin sujeto humano (esta habilidad es para cabezas parlantes)
- Menos de 3 segundos, sin habla, o la cara nunca claramente visible —
transcribe.cjsadvierte cuando el audio está casi en silencio (Whisper alucina palabras como "Gracias." sobre el silencio); hacerle caso y rechazar en lugar de subtitular palabras fabricadas - La fuente ya tiene subtítulos / textos gráficos pesados quemados — añadir un segundo sistema de subtítulos entra en conflicto y el metraje se envía sin tocar (sin cubrir/inpintar). El texto quemado a menudo aparece solo a mitad del clip: muestrear una hoja de contactos a 1fps (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), no confiar en 3 fotogramas puntuales. - La transcripción es basura — el habla no nativa/con acento fuerte puede transcribirse en galimatías seguro. Leer
transcript.jsonantes de autorizar; si no se interpreta como lenguaje, intentarWHISPER_MODEL=mediumuna vez, si no, rechazar (un riel textual de palabras fabricadas es peor que sin subtítulos). - Mano ocupada con movimiento rápido (el matte parpadea)
Sondas previas al vuelo (no cuestan nada, evitan los peores fallos)
- Sonda de corte de toma. Muestrear fotogramas al 20%, 50%, 80%. Si aparece un sujeto/escena diferente, recortar el clip antes del corte.
- Sonda de letterbox / pillarbox. ¿Barras negras en el primer fotograma? Calcular el rectángulo de contenido seguro y restringir la colocación de subtítulos dentro de él.
- Sonda de luminancia. Muestrear la luminancia promedio de la región de subtítulos —
menor a 60→ el texto claro se lee tal cual,60-180→ añadir el velo de glifo,180+→ texto opaco + velo (nunca texto claro sin velo). Las plantillas Cinemáticas son crema+pantallay BLOQUEADAS — usar esta sonda para elegir una identidad adecuada (escenas brillantes →ink, o el riel opacoanchortema), nunca para recolorizar una. - Recomendación de identidad por tono (tú recomiendas; el usuario elige — ver Paso 0 + CATALOG.md). explicativo / entrevista / palabras que deben leerse → identidades de superficie de riel/panel; poético / social / "cinemático" → identidades de flujo de columna por registro; "炸 / 特效 / VFX" / mundos nombrados → identidades temáticas. Cuando no estés seguro →
anchor(las palabras se leen, la escena es segura) — pero presentar una preselección y dejar que el usuario elija.
Pipeline — 5 pasos
1. hyperframes init <proyecto> --non-interactive --video <video.mp4> --skip-skills
2. bash scripts/prepare.sh <proyecto> # matte ∥ transcribir (paralelo) → zonas seguras. Un comando.
# → frames_fg/ transcript.json safe-zones.json
3. [PASO DEL AGENTE — el único paso creativo] autorizar un pequeño JSON; ver abajo según el modo
Cinemático: autorizar plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Tema: autorizar theme.json → bash scripts/render-theme.sh <proyecto> (compila + renderiza + fx de placa)
4. node scripts/preview-frames.cjs <proyecto> # ~2s/fotograma previsualizaciones compuestas → § QA visual (ANTES del render)
5. bash scripts/render-and-composite.sh <proyecto> # compuertas → final.mp4 + instantánea history/
(Modo Tema: SALTAR pasos 3b/5 — render-theme.sh ya ejecuta compilar + render-and-composite
+ _postfx.sh; el entregable es final_fx.mp4, final.mp4 es pre-reacción de placa)
El paso 3 difiere según el modo:
Paso 3 — Modo Cinemático (pura incrustación)
- Leer
safe-zones.jsonprimero. Los planos de narración van enzones.hugLeft/hugRight— tiras limpias ADYACENTES a la silueta (el texto lejos del cuerpo se lee como flotante, no incrustado; las esquinas lejanas son el plan B, no el predeterminado). El heroico por defecto va aheroAnchor/heroBands.best(centrado EN el sujeto, ~30–55% ocluido).recommendation:"fg"mueve la NARRACIÓN al frente para legibilidad; el heroico permanece incrustado siempre queheroBands.feasible— h