Communitygithub.com

Conz-Wilts/ai-editor - Recortes

Convierte un video largo o podcast (archivo local o enlace de YouTube) en los 3-5 mejores clips verticales cortos, cada uno cortado y estilizado según el perfil del usuario. Transcribe una vez, divide la conversación en clips candidatos en límites de oraciones dentro de la duración elegida, puntúa cada candidato en código (velocidad del habla, volumen, risas, números y nombres mencionados), muestra la lista final en una página con vista previa de cada uno, y luego recorta, edita y aplica estilo a cada selección como una edición independiente.

¿Qué es ai-editor - Recortes?

Esta habilidad transforma un video largo o podcast en clips cortos optimizados para plataformas como TikTok, Reels o Shorts. El proceso comienza con la transcripción única del contenido completo, luego divide la conversación en oraciones y genera todos los candidatos posibles dentro de la duración elegida (por ejemplo, 20-40 segundos). Cada candidato se evalúa automáticamente midiendo características como la velocidad del habla, el volumen, la presencia de risas, números y nombres mencionados. La herramienta presenta una página interactiva con vistas previas de los mejores candidatos (hasta 8) y el usuario selecciona los que prefiere. Luego, cada clip seleccionado pasa por un proceso de recorte vertical, edición de estilo (aplicando la estética del perfil del usuario, incluyendo música, subtítulos y composición) y generación de una hoja de fotogramas para aprobación. Soporta archivos locales, enlaces de YouTube y podcasts (RSS o Apple Podcasts). Está diseñada para agentes como Claude Code, Cursor y Codex, y se ejecuta mediante scripts de Python que utilizan herramientas como Whisper/Scribe para transcripción, y ffmpeg para procesamiento de video. El costo es bajo: la transcripción se hace una vez, y la evaluación de candidatos es solo código y no consume tokens de LLM.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Conz-Wilts/ai-editor/tree/HEAD/.claude/skills/clips

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Clips

Rutas: ${CLAUDE_SKILL_DIR} significa la carpeta que contiene este SKILL.md, y ${CLAUDE_SKILL_DIR}/../.. la carpeta del editor (el .claude/ de este repositorio) dos niveles arriba.

Lee primero ${CLAUDE_SKILL_DIR}/../../PRINCIPLES.md: las reglas que sigue todo video (preguntar, verse real, movimiento, historia y encuadre, privacidad, costo).

Toda pregunta al usuario va en el cuadro de preguntas: usa la herramienta AskUserQuestion (2-4 opciones, la recomendada primero). Solo en un agente sin esa herramienta, haz preguntas numeradas en texto.

Un video largo de entrada. Los mejores pocos clips cortos de salida, cada uno una edición vertical terminada en el estilo del usuario.

clips/<nombre>/
  source.mp4          el video largo (un enlace simbólico para un archivo local; nunca modifiques el original)
  source.mp3, cover.jpg  en su lugar, para un podcast solo de audio: su audio y la carátula del programa
  words.raw.json      una transcripción de todo (nunca la leas)
  candidates.json     cada candidato con sus características (nunca lo leas)
  shortlist.md        los 8 mejores que no se superponen, alrededor de 1500 tokens: el único archivo que lees
  shortlist.json      lo mismo, para la página
  picks.html          la página de la que el usuario elige
edits/<nombre>-clip<N>/ una edición por clip elegido: source.mp4, words.raw.json (re-sincronizado), clip.json

Ejecuta los scripts con python3 en Mac y Linux, py en Windows. PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py"; python3 "$PY" a continuación ejecuta el Python del venv del editor (py "$PY" en Windows). Si falta, ejecuta primero la habilidad setup. K="${CLAUDE_SKILL_DIR}/scripts/clips.py", C="${CLAUDE_SKILL_DIR}/../../skills/cut/scripts", S="${CLAUDE_SKILL_DIR}/../../skills/style-edit/scripts".

0. Preguntar, una vez

Lee primero el perfil y el gusto (python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" show, python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show). Si no hay perfil: ejecuta primero la captura de estilo de la habilidad start, para que los clips salgan con el aspecto del usuario.

Luego una llamada al cuadro de preguntas, la opción recomendada primero:

preguntaopciones
¿Cuántos clips?3 (Recomendado) / 5 / 1
¿Qué duración debe tener cada uno?20-40 s (Recomendado) / 40-60 s / 60-90 s
¿Cuántas personas hablan?una (Recomendado) / dos (un podcast o entrevista)

Omite cualquier pregunta que el usuario ya haya respondido. Estas reemplazan la pregunta de la habilidad cut "cortar primero o todo a la vez": los clips se ejecutan de principio a fin, y el usuario aprueba las selecciones y las hojas de fotogramas.

1. El video

Un archivo local (un enlace físico en la misma unidad, si no un enlace simbólico, una copia solo como último recurso):

python3 "${CLAUDE_SKILL_DIR}/../../skills/clips/scripts/clips.py" link "<ruta absoluta>" clips/<nombre>

Un enlace:

python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/links.py" fetch "<url>" clips/<nombre> --max-height 1080

Usa el yt-dlp del venv (setup lo instala allí, no en el PATH), limita la descarga a 1080p (un clip de 1080x1920 no necesita 4K; una charla de 20 minutos en 4K son varios GB) e imprime la ruta del archivo: clips/<nombre>/source.mp4. Salida 3: el sitio solicita inicio de sesión (el "confirma que no eres un bot" de YouTube). Pregunta en el cuadro de preguntas antes de volver a ejecutar con --cookies-from-browser chrome (o su navegador). Un podcast (feed RSS o enlace de Apple Podcasts): route lista sus episodios más nuevos como opciones ask; pregunta cuál en el cuadro de preguntas (el más nuevo primero), luego fetch "<url de opción>" clips/<nombre de opción> --direct --cover "<imagen de opción>": el audio se guarda como source.mp3 (o su propia extensión) y la carátula del programa como cover.jpg. Solo descarga lo que el usuario tiene derecho a reutilizar: su propio video, o uno para el que tenga permiso. Dilo una vez si el enlace es de otra persona.

2. Transcribir una vez

python3 "$PY" "$C/transcribe.py" clips/<nombre>/source.mp4 clips/<nombre>/words.raw.json   # el archivo que imprimió fetch: source.mp3 para audio

Di el tiempo primero: Whisper tarda de 1 a 4 minutos por cada 3 minutos de video en un portátil (gratuito), Scribe alrededor de 20 s para un video de 13 minutos. Los mismos motores que la habilidad cut. Scribe agrega risas y otros eventos de audio, que la puntuación utiliza. Cada clip reutiliza esta transcripción: nada se transcribe dos veces.

3. Candidatos y lista final

python3 "$K" candidates clips/<nombre> --min 20 --max 40 [--speakers 2] [--style creator-teardowns/<handle>/style.json]

Pasa la duración que eligió el usuario. --style es el primer creador del perfil: los movimientos "qué funciona" medidos allí se listan en la lista final. El código divide la transcripción en oraciones y hace que cada secuencia de oraciones completas dentro de la duración sea un candidato (nunca comenzando con "Mm-hmm" ni terminando a media palabra), mide cada uno, los clasifica por las características y escribe shortlist.md.

Lee solo shortlist.md. Cada entrada tiene el gancho, las palabras iniciales de cada oración intermedia, la última oración y las características medidas. Evalúa cada entrada en cuatro preguntas: ¿el gancho funciona solo?, ¿puede un extraño seguirlo?, ¿tiene un desenlace?, ¿hay una afirmación, número o historia concreta?

Nunca leas words.raw.json ni candidates.json. Elige la cantidad de clips del usuario de la lista final, los mejores primero. Descarta, independientemente de la puntuación:

  • una lectura de anuncio, un segmento de patrocinio, una introducción o un cierre;
  • un gancho que se apoya en contexto anterior ("como dije", "por eso", "este");
  • un clip cuyo punto es una afirmación con fecha ("en el momento de grabar esto, es el número 40") cuando la afirmación ha cambiado desde entonces: una captura en vivo de la página de hoy la contradeciría.

4. La página de selección, luego el cuadro de preguntas

python3 "$K" page clips/<nombre> --recommend c12,c40,c7
open clips/<nombre>/picks.html    # Windows: start "" ..., Linux: xdg-open ...

Una página: cada clip de la lista final con una vista previa de 360 px, su transcripción (el gancho en negrita), el desglose de puntuación y las características medidas, tus selecciones marcadas. Luego pregunta en el cuadro de preguntas (selección múltiple): tus selecciones primero, cada una etiquetada con su tiempo y su gancho, más "uno diferente de la página". Espera la respuesta.

5. Cada clip elegido

python3 "$K" trim clips/<nombre> c12 c40 c7          # -> edits/<nombre>-clip1, -clip2, -clip3

Cada carpeta de edición recibe source.mp4 (preciso por fotograma, rellenado sin atrapar la siguiente palabra) y words.raw.json re-sincronizado con él. Una fuente solo de audio (source.mp3) no tiene imagen: trim crea el source.mp4 de cada clip con su audio sobre la carátula del podcast (la carátula difuminada y oscurecida para llenar 1080x1920, la carátula nítida sobre los subtítulos; sin carátula: negro), y clip.json dice audio_only. Con una carátula, el renderizado la mueve: un push lento sobre la carátula, el fondo deslizándose contra ella, un pequeño golpe en cada inicio de oración. Para esos, no preguntes por una disposición: superposición, reencuadre no, sin recorte, subtítulos activados (profile.py style los mantiene activados). Di una vez que cada clip es el audio sobre la carátula del programa con las palabras del hablante como subtítulos. Antes de ejecutar los clips, define la música una vez para todos (style-edit references/plan.md "Music"; el estilo decide a menos que el usuario haya configurado sound.music).

Todos los clips a la vez (Claude Code, o cualquier agente con subagentes): lanza un agente clip-editor (clip-editor) por clip, todos en un solo mensaje para que se ejecuten al mismo tiempo. Dale a cada uno EDIT (la carpeta del clip, absoluta), ROOT (${CLAUDE_SKILL_DIR}/../..), la línea PY, y las respuestas: aspecto, disposición, música, el motor de transcripción, y reencuadre sí (una fuente apaisada, a menos que la plataforma sea YouTube) o no, y si la fuente tiene subtítulos quemados. Cada uno lleva su clip a través del corte y la edición de estilo hasta la hoja de fotogramas y devuelve un JSON corto: status, cut_s, verify, cut_page, sheet, error. Combínalos; nunca abras la transcripción de un clip ni la edición de papel. Luego ejecuta el agente stills-critic en cada hoja de clips listos, de nuevo todos en un solo mensaje, y arregla lo que fallen (plan y fotogramas de nuevo para ese clip). Un clip failed: ejecútalo manualmente como se indica a continuación.

Uno a la vez (sin subagentes), para cada clip en orden:

  1. Vertical desde un video apaisado: python3 "$PY" "$K" reframe edits/<nombre>-clip<N> recorta a 9:16 con el recorte siguiendo la cabeza del hablante toma por toma (cortes de cámara encontrados con ffmpeg). Omítelo cuando el perfil de la plataforma sea YouTube o la fuente ya sea vertical.
  2. Corte: la habilidad cut desde su paso 2 (retakes.py propose): la transcripción ya está ahí. Luego construye, renderiza, verifica y la página de corte, como dice esa habilidad. La música bajo la voz se mide por archivo: build_timeline.py recorta solo entre palabras allí.
  3. Estilo: python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" style edits/<nombre>-clip<N>, luego la habilidad style-edit desde su paso 2. Si la fuente ya tiene subtítulos quemados, configura "captions": {"present": false} en el style.json de esa edición, o los subtítulos se apilan.

De cualquier manera, abre el cut-check.html de cada clip y muestra todas las hojas de fotogramas juntas para una aprobación, haz la pregunta de renderizado una vez para todos, y renderiza. Después de la aprobación, ejecuta python3 "${CLAUDE_SKILL_DIR}/../../skills/cut/scripts/judge_cut.py" score en cada carpeta de clip (cut references/judge.md). Entrega los renderizados en una página de revisión, cada clip una pestaña (start con el clip 1, alt para el resto, carpeta clips/<nombre>; consulta ${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/review.md), luego serve y wait en segundo plano.

Si un script se detiene

mensajehaz
no run of whole sentences lasts <lo>-<hi> spregunta en el cuadro de preguntas por una duración más amplia, ejecuta candidates de nuevo
no candidate <id>usa un id de shortlist.md
links.py fetch exit 3 (un inicio de sesión o "confirma que no eres un bot")pregunta antes de volver a ejecutar con --cookies-from-browser <navegador>
cualquier mensaje de cut o style-editla tabla "Si un script se detiene" de esa habilidad

Reglas

  1. Cada palabra, número y nombre en pantalla proviene de las propias palabras de ese clip. Nada del resto del video, y nada que el hablante no haya dicho.
  2. Sin apariencias de IA: ${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/ai-tells.md se aplica a cada clip.
  3. Un fotograma de primer plano de podcast no tiene espacio libre: ninguna tarjeta o logotipo va sobre la cabeza. Menos elementos visuales es correcto; los subtítulos y los zooms lo llevan.
  4. Nunca cortes un clip a media oración. Más corto o más largo de lo pedido es mejor que un pensamiento incompleto.

Costo por video largo

Medido en un podcast de dos personas de 13 minutos y un video de cabeza parlante de 12 minutos (2026-10):

  • Transcripción: Scribe tardó 16-18 s; Whisper es gratuito y más lento. Una vez por video largo.
  • Candidatos y características: 4-6 s de código, $0.
  • Claude lee shortlist.md (alrededor de 1500 tokens), nunca la transcripción (alrededor de 20 000).
  • La página de selección: 30-40 s de ffmpeg para 8 vistas previas, 7-9 MB.
  • Cada clip cuesta entonces lo que cuestan un corte y una edición de estilo.

Autocomprobación

python3 "$K" demo

Archivos

  • scripts/clips.py: candidates, page, trim, reframe y la demostración sin conexión (transcripción sintética). Solo stdlib, excepto reframe (OpenCV, a través del venv).
  • ${CLAUDE_SKILL_DIR}/../../agents/clip-editor.md: un clip a través del corte y la edición de estilo hasta su hoja de fotogramas.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Conz-Wilts/ai-editor

Reverse-engineers a short-form creator's video format from their real numbers. Pulls a TikTok or YouTube Shorts profile (or pasted links, Instagram reels too) with view, like and save counts, transcribes the top videos word for word, measures pace, pauses and fillers, maps each video into timed beats, and writes a teardown.md someone can film from, a teardown.html page of their graphics, motion and sound, and the style.json the style-edit skill edits from (on its own it can write an edit plan as a table and .srt). Use when the user wants to analyse, break down or study a creator ("analyse @handle", "tear down @handle", "teardown of @handle", "break down this creator", "what makes this creator's videos work"), pastes TikTok, YouTube or Instagram links and asks what the pattern is, or asks to set up creator-teardown. Not for editing the user's own video like a creator (that is start), not for researching a topic, and not for cutting raw footage.

Conz-Wilts/ai-editor

Cuts raw talking-head footage into a clean jump cut. Takes one take or several joined (mp4 or mov, any aspect, 4K phone footage is fine), transcribes it word by word, removes retakes, false starts, fillers and dead pauses, and renders cut.mp4 at the source resolution plus words.json timed to the cut. The user approves the cut on a page with the whole transcript and every removed word struck through. Use when the user says "cut my video", "just cut it", "remove my mistakes", "cut out the retakes", "remove the pauses", "clean up this take", "jump cut this", "tighten this clip", or asks only for the cut of a raw take; start calls it for a full edit. Runs before style-edit. Not for a general request to edit a video or to make it look like a creator (that is start), not for adding captions, zooms or cards (style-edit), and not for analysing someone else's videos (creator-teardown).

Conz-Wilts/ai-editor

Generates new footage with Higgsfield and puts it on the edit's timeline. Prices every generation first, asks the user with the dollar amount (and, for their own footage, whether it may be uploaded to Higgsfield), then submits, waits, downloads into the edit's generated/ folder and adds the result to the timeline's Generated track. Covers motion transfer on a clip of the user's video (their moves onto a character or styled look), b-roll from a sentence (text to video), a still brought to life (image to video) and stills for cards (text to image). Use when the user says "generate b-roll", "make a shot of", "AI b-roll", "generate a clip", "use Higgsfield", "motion transfer", "put my moves on", "restyle this part with AI", or asks for footage they did not film. Not for animated diagrams or motion graphics (motion), not for real screenshots and logos (overlays, logo-pack), and not for the cut (cut).

Conz-Wilts/ai-editor

For the editor's maintainers. Turns what users corrected into lasting fixes in this repo, for every user, enforced by code and tests rather than notes. Reads the suggestions users marked "would help everyone" (~/.ai-video-editor/suggestions.jsonl), taste rules said twice (taste.py report), preview corrections (edits/*/corrections.jsonl), review-page notes (*/review.json) and open GitHub issues labelled feedback; groups repeats; for each item the maintainer accepts, writes the general rule into PRINCIPLES.md and the skill that owns it, adds or tightens the check that enforces it, adds a test that fails before and passes after, and runs the full test set. Use when the maintainer says "improve the editor", "turn feedback into fixes", "process suggestions", "what are users complaining about", "go through the feedback issues". Not for one user's own preferences (that is taste), and not for editing a video.

Skills relacionados