freecut
Principio
- El LLM razona a partir de la transcripción bruta + elementos visuales bajo demanda. El único artefacto derivado que merece la pena mantener es una transcripción a nivel de frase empaquetada (
takes_packed.md). Todo lo demás — etiquetado de relleno, detección de tomas repetidas, clasificación de planos, puntuación de énfasis — se deriva en el momento de la decisión. - El audio es primario, los visuales siguen. Los candidatos a corte provienen de los límites del habla y de los silencios. Profundiza en los visuales solo en los puntos de decisión.
- Preguntar → confirmar → ejecutar → iterar → persistir. Nunca toques el corte hasta que el usuario haya confirmado la estrategia en lenguaje sencillo.
- Generalizar. No asumas qué tipo de vídeo es. Observa el material, pregunta al usuario, luego edita.
- La libertad artística es el valor por defecto. Cada valor específico, ajuste preestablecido, fuente, color, duración, estructura de tono y técnica en este documento es un ejemplo práctico de un vídeo probado, no un mandato. Léelos para entender qué es posible y por qué funcionó cada uno. Luego toma tus propias decisiones de gusto basándote en lo que el material realmente es y en lo que el usuario realmente quiere. Las únicas cosas que DEBES hacer están en la sección de Reglas Estrictas a continuación. Todo lo demás es tuyo.
- Inventa libremente. Si el material requiere una técnica no descrita aquí — pantalla dividida, imagen en imagen, tarjetas de identidad en tercio inferior, cortes de reacción, rampas de velocidad, fotogramas congelados, encadenados, cortes de coincidencia, L-cuts, J-cuts, rampas de velocidad sobre la respiración, lo que sea — constrúyelo. Los ayudantes son ffmpeg y PIL. Pueden hacer cualquier cosa que el formato soporte. No esperes permiso.
- Verifica tu propia salida antes de mostrársela al usuario. Si no lo enviarías, no lo presentes.
Reglas Estrictas (corrección de producción — no negociable)
Estas son las cosas en las que la desviación produce fallos silenciosos o salidas rotas. No son cuestión de gusto, son corrección. Memorízalas.
- Los subtítulos se aplican AL FINAL en la cadena de filtros, después de cada superposición. De lo contrario, las superposiciones ocultan los subtítulos. Falla silencioso.
- Extraer por segmentos → concatenación con
-c copysin pérdida, no un solo filtergraph de una pasada. De lo contrario, se re-codifica cada segmento dos veces cuando se añaden superposiciones. - Fundidos de audio de 30ms en cada límite de segmento (
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). De lo contrario, se producen clics audibles en cada corte. - Las superposiciones usan
setpts=PTS-STARTPTS+T/TBpara desplazar el fotograma 0 de la superposición al inicio de su ventana. De lo contrario, se ve la mitad de la animación durante la ventana de superposición. - El SRT maestro usa desplazamientos de la línea de tiempo de salida:
output_time = word.start - segment_start + segment_offset. De lo contrario, los subtítulos se desalinean después de la concatenación de segmentos. - Nunca cortes dentro de una palabra. Ajusta cada borde de corte a un límite de palabra de la transcripción.
- Rellena cada borde de corte. Ventana de trabajo: 30–200ms. Las marcas de tiempo del ASR se desvían 50–100ms — el relleno absorbe la desviación. Más ajustado para ritmo rápido, más suelto para cinematográfico.
- Solo ASR palabra por palabra sin modificaciones. Nunca modo SRT/frase (pierde datos de espacio sub-segundo). Nunca rellenos normalizados (pierde señal editorial).
- Almacena en caché las transcripciones por fuente. Nunca vuelvas a transcribir a menos que el archivo fuente en sí haya cambiado.
- Subagentes paralelos para múltiples animaciones. Nunca secuenciales. Genera N a la vez a través de la herramienta
Agent; el tiempo total de pared ≈ el más lento. - Confirmación de la estrategia antes de la ejecución. Nunca toques el corte hasta que el usuario haya aprobado el plan en lenguaje sencillo.
- Todas las salidas de la sesión en
<videos_dir>/edit/. Nunca escribas dentro del directorio del proyectofreecut/.
Todo lo demás en este documento es un ejemplo práctico. Desvía siempre que el material lo requiera.
Diseño de directorios
La skill reside en freecut/. El metraje del usuario está donde sea que lo pongan. Todas las salidas de la sesión van a <videos_dir>/edit/.
<videos_dir>/
├── <archivos fuente, sin modificar>
└── edit/
├── project.md ← memoria; se añade en cada sesión
├── takes_packed.md ← transcripciones a nivel de frase, la vista de lectura principal del LLM
├── edl.json ← decisiones de corte
├── transcripts/<nombre>.json ← JSON de ASR normalizado en caché
├── animations/slot_<id>/ ← fuente + render + razonamiento por animación
├── clips_graded/ ← extractos por segmento con etalonaje + fundidos
├── master.srt ← subtítulos de la línea de tiempo de salida
├── downloads/ ← salidas de yt-dlp
├── verify/ ← fotogramas de depuración / PNGs de línea de tiempo
├── preview.mp4
└── final.mp4
Configuración
La instalación inicial está en install.md (clonar, dependencias, ffmpeg, registro de la skill, clave API). No lo ejecutes de nuevo en cada sesión; en un arranque en frío solo verifica:
- El backend de transcripción está disponible. El predeterminado es
whisper(gratuito, local) — verifica quemlx-whisper(Apple Silicon) ofaster-whisperse pueden importar. Si ninguno está instalado, dile al usuario quepip install mlx-whisper(ofaster-whisper) en lugar de recurrir silenciosamente a un backend de pago. Para los backends opcionalesvibevoice/elevenlabs, verificaVIBEVOICE_ASR_URL/ELEVENLABS_API_KEYen el entorno o en.enven la raíz del repositorio de freecut. ffmpeg+ffprobeen PATH.- Dependencias de Python instaladas (
uv syncopip install -e .dentro del repositorio). - Node.js + npm disponibles si la sesión necesita HyperFrames o slots de Remotion. HyperFrames actualmente requiere Node.js 22+.
yt-dlp, HyperFrames, Remotion, Manim instalados solo en el primer uso.- La configuración de animación en el primer uso ocurre dentro del directorio del slot, nunca en la raíz del repositorio de freecut. HyperFrames se puede invocar con
npx --yes hyperframes ...; Remotion se puede preparar connpx create-video@latesto instalar como dependencia local del proyecto antes de usar su comandoremotion render. - Esta skill distribuye
skills/manim-video/. Lee su SKILL.md cuando construyas un slot de Manim.
Los ayudantes (helpers/transcribe.py, helpers/render.py, etc.) residen junto a este SKILL.md. Resuelve sus rutas relativas al directorio que contiene este archivo — la skill normalmente está enlazada simbólicamente en ~/.claude/skills/freecut/ o ~/.codex/skills/freecut/.
Ayudantes
transcribe.py <video>— transcripción de un solo archivo. Backend conectable mediante--backend {whisper,vibevoice,elevenlabs}(predeterminadowhisper, local + gratuito, un solo orador).vibevoiceusaVIBEVOICE_ASR_URLpara diarización en tiempo real;elevenlabsusaELEVENLABS_API_KEYy soporta--num-speakers. Almacenado en caché.transcribe_batch.py <videos_dir>— transcripción paralela con 4 trabajadores. Misma bandera--backend. Úsalo para múltiples tomas.pack_transcripts.py --edit-dir <dir>—transcripts/*.json→takes_packed.md(nivel de frase, se rompe en silencios ≥ 0.5s o cambio de orador). Funciona de manera idéntica en todos los backends porque la forma del JSON está normalizada.timeline_view.py <video> <start> <end>— tira de fotogramas + PNG de forma de onda. Profundización visual bajo demanda. No es una herramienta de escaneo — úsala en puntos de decisión, no constantemente.render.py <edl.json> -o <out>— extraer por segmento → concatenar → superposiciones (desplazadas por PTS) → subtítulos AL FINAL.--previewpara 720p rápido.--build-subtitlespara generar master.srt en línea.grade.py <in> -o <out>— cadena de filtros ffmpeg para etalonaje. Ajustes preestablecidos +--filter '<raw>'para personalizado.
Para animaciones, crea <edit>/animations/slot_<id>/ con Bash y genera un subagente a través de la herramienta Agent.
El proceso
-
Inventario.
ffprobede cada fuente.transcribe_batch.pyen el directorio.pack_transcripts.pypara producirtakes_packed.md. Muestrea una o dostimeline_views para una primera impresión visual. -
Pre-detección de problemas. Una pasada sobre
takes_packed.mdpara anotar deslices verbales, errores obvios al hablar o frases a evitar. Lista simple, alimenta el resumen del editor. -
Conversar. Describe lo que ves en lenguaje sencillo. Haz preguntas formadas por el material. Recopila: tipo de contenido, duración/aspecto objetivo, dirección estética/de marca, sensación de ritmo, momentos que deben conservarse, momentos que deben cortarse, preferencias de animación y etalonaje, necesidades de subtítulos. No uses una lista de verificación fija — las preguntas correctas son diferentes cada vez.
-
Proponer estrategia. 4–8 frases: forma, elección de tomas, dirección del corte, plan de animación, dirección del etalonaje, estilo de subtítulos, estimación de duración. Espera la confirmación.
-
Ejecutar. Produce
edl.jsona través del resumen del subagente editor. Profundiza entimeline_viewen momentos ambiguos. Construye animaciones en subagentes paralelos. Aplica etalonaje por segmento. Compón medianterender.py. -
Vista previa.
render.py --preview. -
Auto-evaluación (antes de mostrar al usuario). Ejecuta
timeline_viewsobre la salida renderizada (no las fuentes) en cada límite de corte (ventana ±1.5s). Comprueba cada imagen para:- Discontinuidad visual / destello / salto en el corte
- Pico en la forma de onda en el límite (clic de audio que pasó el fundido de 30ms)
- Subtítulo oculto detrás de una superposición (violación de la Regla 1)
- Superposición desalineada o mostrando fotogramas incorrectos (violación de la Regla 4)
También muestrea: primeros 2s, últimos 2s y 2–3 puntos intermedios — comprueba consistencia del etalonaje, legibilidad de subtítulos, coherencia general. Ejecuta
ffprobesobre la salida para verificar que la duración coincide con la expectativa del EDL.Si algo falla: corrige → re-renderiza → re-evalúa. Límite de 3 pasadas de auto-evaluación — si los problemas persisten después de 3, indícalos al usuario en lugar de repetir infinitamente. Solo presenta la vista previa una vez que la auto-evaluación haya sido exitosa.
-
Iterar + persistir. Comentarios en lenguaje natural, re-planificar, re-renderizar. Nunca vuelvas a transcribir. Render final tras confirmación. Anexa a
project.md.
Técnicas de corte
- Audio primero. Cortes candidatos a partir de límites de palabra y silencios.
- Conserva los picos. Risas, remates, tiempos de énfasis. Extiende más allá de los remates para incluir reacciones — la risa ES el compás.
- Los intercambios de oradores se benefician de aire entre las expresiones. Valores comunes: 400–600ms. Menos para ritmo rápido, más para cinematográfico. Decisión de gusto.
- Eventos de audio como señales.
(risas),(suspiros),(aplausos)marcan los compases. Extiende más allá. - Los silencios son candidatos a corte. Los silencios ≥400ms suelen ser los más limpios. Los límites de frase de 150–400ms son utilizables con una verificación visual. <150ms es inseguro (mitad de frase).
- Ejemplo de relleno de corte (el vídeo de lanzamiento distribuido con esto): 50ms antes de la primera palabra mantenida, 80ms después de la última. Más ajustado para energía de montaje, más suelto para documental. Mantente en la ventana de trabajo de 30–200ms (Regla Estricta 7).
- Nunca razones audio y vídeo de forma independiente. Cada corte debe funcionar en ambas pistas.
La transcripción empaquetada (vista de lectura principal)
pack_transcripts.py lee todos los transcripts/*.json y produce un archivo markdown donde cada toma es una lista de líneas a nivel de frase, cada una con su rango de tiempo [inicio-fin] como prefijo. Las frases se rompen en cualquier silencio ≥ 0.5s O cambio de orador. Este es el artefacto que el subagente editor lee para elegir cortes — proporciona precisión de límite de palabra a partir del texto solo con 1/10 de los tokens del JSON bruto.
Ejemplo de línea:
## C0103 (duración: 43.0s, 8 frases)
[002.52-005.36] S0 El noventa por ciento de lo que hace un agente web se desperdicia por completo.
[006.08-006.74] S0 Solucionamos esto.
Resumen del subagente editor (para selección de múltiples tomas)
Cuando la tarea es