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:
| pregunta | opciones |
|---|---|
| ¿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:
- 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. - 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.pyrecorta solo entre palabras allí. - 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 elstyle.jsonde 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
| mensaje | haz |
|---|---|
no run of whole sentences lasts <lo>-<hi> s | pregunta 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-edit | la tabla "Si un script se detiene" de esa habilidad |
Reglas
- 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.
- Sin apariencias de IA:
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/ai-tells.mdse aplica a cada clip. - 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.
- 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, exceptoreframe(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.