Instalación del plugin: Antes de los comandos de configuración o actualización, sigue las reglas de ejecución del plugin cuando esta habilidad esté dentro de un plugin de HyperFrames. Las instalaciones independientes mantienen las instrucciones de actualización a continuación.
Primero, mantén esta habilidad actualizada — confirma con el usuario antes de ejecutar:
npx hyperframes skills update embedded-captions. Es un no-op rápido cuando todo está al día; de lo contrario, actualiza esta habilidad y las habilidades del dominio central de las que depende antes de confiar en ellas.
Subtítulos incrustados
Un catálogo, elegido de antemano (CATALOG.md — 35 identidades; los motores detrás son detalles internos). Estándar (por defecto) construye un carril limpio y literal (subtítulo en el tercio inferior que lleva la mayor parte del texto) + un clímax incrustado compuesto dentro de la escena detrás del sujeto en el punto álgido. Cinematográfico es puramente incrustado — sin carril, 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 × FX frontal × reacción de placa, compuesta de registros (temas/README.md): ordnance terminal neonsign stardust stomp. La mayoría de los videos explicativos / voz en off son Estándar; la incrustación es el pico escaso y ganado — incrustar cada palabra es el error común; Tema es para preguntas de nivel VFX ("炸", "特效", "como hecho en AE").
Requisitos de ejecución
Las instalaciones de plugin usan la CLI empaquetada y con versiones fijas para enmascaramiento, transcripción y renderización; no se requiere clonación del código fuente. La vista previa local y las herramientas de medición de subtítulos también necesitan Sharp, Puppeteer (con su navegador Chromium) y GSAP. Instálalos en el proyecto de subtítulos, no dentro del plugin de solo lectura:
npm install --prefix <proyecto> --save-dev --save-exact [email protected] [email protected] [email protected]
Mantén el archivo de bloqueo del proyecto. Si estas dependencias ya existen, usa sus versiones bloqueadas en lugar de sobrescribirlas. Bash y FFmpeg/ffprobe deben estar en el PATH. El enmascaramiento y la transcripción pueden descargar sus propios modelos en el primer uso.
La renderización espera a que la CLI termine exitosamente antes de componer. El antiguo watchdog de shell HF_TIMEOUT_S ya no se usa: un archivo parcial grande no es prueba de que la renderización haya terminado. Un argumento de compilación explícita o HYPERFRAMES_ROOT selecciona la CLI del colaborador en lugar del plugin fijo. Cancela una renderización estancada normalmente a través de la CLI/terminal; el helper de subtítulos no fuerza el cierre ni recupera una renderización desde una instantánea del proceso.
Flujo operativo (resumen)
Enrutado a través de /hyperframes, la capa de intención confirma solo la entrada (qué clip) y anuncia la selección de identidad como una pregunta diferida — la lista corta necesita el clip analizado, por lo que se queda en el paso 1 a continuación; las preguntas de forma de ejecución de la capa no aplican (el metraje no está tocado, no hay guion gráfico que revisar). Un BRIEF.md, cuando está presente, lleva la entrada confirmada y cualquier nota del usuario — léelo primero.
El texto de oficio a continuación es largo; el pipeline en sí es corto — y todo lo determinista se calcula o compila, nunca se escribe a mano:
- Puerta de decisión (rechazar clips inadecuados) → elegir UNA identidad de CATALOG.md (35 identidades; motor/compilador derivado por búsqueda — nunca mostrar una pregunta de modo/categoría)
hyperframes init(saltarlo si el directorio del proyecto ya existe con el video dentro —matte.cjs/transcribe.cjsadoptan cualquier video en el directorio como source.mp4) →bash scripts/prepare.sh <proyecto>(enmascaramiento ∥ transcripción ∥ envolvente de audio en paralelo, luego zonas seguras v2 con paleta de escena/óptica/iluminación — un comando, nada olvidado)- autorizar un pequeño JSON de decisiones creativas (leer
safe-zones.jsonprimero): Cinematográfico →cinematic.json→make-cinematic.cjs(derivaplan.jsony lo compila); Tema →theme.json→make-theme.cjs(paradigmas de carril/panel/poema/toma de control;anchores el carril silencioso por defecto) - QA visual:
node scripts/preview-frames.cjs <proyecto>→ vistas previas de composición fieles en ~2s/fotograma (sin renderización). Consulta § QA visual antes de pagar por una renderización. render-and-composite.sh→ compuertas (tiempo + oclusión/heroico / desbordamiento / traspaso) →final.mp4
Reglas importantes que a menudo se pasan por alto:
- carril (por defecto) + incrustación (promoción).
drop(relleno, no se muestra) /rail(subtítulo literal en el tercio inferior, al frente, lleva la mayor parte del texto) /embed(una palabra clave compuesta detrás del sujeto). El modo Estándar hace ambas, incrustando solo los picos. Consulta § Modelo de subtítulos. - El video se entrega SIN TOCAR (Estándar/Cinematográfico; el presupuesto de PLACA del modo Tema es la única excepción sancionada — los beats de reacción registrados (carga-oscurecimiento, golpe, sacudida, grano) definidos por el ADN del tema y aplicados DESPUÉS de la composición mate para que sujeto+texto+placa se muevan como un solo fotograma) — los subtítulos son lo único que se añade; el mate solo permite que el sujeto ocluya la pista incrustada. Nunca graduar/recolocar/líneas de escaneo en el metraje.
- Dos libros de reglas: carril → referencias/rail.md (delgado), técnica de incrustación → referencias/composition-craft.md (rico, solo incrustación). Hojea según sea necesario.
Modelo de subtítulos — carril + incrustación
Cada frase hablada es una de tres cosas:
| Qué | Cómo se muestra | |
|---|---|---|
| drop | relleno — um/eh, tartamudeos, autocorrecciones | no se muestra |
| rail | el predeterminado — contenido hablado ordinario (literal) | subtítulo limpio en el tercio inferior, al frente, legible. Una palabra clave puede obtener un resaltado emphasis en línea (color de acento / palabra activa) — permanece en el carril. |
| embed | un pico promocionado — el beat principal | una palabra grande compuesta detrás del sujeto (oclusión mate), con entrada + salida diseñadas |
El carril lleva la mayor parte del texto; la incrustación es el pico escaso y ganado. La escasez es por beat/bloque, no por clip: ≤1 héroe por bloque (pensamiento), nunca dos co-visibles, ≥ un beat de espacio entre ventanas de héroe (el compilador advierte si es menos de 0.6s). Un clip corto → generalmente 1–2; un explicativo largo → ~uno por sección. Entre varios héroes, el más grande autorizado es el APEX (él solo obtiene la incrustación de bloqueo completa + 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 (al frente, movimiento amortiguado) — no cada beat necesita la exhibición mate, que es precisamente lo que mantiene el ápice como un evento. Incrustar cada palabra sigue siendo el error común.
Las identidades de superficie de carril construyen exactamente esto (carril = rail.html, incrustación = el clímax en index.html). Las identidades de flujo de columna eliminan el carril y hacen todo al estilo incrustación — recomiéndalas solo para solicitudes de ambiente sobre literalidad, nunca para explicativos / voz en off donde las palabras deben leerse (CATALOG.md lo codifica 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 (35 entradas: 10 clásicas + 25 temáticas); el motor, compilador y archivo de autoría se derivan por búsqueda de la fila del catálogo. Nunca mostrar "Estándar vs Cinematográfico vs Tema" como pregunta — esos son nombres internos (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 pares realmente cercanos (loud↔ordnance, neon↔neonsign, cream↔stardust).
La elección de identidad es una compuerta de preferencia (../hyperframes/references/brief-contract.md § 1): en modo autónomo ("sorpréndeme" / "decide por mí"), elige de tu lista corta tú mismo y explica el motivo en una línea en lugar de preguntar.
Procedimiento: analizar el clip → lista corta de 2–3 identidades del catálogo → recomendar UNA con un motivo de una línea → el usuario elige (modo autónomo: tú eliges, explicando el motivo) → 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 presenta tu recomendación y deja que el usuario elija antes de autorizar. No tomes una opción predeterminada en silencio.
(La tabla completa de identidades está en CATALOG.md — fuente única de verdad para el enrutamiento. La documentación del motor a continuación describe el contrato de autoría de cada backend.)
CATALOG.md es todo el espacio de respuestas aquí: este flujo de trabajo no busca en el registro de componentes de HyperFrames. Los flujos de trabajo de composición ejecutan npx hyperframes catalog antes de autorizar un look nombrado; este no debe hacerlo. Sus motores son compiladores bloqueados que consumen cinematic.json / theme.json y emiten la composición ellos mismos, por lo que un elemento del registro — los bloques caption-* incluidos — no tiene nada donde montarse. Un bloque de registro estiliza texto en un lienzo diseñado; esta habilidad graba subtítulos en el metraje de alguien a través de un mate. Cuando ninguna identidad se ajusta a la solicitud, dilo y elige la más cercana, en lugar de buscar fuera del catálogo.
Heurística de recomendación: usa las "Heurísticas de lista corta" en CATALOG.md — son a nivel de identidad (ej. "炸" lista corta ordnance/stomp/terminal/loud y elige POR LO QUE debería explotar), nunca a nivel de categoría. Si no estás seguro → anchor.
- Cinematográfico → escribir
cinematic.jsonpara una plantilla bloqueada, compilada pormake-cinematic.cjs. - Tema → leer temas/README.md, autorizar
theme.json, ejecutarscripts/render-theme.sh(compila + renderiza + reacción de placa → final_fx.mp4).
Puerta de decisión — EJECUTAR PRIMERO
Analiza el video y clasifica la escena antes de cualquier modo.
ffprobe <video.mp4> # especificaciones
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # al 20/50/80%
Lee las muestras. Rechaza si:
- Múltiples hablantes / cortes bruscos (divide y renderiza cada toma, o rechaza)
- Sin sujeto humano (esta habilidad es para cabezas parlantes)
- Menos de 3 segundos, sin habla, o la cara nunca es claramente visible —
transcribe.cjsadvierte cuando el audio es casi silencioso (Whisper alucina palabras como "Gracias." sobre el silencio); hazle caso y rechaza en lugar de subtitular palabras fabricadas - La fuente ya tiene subtítulos / gráficos de texto pesados grabados — agregar un segundo sistema de subtítulos causa conflicto y el metraje se entrega sin tocar (sin cubrir/inpintar). El texto grabado a menudo aparece solo a mitad del clip: muestra una hoja de contactos a 1 fps (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), no confíes en 3 fotogramas puntuales. - La transcripción es basura — el habla no nativa/con mucho acento puede transcribirse en galimatías confiado. Lee
transcript.jsonantes de autorizar; si no se interpreta como lenguaje, pruebaWHISPER_MODEL=mediumuna vez, si no, rechaza (un carril literal de palabras fabricadas es peor que ningún subtítulo). - Cámara en mano ocupada con movimiento rápido (el mate parpadea)
Sondas previas al vuelo (no cuestan nada, evitan los peores fallos)
- Sonda de corte de toma. Muestra fotogramas al 20%, 50%, 80%. Si aparece un sujeto/escena diferente, recorta el clip antes del corte.
- Sonda de letterbox / pillarbox. ¿Barras negras en el primer fotograma? Calcula el rectángulo de contenido seguro y limita la colocación de subtítulos dentro de él.
- Sonda de luminancia. Muestra la luminancia media de la región de subtítulos —
menos de 60→ el texto claro se lee tal cual,60-180→ añade el escudo de glifo,180+→ texto opaco + escudo (nunca texto claro desnudo). Las plantillas cinematográficas son crema+screeny BLOQUEADAS — usa esta sonda para elegir una identidad adecuada (escenas brillantes →ink, o el temaanchorde carril opaco), nunca para recolorear una. - Recomendación de identidad por tono (tú recomiendas; el usuario elige — ver Paso 0 + CATALOG.md). explicativo / entrevista / palabras deben leerse → identidades de superficie de carril/panel; poético / social / "cinematográfico" → 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 segura) — pero presenta una lista corta y deja que el usuario elija.
Pipeline — 5 pasos
1. hyperframes init <proyecto> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <proyecto> # enmascaramiento ∥ transcripción (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 más abajo según el modo
Cinematográfico: autorizar cinematic.json → node scripts/make-cinematic.cjs <proyecto>
Tema: autorizar theme.json → bash scripts/render-theme.sh <proyecto> (compila + renderiza + FX de placa)
4. node scripts/preview-frames.cjs <proyecto> # ~2s/fotograma vistas previas compuestas → § QA visual (ANTES de la renderización)
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 compilación + render-and-composite
+ _postfx.sh; el entregable es final_fx.mp4, final.mp4 es antes de la reacción de placa)
El paso 1 de init verifica las habilidades instaladas contra las últimas en GitHub y actualiza el conjunto global si alguna está desactualizada.
El paso 3 difiere según el modo:
Paso 3 — Modo Cinematográfico (puramente incrustado)
- Lee
safe-zones.jsonprimero. Los planos de narración van enzones.hugLeft/hugRight— franjas limpias PEGADAS a la silueta (el texto lejos del cuerpo se lee como flotante, no incrustado; las esquinas lejanas son el plan de respaldo, no el predeterminado). El héroe por defecto va enheroAnchor/heroBands.best(centrado EN el sujeto, ~30–55% ocluido).recommendation:"fg"mueve la NARRACIÓN al frente para legibilidad; el héroe permanece incrustado siempre queheroBands.feasible— héroe al frente es el último recurso. - **El ADN es la identidad que elegiste en el Paso 0
…