/edición — Edición con gráficos en movimiento + XML para Premiere
Entrada: un video en bruto (o una carpeta con el video en bruto + material de apoyo: clips de Kling/IA, PNG, música, SFX).
Salida en la carpeta del video: <NOMBRE>_EDIT/ con <NOMBRE>_v1_premiere.xml, Assets/{MG,Subtitulos,SFX,Envato}, LEEME.md. No se renderiza una vista previa MP4 (el usuario lo solicitó expresamente para ganar velocidad): la revisión visual se realiza con las hojas de contacto del paso 5.
Dirígete al usuario en español rioplatense (con voseo). Avísale brevemente el progreso entre los pasos largos.
Rutas de trabajo: SK = la carpeta de esta habilidad, donde se encuentra este SKILL.md (Claude Code: ~/.claude/skills/edicion; Codex: ~/.codex/skills/edicion). Los scripts están en $SK/scripts, el motor en $SK/engine/engine.html, el catálogo en $SK/reference/escenas.md, y un ejemplo en $SK/reference/ejemplo_jobs.js.
El directorio de trabajo del proyecto es: <carpeta>/<NOMBRE>_EDIT/.work (persistente, permite hacer una v2 en otra sesión).
Ejecuta Python siempre con python3 -I (Windows: py -3 -I). Pasa las rutas con espacios entre comillas. Funciona en macOS y Windows: en PowerShell usa rutas con \, $env:VAR en lugar de VAR=... y los parámetros de los scripts (ej. --t=end-0.4) en lugar de variables de entorno.
0. Preparación
- Cronómetro: tan pronto como se conozca el nombre, crea el directorio de trabajo y ejecuta
python3 -I $SK/scripts/timing.py start "<work>". Los scripts anotan automáticamente cuánto tarda cada paso. - Dependencias: ejecuta
python3 -I $SK/scripts/doctor.py(Windows:py -3 -I $SK\scripts\doctor.py). Si algo aparece con ✗, ejecuta el comando que se indica (generalmente el instalador:bash $SK/scripts/install.shen Mac,powershell -ExecutionPolicy Bypass -File $SK\scripts\install.ps1en Windows) y vuelve a verificar. - Inventario de la carpeta: utiliza
ffprobepara cada video (duración, fps, rotación,nb_frames), el tamaño de los PNG y la duración de los audios. El video en bruto suele ser 1920×1080 con rotación 90 (= vertical 1080×1920, 30 fps). - Revisa el material de apoyo: ejecuta
ffmpeg -vf "fps=2,scale=150:-1,tile=10x2"→ mira la imagen. Identifica qué ilustra cada clip/foto (gancho, chiste, metáfora). Si hay escenas, detecta los cortes conscdet. - Observa un fotograma del video en bruto (color de la ropa → colores de los subtítulos, consulta escenas.md).
1. Transcripción
python3 -I $SK/scripts/transcribe.py "<crudo>" "<work>"
Esto generará una lista de frases con sus respectivos tiempos. Whisper alucina sobre ruido ("Gracias", "Gracias por ver el video", "Suscríbete al canal", "CC por…"): verifica esas zonas y cualquier duda con:
python3 -I $SK/scripts/check.py "<work>" 21.9-26.3 ...
(En general, el habla está alrededor de −5…−25 dB; el ruido alrededor de −48…−70 dB).
2. Decidir el guion (criterio editorial)
- Elimina frases repetidas, falsos arranques, tomas incompletas y tropiezos. Ante varias tomas de lo mismo, quédate con la última completa.
- Corrige el texto para los subtítulos (voseo: "querés", "tenés", "dejá"; "método IDEAS"; nombres propios).
- CTA: si grabó varias alternativas, usa por defecto "mandame un mensaje(ito)" (fue la elección explícita del usuario). Las demás se enumeran en el
LEEMEcon su código de tiempo del video en bruto. Si hay una lista de CTAs que no se repiten (opciones distintas, sin la misma introducción), se pueden dejar todas como OPCIÓN 01/02… En la respuesta final, indica cuál elegiste. - Escribe
<work>/segs.json: una lista de segmentos lógicos (cada uno = una idea que comparte un gráfico), cada uno con frases[a, b, "texto"]tomadas de las frases de transcribe/check.
3. Corte AJUSTADO (obligatorio)
python3 -I $SK/scripts/tighten.py "<work>"
Este script recorta cada frase según la energía real de la voz y corta las pausas internas ≥ 0,25 s (lecturas, miradas hacia los lados, respiraciones). El usuario solicitó explícitamente cortes sin silencios: no dejes pausas.
Crea <work>/config.json (ver más abajo) y ejecuta:
python3 -I $SK/scripts/edl.py "<work>"
Esto imprime la duración y los tiempos por segmento, y re-transcribe el corte: confirma que no falte ni sobre ninguna palabra. Si falta un inicio, revisa con check.py y ajusta segs.json.
{ "name": "SIGN_SPINNER", "version": 1, "fps": 30, "tail": 1.2,
"src": "/abs/crudo.mp4", "edit_dir": "/abs/carpeta/SIGN_SPINNER_EDIT",
"caption_colors": {"act":"var(--hot)","kwAct":"var(--lime)","kw":"#FFB08A"},
"keywords": ["pacientes","scroll","correctas"],
"broll": { "kl": {"path":"/abs/kling.mp4","frames":97,"rate":24,"w":1080,"h":1916},
"s1": {"path":"/abs/foto.png","still":true,"w":941,"h":1672} },
"music": {"path":"/abs/musica.wav"},
"face": {"top": 0.22},
"markers": [["HOOK",0],["CTA · Mandame un mensaje",17]] }
tail = segundos extra al final (cara a cámara) para que se lea el último gráfico.
face.top = altura (0–1) de la parte superior de la cabeza en el encuadre (míralo en el fotograma del paso 0.4): limita el zoom máximo para no cortarla. music lo completa envato.py use (o una ruta de la carpeta del video). Opcionales: sfx_max (máximo de SFX en toda la edición, por defecto 5), sound_design: "manual", max_zoom.
4. Diseñar los motion graphics → <work>/jobs.js
Basa tu trabajo en reference/ejemplo_jobs.js y reference/escenas.md. El estilo es fijo (al usuario le encantó, no lo cambies): tarjetas crema con texto destacado en mono y punto naranja, títulos Bricolage condensados en mayúsculas, resaltados naranja, ✓ en lima, pantallas completas con grano y transiciones en capas.
Reglas:
- Límites del usuario (obligatorios): 3 pantallas completas (
fs) y como máximo 3 motion graphics superpuestos (ov/ov2: tarjetas, listas, sellos, stickers…) en toda la edición. El resto lo constituyen los subtítulos, los reencuadres y el b-roll. Elige los 3 MG para las ideas que más se beneficien de ser vistas (una lista que se construye, un dato, el CTA), no para repetir lo que ya se dice. - Subtítulos vs. MG: los subtítulos están presentes todo el tiempo, pero desaparecen automáticamente mientras hay un MG (ov, ov2 o fs) para no competir; vuelven apenas el MG sale. No es necesario hacer nada: lo resuelve render.js. Por eso, cada MG debe contar por sí mismo lo que se dice en ese tramo, y conviene que no dure más que la idea (2–5 s).
- Sincroniza cada MG con la palabra que lo activa (
W(seg,'palabra')). - Pantallas completas (fs) que cubren la cara en los 3 puntos culminantes más fuertes, de 1 a 3 s, distribuidas. Fondos alternados (tinta/naranja/crema).
- Gancho fuerte en los primeros 2 s: texto grande arriba y, si hay un clip de apoyo divertido o visual, haz que entre en el gancho (con sticker, flecha o HUD) y la música fuerte.
- B-roll: primero el de la carpeta (clips de Kling/IA, fotos), donde ilustra lo que se dice (metáforas: ruedita de hámster, cartel, rayos X). Fotos fijas con Ken Burns
[100,112]. Además, 3 momentos de Envato (paso 4a). Sobre el b-roll, solo sticker/HUD/sello. - Audio extra de la carpeta del video (cámara, pasos, etc.) con
X(). - SFX: automáticos (paso 4b). No es necesario poner el último parámetro de
J()a menos que quieras cambiar el sonido. - Usa escenas nuevas cuando la metáfora lo requiera (agrégalas a engine.html siguiendo escenas.md). No reutilices textos fijos de otras escenas que no apliquen (ej.
hookdice MARKETING DESDE CERO). - Pista
ov2solo si una tarjeta debe ir encima de otra superposición (ej. tracker).
4a. B-roll semántico + música de Envato
El MCP de Envato solo busca (no descarga ni otorga licencias). envato.py lo llama por HTTP, por lo que funciona tanto en Claude como en Codex aunque el MCP no esté configurado.
- Elige 3 momentos del guion donde una imagen real suma: una situación concreta (paciente en consulta, alguien desplazándose), una metáfora visual o un dato que se entiende mejor al verlo. Distribuye los momentos (primer tercio, medio, antes del CTA), de 1,5 a 3,5 s cada uno, nunca durante una pantalla completa ni en el CTA final, y en tramos donde la tarjeta de ese momento pueda ser un sticker/HUD o no haya tarjeta.
- Busca (términos concretos en inglés, describiendo la imagen, no la palabra del guion):
python3 -I $SK/scripts/envato.py search "<work>" video "<términos>" --vertical [--sub Medical]. Si hay pocos resultados, repite sin--vertical(los horizontales se recortan al centro). Observa la hoja<work>/envato/<búsqueda>.jpg(fila n = candidato #n) y elige: auténtico (no pose de stock), sujeto centrado que entre en 9:16, luz y color parecidos al video en bruto, sin texto, que amplíe lo que se dice en lugar de repetirlo. - Usa:
python3 -I $SK/scripts/envato.py use "<work>" <clave> <búsqueda>#<n>(registra la vista previa enconfig.broll) y ubícalo en jobs.js conB('<clave>', seg_origen, inicio, dur). - Música:
python3 -I $SK/scripts/envato.py search "<work>" music "<estilo en inglés>" --mood <mood> --tempo "<tempo>" [--genre <género>](siempre instrumental). Elige por el tono del video y por el perfil de energía que transmite (uniforme, sin caídas largas; para videos enérgicosUpbeat (110-140 BPM), para videos cálidosMedium (90-110 BPM)), y usaenvato.py use "<work>" music <búsqueda>#<n>. Si el usuario dejó música en la carpeta, usa esa ("music": {"path": ...}). El volumen se configura automáticamente en el XML: fuerte en el gancho, baja bajo la voz y sube en el cierre (hook_gain0.3 ·bed_gain0.08 ·outro_gain0.22 ·offset= segundo de la canción donde comienza, para entrar en una parte con energía). - Licencia y descarga: mientras tanto, el XML utiliza las vistas previas con marca de agua (prefijo
PREVIEW_). Si el agente tiene un navegador con la sesión de Envato iniciada: muestra la lista (envato.py report "<work>") y pide confirmación una sola vez; después, en cada enlace: haz clic en Download → licencia para un proyecto con el nombre del video → descarga el original (video en la resolución vertical/HD más alta; música en WAV). Si no hay navegador o no hay sesión, proporciona al usuario la tabla de enlaces para que lo haga él. Luego ejecutapython3 -I $SK/scripts/envato.py collect "<work>"(busca en~/Downloads, descomprime, copia aAssets/Envatoy reemplaza las vistas previas) y vuelve a ejecutarbuild_xml.py. Nunca uses material de otros bancos ni omitas la búsqueda.
4b. Diseño de sonido (automático, con la biblioteca de la habilidad)
Todos los SFX residen en $SK/assets/sfx/<categoría>/<id>.wav, normalizados a −16 LUFS, y están descritos en catalog.json (duración, volumen por categoría y anchor = el golpe o inicio que cae justo en el evento). Para ver la lista completa: python3 -I $SK/scripts/sfx_import.py --list. Al generar el XML, se copian a Assets/SFX solo los que se utilizaron.
| Categoría | Cuándo |
|---|---|
whoosh | Entrada de pantallas completas, transiciones, cambios bruscos de tarjeta |
build | Antes de un corte o remate (reverse-whoosh; riser ≈ 6 s, solo por id para el remate más grande) |
pop | Aparición de tarjetas, stickers, elementos de lista |
click | Interfaces: búsqueda, DM, botón de seguir, marcar |
ding | ✓ check, acierto, idea, dato positivo |
error | ✗, tachar, mito, lo que está mal (game-over es una voz robótica: úsala con humor) |
hit | Remates, sellos, fs de impacto (bass-drop solo por id, máximo 1 por video) |
glitch · poof | Algo que falla, se rompe o desaparece |
zoom · bounce · wind | Acercamiento o lupa · rebote con humor · aparición mágica |
foley · splash · car | Literales: solo si lo que se dice o se ve coincide (escribir, cerrar, estirar, inodoro, agua, autos) |
Regla del usuario: como máximo 5 efectos en TODA la edición, elegidos con sutileza. Más que eso resulta brusco.
Automático (por defecto): se recopilan los momentos candidatos (entrada de cada gráfico y sus momentos internos: ✓ → ding, sello/remate → hit, buscador/DM/seguir → click, pantalla completa → whoosh, corte a b-roll → whoosh) y se seleccionan solo los 5 más importantes: remates y pantallas completas > el gancho > el CTA > el corte a b-roll > tarjetas > detalles internos, separados al menos ~6 s entre sí (≥ 3 s en videos cortos). Volúmenes bajos (aproximadamente −11 a −14 dB respecto de la voz). Las variantes se alternan.
Al revisar el plan, pregúntate en cada uno si aporta; si no, elimínalo (J(..., null)). Menos es mejor: 3 bien colocados valen más que 5.
Manual (anula el automático para ese gráfico; cuenta para el máximo de 5):
- Categoría o id puntual:
J(..., 'pop')·J(..., 'bass-drop')·J(..., null)= sin sonido. - Sonido suelto en un segundo de la línea de tiempo:
S('splash', W(4,'agua'))·S('car-pass-2', t, {gain:.25, dur:3}). Los literales (foley,splash,car) nunca son automáticos: colócalos conS()solo cuando aporten al chiste o la metáfora.node render.js --planlista todos los SFX (los automáticos marcados con(auto)). Para agregar nuevos sonidos:python3 -I $SK/scripts/sfx_import.py <archivo> --id <id> --cat <categoría> [--anchor peak|onset] [--max 4] --desc "..."(recorta, normaliza y lo registra).
4c. Reencuadres y zooms (automáticos según el discurso)
render.js decide la escala de cada clip de V1 y la escribe en framing.json; el XML la aplica con keyframes:
snap(zoom rápido 100→118 %) en el gancho ·punch(124 %) en las frases de énfasis: con!, con palabra clave en un clip corto, o bajo un sello/bigword (máximo uno cada 6 s) ·push(acercamiento lento) en preguntas y en el CTA ·tight(114 %) /wide(100→103 %) alternados para disimular los jump cuts (siempre ≥ 8 % de diferencia entre clips seguidos) · los clips cubiertos por fs o b-roll quedan enwide.- El zoom máximo se obtiene de
config.face.top(no corta la cabeza); por defecto 124 %. - Para forzar un encuadre:
F(seg, 'punch')oF.clip(i, 'wide')en jobs.js.
5. Dirección creativa, prueba y render
node $SK/scripts/render.js "<work>" --plan(lista los gráficos, SFX y encuadres con sus tiempos; detecta palabras no encontradas).- Dirección creativa:
node $SK/scripts/director.js "<work>"→ informe (direction.md) + línea de tiempo (timeline.png, mírala). Revisa que nada compita: más de 3 MG o de 3 pantallas completas, subtítulos visibles debajo de un MG, dos tarjetas a la vez, tarjetas tapando el b-roll, b-roll detrás de un MG que lo tapa, SFX en momentos sin MG
...
[truncado para la traducción]
6. Generar el XML para Premiere
Ejecuta python3 -I $SK/scripts/build_xml.py "<work>" para generar el archivo XML. Este script:
- Construye la línea de tiempo en el formato XML de Premiere Pro.
- Enlaza los archivos de video, audio, gráficos y SFX desde la carpeta de activos.
- Aplica los keyframes de reencuadre y zoom según
framing.json. - Establece los niveles de volumen para la música y los SFX.
- Incluye marcadores para los momentos clave (gancho, CTA, etc.).
- Copia los activos utilizados a
Assets/dentro de la carpeta de edición. - Escribe un resumen de la edición en
LEEME.md, que incluye la duración total, el número de cortes, los MG y SFX utilizados, y las observaciones de la dirección creativa. - Finalmente, ejecuta
python3 -I $SK/scripts/timing.py stop "<work>"para detener el cronómetro y registrar el tiempo total de procesamiento.
El archivo XML se puede importar directamente en Adobe Premiere Pro. Todos los recursos están enlazados, por lo que la línea de tiempo debería estar lista para la revisión y exportación final. No se requiere renderizado previo.
Resumen del flujo de trabajo
- Preparación: Verificar dependencias, inventariar archivos, revisar material de apoyo.
- Transcripción: Transcribir el video en bruto y verificar zonas problemáticas.
- Guion: Seleccionar las tomas, corregir el texto y definir los segmentos.
- Corte ajustado: Eliminar pausas y silencios, generar la línea de tiempo base.
- Motion graphics: Diseñar los gráficos, sincronizarlos con el discurso, respetando los límites.
- B-roll y música: Buscar y seleccionar material de Envato, integrarlo en la edición.
- Diseño de sonido: Aplicar efectos automáticos o manuales, respetando el límite de 5.
- Reencuadres y zooms: Ajustar automáticamente según el discurso.
- Dirección creativa: Revisar el plan, generar el informe y la línea de tiempo visual.
- Generación del XML: Producir el archivo para Premiere y el informe de edición.
Notas adicionales
- El usuario es un médico (Gus Pascaner). Utiliza un tono profesional pero cercano en español rioplatense.
- Prioriza la velocidad sobre la perfección visual (sin renderizado previo).
- El estilo visual es moderno y limpio, con énfasis en la claridad del mensaje.
- Respeta estrictamente los límites de 3 pantallas completas, 3 superposiciones y 5 efectos de sonido.
- Los archivos de la habilidad se actualizan periódicamente; verifica las versiones en
$SK/engine/engine.htmly las referencias.
[Fin del documento]