Editor de video
Convierte una carpeta de clips en un video corto terminado. El agente es el editor: decide la historia y escribe un plan de edición, y los scripts hacen las partes mecánicas con exactitud, para que los cortes caigan en el ritmo, nada se repita por accidente y nada quede con letterboxing.
Lee primero LOCAL.md si existe: contiene el Python de esta máquina, el archivo de marca y las carpetas de medios. El propietario, las fuentes de la marca, los logotipos y la apariencia predeterminada residen en un archivo de marca (~/.video-editor/brand.json, consulta references/brand.md), nunca en los scripts.
Los clips individuales que solo necesitan recorte o un simple corte, los subtítulos en un solo clip y la publicación pertenecen a la skill social de la instalación (para XNP: xnp-social). Esta skill crea la edición; esa skill la revisa, subtitula, planifica y publica.
No hay lista de tipos de video
Cada solicitud es una mezcla. No busques una plantilla que coincida. En su lugar, decide cuatro cosas a partir del brief, por sección si el video cambia de carácter a mitad de camino:
- La columna vertebral: qué impulsa el tiempo.
Música: los cortes caen en compases y tiempos, las tomas se eligen por energía, el drop es el punto culminante (
lenen"2bar","1beat"). Voz: las palabras marcan la duración, la imagen corta al final de las frases, la música baja bajo la voz (audio_dben la toma hablada, duraciones en segundos). Historia o cronología: llegada, desarrollo, momento, resplandor final; corta por acción y cambios de lugar, la música es un fondo. Un híbrido cambia de columna vertebral por sección: un saludo de 6 segundos con voz, luego imágenes de concierto al ritmo; o una historia de viaje con cronología y un montaje al ritmo en el concierto. - Destino y diseño. A dónde va (Reel, Story, carrusel, feed, TikTok, Shorts, YouTube) y cómo usar ese espacio: a pantalla completa, un cuadrado enmarcado o imagen 4:5 sobre un fondo diseñado, o ambos alternando por toma. Elige basándote en el material y el propósito, no por costumbre; un momento panorámico que un recorte 9:16 arruinaría puede querer un Reel enmarcado, un carrusel o un resumen 16:9. Lee references/formats.md para saber qué hace cada plataforma con la imagen y cuándo encaja cada diseño. La duración sigue al destino y al material.
- Imprescindibles. Personas nombradas que deben aparecer y ser reconocibles, un logotipo, una fecha, un agradecimiento, un momento específico, una línea de título. Pregunta solo si el brief realmente deja algo abierto.
- Capas de sonido. Solo música; música más público o ambiente que asoma; voz con música de fondo; solo voz. La voz lleva subtítulos (ver Subtítulos más abajo).
Luego escribe el plan, con "destination" configurado para que el lienzo, el área segura y el límite de duración se ajusten. references/examples.md muestra cuatro briefs resueltos (reel de afterparty, saludo, saludo con imágenes de concierto, historia de viaje) como razonamiento, no como tipos a copiar. references/craft.md contiene las reglas de edición que se aplican a todos ellos.
Flujo de trabajo
Los scripts están en scripts/; ejecútalos con el Python de LOCAL.md, PYTHONUTF8=1 PYTHONIOENCODING=utf-8, FFmpeg y ffprobe en PATH. Trabaja en una carpeta de proyecto fuera de la skill (src/, audio/, log/, proxy/, out/, review/, edit.json).
- Brief. Quién y qué hay en el material, cómo reconocer a cada persona, el evento, el propósito, las cuatro decisiones anteriores. Escríbelo en
brief.txt; Gemini lo lee. - Registra el material.
gemini.py log WORKDIR src/*.mp4 --context brief.txt --ratio 9:16escribelog/NOMBRE.jsonpor clip: momentos con quién está dónde (x como fracción para recortar), acción, emoción, energía, sonido, habla, calidad, si una ventana 9:16 contiene a los sujetos, el mejor centro de recorte y un uso (apertura, clímax, reacción...). Aproximadamente un céntimo de dólar por clip. Los registros son pistas: confirma rostros, centros de recorte y "mejores momentos" en fotogramas antes de construir sobre ellos. - Observa.
sheet.pyhace hojas de contacto etiquetadas en una sola ejecución de FFmpeg:--every 2a través de un clip,--times, comparación de candidatos cona.mp4@3 [email protected],--crop 9:16 --cx 0.4para ver una fuente tal como se encuadrará,--grid 10para planificar recortes. Lee la imagen tú mismo; nunca le pidas al propietario que mire. - Planifica. Escribe
edit.json(references/edit-format.md). Cada toma nombra un momento diferente; dale a cada una una nota que explique por qué está ahí. - Verifica.
validate.py edit.json(render.py también lo ejecuta y se niega si hay errores). Errores: el mismo material usado dos veces, una fuente demasiado corta, movimiento desconocido,fitencuadrado sin permiso, texto en las zonas de la interfaz de la plataforma, archivos faltantes, música demasiado corta. Advertencias: tomas del mismo clip con menos de 2s de diferencia, tomas similares, cortes fuera del ritmo, bordes negros dentro de la fuente encuadrada, logotipos cerca de las zonas de la interfaz. Lee cada advertencia y decide; no la silencies sin más. - Exportación de borrador.
render.py edit.json --out out/v1-draft.mp4 --draft(mitad de tamaño, rápido). Luegosheet.py out/v1-draft.mp4 --plan edit.json --out review/v1.pngmuestra el inicio, el medio y el final de cada toma: verifica el encuadre, las cabezas, la colocación del texto y que cada toma sea lo que dice la nota. - Exportación completa.
render.py edit.json --out out/v1.mp4. Ajuste lento, unos 5 minutos para 30 segundos de fuentes 4K; render.py luego verifica tamaño, duración, sonido, barras negras por toma, fotogramas negros y elmax_mbdel plan. - Crítica.
gemini.py review out/v1.mp4 --context brief.txt --plan edit.json --out review/v1.json(menos de un céntimo). Trata cada nota como una afirmación: verifícala contra fotogramas o el plan antes de cambiar algo. Ha llamado "inseguro" a texto correcto y "error tipográfico" a una fecha correcta. Sus aciertos reales fueron tomas de aspecto repetido, una mano bloqueando un gesto clave, un teléfono en el encuadre, un destello que parecía un fallo. - Itera con nuevos números de versión; nunca sobrescribas un archivo entregado. Mantén
edit.jsonpor versión (copia aedit-v2.json) para que cualquier versión pueda reexportarse. - Entrega como indique LOCAL.md, describe qué hay en la edición con palabras (toma por toma, qué dice el texto, dónde alcanza su punto máximo la música), y entrega el archivo a la skill social para revisión, subtítulos y publicación. La publicación siempre necesita la aprobación explícita del propietario.
Subtítulos
Los subtítulos de voz son trabajo de la skill social: exporta primero la edición, luego ejecuta su helper de subtítulos (para XNP: xnp-social/scripts/captions.py transcribe sobre la exportación terminada, para que los tiempos de las palabras coincidan con la edición), sigue su paso de aprobación obligatorio, luego quema. Si ya existe un .srt o .ass aprobado para la línea de tiempo final, el captions.file del plan lo quema durante la exportación.
Límites honestos
La verificación de similitud es un hash de imagen más color medio: detecta el mismo momento dos veces, no "la misma persona desde el mismo ángulo" en momentos diferentes. Esa verificación semántica proviene de los registros y la revisión de Gemini y de leer la hoja de contacto. No hay detección automática de ritmo: proporciona el BPM y un punto de inicio en un tiempo fuerte (music.start), luego la cuadrícula es exacta. No hay seguimiento facial: las panorámicas y los centros de recorte provienen de los registros y las hojas. Los códigos de tiempo de Gemini pueden desviarse en clips largos; los proxies llevan un código de tiempo quemado para mantenerlos honestos, y log advierte cuando los momentos sobrepasan el clip.
Archivos
scripts/common.py cargador de plan, matemáticas de tiempo, sonda, marca, gradaciones. scripts/render.py el exportador en una sola pasada. scripts/validate.py el verificador. scripts/sheet.py hojas de contacto. scripts/gemini.py registro y revisión. Referencias: formats.md, edit-format.md, craft.md, examples.md, brand.md.