Communitygithub.com

shaycart/yap-video-skill

Edita material de talking-head / 'yap' en bruto para convertirlo en vídeos cortos y ágiles (9:16 para Reels/TikTok/Shorts o 16:9). Cortes por saltos basados en transcripción, eliminación de muletillas y tartamudeos, zooms con detección facial, subtítulos animados palabra por palabra, diseño de sonido, masterización de volumen, control de calidad y copia para publicación. Úsalo cuando el usuario proporcione material de talking-head, un yap, un rant, un clip de pódcast o una divagación larga y quiera editarlo, recortarlo, subtitularlo o convertirlo en cortos. También para 'haz que esto sea épico', 'edita este vídeo', 'subtitula esto', 'corta el silencio'.

¿Qué es yap-video-skill?

Este skill convierte grabaciones de una persona hablando a cámara ('talking-head' o 'yap') en vídeos cortos y profesionales para plataformas como Instagram Reels, TikTok y YouTube Shorts. Todo se ejecuta localmente usando ffmpeg y Whisper, sin necesidad de API key (aunque ofrece ElevenLabs Scribe como transcripción opcional mejorada). El skill sigue un pipeline completo: ingestión y análisis del material, transcripción palabra por palabra, selección de la historia mediante puntuación de segmentos, corte ajustado con perfiles de tensión (desde suave hasta apretado), zooms con seguimiento facial, subtítulos animados palabra por palabra con múltiples estilos visuales, diseño de sonido con efectos y música, y masterización de audio. Incluye reglas estrictas como no sobrescribir archivos fuente, verificar cada unión de corte, y ofrecer un plan textual antes de renderizar. Soporta todos los formatos de salida comunes y está optimizado para workflow de creadores de contenido.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shaycart/yap-video-skill/tree/HEAD/skills/yap-video

Preguntar en tu IA favorita

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

Documentación

Editor de Vídeo Yap

Convierte material de talking-head en bruto en un corto ajustado y diseñado. Todo se ejecuta localmente con ffmpeg + Whisper local; no se requiere clave API (ElevenLabs Scribe es un transcriptor opcional mejorado).

Sintetizado a partir de una lectura revisada por seguridad de: browser-use/video-use, adukhan98/video-edit, chrislema/videoeditor, zyziyun/video-studio, eyadhussain00-hub/Videoediting (solo ideas), AgriciDaniel/claude-shorts, Barty-Bart/motion-graphics, ZiadAbdelkarim/beat-synced-edit, 6missedcalls/video-editing-skill, haidrrrry/claude-remotion-skill, digitalsamba/claude-code-video-toolkit, blixvip/easyedit (solo ideas).

Los números exactos están en references/params.md. Léelo antes de construir filtergraphs. references/pipeline.md es el patrón de implementación probado en batalla de ediciones reales (planificador de cortes, renderizador de L-cut, superposición de tipo Pillow, pegatinas/accesorios, máster 4K): síguelo en lugar de reinventarlo.

Reglas estrictas

  1. Primero planifica, luego espera. Después de transcribir, muestra un plan en texto plano (gancho, qué se corta, enfoque de zoom/subtítulos/SFX, duración, formato) y obtén un sí antes de renderizar. Las decisiones de gusto (línea de gancho, qué frases se quedan, estilo de subtítulos) se ofrecen como un menú corto con una recomendación, nunca se eligen en silencio.
  2. Nunca sobrescribas la fuente. Escribe en <carpeta>/edit/. Mantén los archivos intermedios hasta que el usuario apruebe, luego ofrece limpiar (lista archivos + tamaños primero; nunca autoeliminar).
  3. Nunca cortes dentro de una palabra. Encuentra los bordes a partir de la envolvente de audio, no de los tiempos de palabra de Whisper (Whisper marca los inicios tarde y los finales temprano, lo que recorta la primera/última sílaba): retrocede desde el inicio de la palabra hasta 0.25 s y avanza desde el final de la palabra hasta 0.20 s mientras la energía del habla se mantenga por encima del suelo + 8 dB, luego añade 30 ms. Fundido de audio de 15-30 ms en cada unión.
  4. Vuelve a codificar los cortes, nunca uses -c copy para nada que requiera precisión de fotograma (copy aterriza en keyframes y produce fallos).
  5. Los subtítulos van al final, después de los zooms y superposiciones, para que los zooms nunca los recorten.
  6. Demuéstralo. Renderiza, luego inspecciona: fotogramas en cada corte +/-1.5 s, hoja de contactos, lectura de sonoridad ebur128. Máximo 3 pasadas de corrección, luego informa lo que queda. Reporta números; no puedes oír el audio.
  7. Contenido de terceros: solo propiedad del usuario, CC0/CC-BY o generado. No descargues películas/música de YouTube. Nunca leas, envíes ni reutilices tokens de inicio de sesión de Claude/Anthropic ni otras credenciales; nunca copies configuraciones de .claude/ de otros repos.
  8. Pregunta antes de descargar modelos (whisper ggml-medium tiene ~1.5 GB) o instalar paquetes. Indica nombre, fuente, tamaño.

Pipeline

0. Ingesta y resumen

  • ffprobe cada clip: resolución, fps, duración, audio. Detecta orientación.
  • Pregunta solo lo que importa (usa un menú corto): plataforma objetivo/relación de aspecto, duración objetivo, vibe (ver Vibes), estilo de subtítulos, música sí/no, cualquier línea que deba mantenerse. Si el usuario dice "solo hazlo", por defecto: 9:16, 30-60 s, vibe "creador", subtítulos en negrita, SFX ligero, sin música.

1. Transcribir (nivel de palabra, textual)

  • Preferir: mlx-whisper (Apple Silicon) o faster-whisper medium.en/distil-large-v3, con marcas de tiempo por palabra. Usa medium, no small: small omite los falsos inicios. Opcional: ElevenLabs Scribe si el usuario tiene una clave (nunca escribas la clave en la carpeta del proyecto).
  • Mantén las muletillas en la transcripción (textual) para que puedan cortarse. Guarda en caché la transcripción.
  • Peculiaridades de Whisper: engulle pausas largas en una sola palabra (una palabra que dura segundos es una pausa engullida; usa una envolvente RMS para los tramos de habla reales), comienza las palabras 0.2-0.4 s tarde después de una pausa y alucina en colas silenciosas. Recorta al final del contenido real. Para la sincronización de subtítulos, vuelve a transcribir por segmento final.
  • Revisa nombres/términos; aplica una lista de correcciones (chat gpt -> ChatGPT).

2. Elegir la historia (para yaps largos)

  • Puntúa segmentos candidatos 0-100: hook*0.30 + coherencia*0.25 + emoción*0.20 + valor*0.15 + remate*0.10. Buenos ganchos: afirmación audaz/contradictoria, brecha de curiosidad, número específico, interrupción de patrón. Débiles: "Así que hoy quiero hablar de...". Prueba de independencia: sin "como dije antes", sin pronombres sin referente.
  • 15-55 s cada uno (punto óptimo 25-40), puntuación >= 60, ajusta inicio a un inicio de palabra/frase (ventana de 1.5 s) y final a un final de frase (ventana de 3 s) + 300 ms de relleno.
  • El gancho se escribe/elige AL FINAL: ofrece ~5-12 aperturas candidatas numeradas con texto, tipo y duración. Una apertura en frío de resultado o afirmación audaz vence a una introducción lenta. Los primeros 1-3 s lo deciden todo.
  • Para yaps de una sola toma: reordena solo si mejora el gancho; de lo contrario, mantén el orden del hablante.

3. Cortar (ajustar)

Perfiles de ajuste (las pausas se acortan, no se eliminan):

perfilexprimir pausas superiores amantener
suave0.80 s0.35-0.70 s
estándar0.45 s0.18-0.40 s (0.30 después del final de frase)
ajustado (por defecto para yap)0.25 s0.08-0.20 s
  • Detecta: envolvente RMS en saltos de 10 ms, habla = suelo de ruido + 8 dB. Alternativa: silencedetect=noise=-30dB:d=0.5.
  • Elimina: ums/ehs, tartamudeos y reinicios, palabras repetidas, falsos inicios, retomas (la toma anterior se va), pizarra/cola, carraspeos ("Entonces,", "Básicamente"). Muletillas semánticas ("tipo", "sabes") solo cuando el audio las aísla. Mantén la repetición deliberada para énfasis.
  • Los cortes de baja confianza o ambiguos (retomas, muletillas fusionadas, ruido ASR) se confirman con el usuario, no se aplican automáticamente.
  • Verifica cada unión: vuelve a transcribir una ventana a través de cada unión; debe leerse como las palabras previstas. Espera 2-3 rondas. Después del corte completo, compara las palabras de contenido con el plan; falla si se pierde alguna.
  • Comprobación visual: evita bordes de corte donde el hablante mire hacia abajo a las notas o a mitad de un parpadeo/movimiento de cabeza; termina apretado (<=30 ms) en bordes de movimiento de cabeza.
  • Piezas exactas al fotograma: cuantifica cada pieza a fotogramas completos (n = round(dur*fps)) y planifica la línea de tiempo de salida a partir de ellas, o los subtítulos se desviarán (~1 s sobre 40 cortes).
  • L-cuts: renderiza imagen y sonido por separado. En cada nueva línea (no en las compresiones de pausas internas) el corte de imagen aterriza 2 fotogramas después del corte de audio; las compresiones internas permanecen como cortes duros. Suaviza los cortes por salto sin error visible de sincronía de labios.
  • Mirando hacia abajo / a notas: en tramos donde el hablante mira hacia abajo entre frases, aprieta más (pausas superiores a 0.10 s, mantén 0.03 s a cada lado). Las miradas hacia abajo durante el habla no se pueden cortar; escóndelas con un zoom de acercamiento o una pegatina/b-roll.
  • Mantén los momentos humanos que el usuario pida (una risa, una reacción) como rangos protegidos con bordes en bruto; recórtalos por segundos exactos cuando se solicite ("corta 0:09-0:11").
  • Ritmo: un nuevo evento visual (zoom, énfasis de subtítulo, gráfico, b-roll) al menos cada 1.5-4 s; sin fotograma estático durante más de ~8 s. Opcional aceleración 1.1-1.25x en cuerpo (nunca por encima de ~1.3x, suena falso; gancho hasta 1.5x es el límite).

4. Zoom (detección facial)

  • Rastrea la cara: OpenCV Haar (opencv-python-headless<5) o MediaPipe; muestrea cada 0.5 s por sección, toma la mediana, rechaza detecciones por debajo de 0.6x la anchura de la mediana, banda muerta del 2% de la anchura del fotograma, nunca panees dentro de una sección. Si una sección tiene menos de 2 aciertos, toma prestado de un vecino.
  • Escalera de zoom por sección (3-6 s cada una): normal 1.0x, énfasis ~1.15-1.25x, crítico ~1.3-1.6x (apaisado). Para 9:16 desde 16:9 usa fracciones de altura fijas 1.0 / 0.92 / 0.85 (más apretado parece incómodo).
  • Mezcla por duración: ~60% normal / 30% énfasis / 10% crítico. Primera sección normal. Nunca más de 2 secciones consecutivas al mismo nivel. Zoom de énfasis como máximo 1 de cada 4 frases.
  • Elección de estilo (pregunta o infiere de la vibe):
    • Punch-ins con corte duro (por defecto para yaps con cortes por salto): alterna 1.0x y 1.15x a lo largo de segmentos de corte por salto, comienza con zoom en el gancho, frases de énfasis a ~1.3x.
    • Push-in suavizado en acumulaciones: scale=w='iw*z(t)':h='ih*z(t)':eval=frame luego crop de tamaño fijo, cubic ease-out (1-(1-t)^3), 0.4-0.5 s de entrada. Prueba primero en un clip de 2 s; zoompan es entrecortado.
    • Punch-and-stay (1.16x, 0.5 s) 1-2 veces por vídeo en el remate.
  • Encuadre vertical: cara a ~30% desde la parte superior del recorte; cy = min(face_cy - 0.3*ch, head_top - 0.03*ch).
  • Efectos de impacto opcionales solo en picos: sacudida, destello blanco de 2 fotogramas, división RGB, rampa de velocidad (ver params).

5. Subtítulos (animados, nivel de palabra)

  • Genera .ass de libass a partir de marcas de tiempo de palabras (solo instancias de fuente estáticas; las fuentes variables cuelgan libass). Retranscripción por segmento para sincronización precisa.
  • Valores por defecto: 1-3 palabras por indicación (<=18 caracteres), rompe en puntuación y pausas >=0.3 s, indicación mínima 0.35 s (crece a 3 palabras en lugar de destello), mantén 0.12 s después de la última palabra. Fuente ~4.6% de la altura del lienzo 1920 (~88 px), ExtraBold, contorno grueso o sombra suave.
  • Aspectos (renderiza 3 en un fotograma real como cuadrícula y deja que el usuario elija):
    • Negrita: Montserrat 800, MAYÚSCULAS, blanco, palabra activa amarillo #FFD700, contorno negro de 3 px, pop-in elástico.
    • Rebote: fuente display, 1-2 palabras, colores de acento rotativos, sobreimpulso 0.7 -> 1.2 -> 1.0.
    • Limpio: Inter 700, mayúsculas/minúsculas naturales, 3-5 palabras, fundido suave.
    • Hormozi-lite (alternativa): blanco con contorno negro, centrado.
  • Énfasis: ~1 palabra clave de cada 4 recibe color/escala 112%; números/dinero colorean automáticamente (ej. #3CE07A); una palabra clave por grupo de subtítulos recibe tratamiento de tamaño 2-4x en vibe "diseñado". Pop en palabra hablada: escala 108-112% con easing suave en ~110 ms.
  • Colocación: respeta las zonas seguras de la plataforma (zona segura universal 9:16 x60-940, y285-1480). Reels subtítulos y~1360, TikTok ~1400, Shorts ~1440. Nunca sobre la boca/barbilla. Las líneas nunca superan las 4 palabras, apilamiento equilibrado.
  • No uses caras display condensadas por defecto para subtítulos de cuerpo (se ve apretado).

Sistema de tipo Creador (probado en ediciones reales; el usuario dijo "mierda de creador de contenido real pero limpio"):

  • Cuerpo: Gotham Narrow Black (o Montserrat 800), MAYÚSCULAS, blanco, ~70 px a 1080 w, trazo oscuro + sombra paralela desenfocada suave. Las palabras aparecen tal como se pronuncian; solo la palabra más nueva está activa (amarillo + pop 112% con easing en 3 fotogramas). Nunca dos palabras resaltadas a la vez.
  • Sin puntuación en los subtítulos (mantén apóstrofes y palabrotas enmascaradas como j**der, m**rda).
  • Palabras clave (producto, nombres, números, el tema): condensado Ultra (Gotham XNarrow Ultra), 1.5x, amarillo, en línea sobre la línea base.
  • Acento script (SignPainter / una script brush), crema, inclinado ~6 grados, para 4-6 palabras emocionales por vídeo como máximo.
  • Grandes golpes (remate, tesis, revelación de producto): condensado Ultra slam 1.28 -> 1.0 en 4 fotogramas, palabra por palabra, 200-250 px, debajo de la boca (comprueba que el zoom de acercamiento mueve la cara hacia abajo).
  • Tarjetas de momento: texto que el hablante no dijo pero que el momento merece (ej. "ríe en rico" en script sobre una risa).
  • Construcción de serie/título: cada línea de título aparece con su palabra hablada (línea display condensada / línea script / línea color marca / versalitas rastreadas), colocada debajo de la barbilla, nunca sobre la boca.
  • Enmascara palabrotas en subtítulos solo cuando se solicite; el audio se mantiene tal como se grabó.
  • Pregunta antes de añadir etiquetas persistentes (contadores de días, etiquetas de serie); los creadores a menudo las prefieren apagadas.

5b. Accesorios, pegatinas y recortes (opcional, alto impacto)

  • Referencias a personas/marcas reales (ej. "Bruce Wayne", "Alfred", un coche): muestra UNA VEZ en la primera mención como un recorte de pegatina con contorno blanco (alpha MaxFilter ~19 px debajo del recorte), aparece con sobreimpulso (0 -> 1.12 -> 1.0 en 0.22 s), balanceo suave (+/-2.5 grados), ~1.9 s, desaparece; coloca arriba a la izquierda/derecha junto a la cabeza, nunca sobre la cara. Acompaña con un SFX (whoosh, o uno temático: timbre de servicio para un mayordomo).
  • Los objetos pueden moverse: ej. un recorte de coche cruza la parte inferior en su palabra hablada (smoothstep en ~2 s, pequeño rebote, 2 copias fantasma de velocidad a 18%/32% de alfa), con un SFX de paso de motor.
  • Fuentes: activos del usuario primero; para personas reales usa fotos con licencia abierta (Wikimedia Commons CC BY / CC BY-SA / PD) e informa al usuario de la línea de crédito; elimina fondos con una herramienta disponible (ej. una API de eliminación de fondos o rembg) después de preguntar. Uso personal/social solo a menos que el usuario aclare los derechos.

6. Diseño de sonido

Orden de trabajo: música (si la hay) primero, imagen después, SFX al final.

  • Indicaciones: whoosh en cambios de diseño/escena y grandes movimientos de cámara (comienza 2 fotogramas antes; comienza por el tiempo de ataque antes del fotograma de contacto); pop en entrada de gráfico/palabra; impacto/sub-grave UNA VEZ en el gancho o revelación; riser que TERMINA en el siguiente golpe; tick/flick con moderación en aspectos destacados; escritura = teclas.
  • Moderación (lo más importante): Los SFX marcan cambios, no cada palabra. Nada en muletillas. Alrededor de 8 en 18 s se lee diseñado; alrededor de 20 se lee genérico. Límite de densidad: 2 por ventana de 2 s para talking-head. El mismo SFX dentro de 1.5 s alterna variante y baja 1.5 dB por repetición. Escalera de intensidad: yap casual = escaso; reel de hype = sonido en la mayoría de los golpes; corporativo = casi ninguno.
  • Fuentes: biblioteca del usuario, o generar (ElevenLabs sound-effects/paquete generado), o el enfoque de kit sintetizado (whoosh/pop/tick/impact/riser construidos con numpy/ffmpeg; sin descargas). Coloca por pico transitorio, +/-1 fotograma.
  • Música: opcional. Cama atenuada 10-15 dB bajo la voz (sidechaincompress=threshold=0.02:ratio=8:attack=20:release=350), ganancia de música alrededor de -18 dB cuando está atenuada. Para vibes de corte por ritmo: detecta golpes (librosa), corta cada golpe / 2 golpes / compás, verifica que los cortes caigan dentro de 3 fotogramas.
  • Cadena de voz, mezcla, limitador y objetivos de sonoridad están en references/params.md.

7. Aspecto

  • Solo corrección de luz suave: preajuste de punch cálido o corrección automática limitada a +/-8%. No desenfocar talking-heads estáticos (parece falso). Grano opcional 3-6% y viñeta sutil para la vibe "diseñado".
  • Material log (DJI Osmo Pocket 3 D-Log M, 10-bit HEVC; la cámara lo etiqueta bt709 aunque sea log): convierte primero con el LUT DJI D-Log M -> Rec.709, luego corrige encima. Trabaja en 16-bit: format=rgb48le,lut3d=file='<lut>.cube':interp=tetrahedral. El LUT oscurece los medios tonos; para tomas de interior con poca luz de piel más oscura, levanta los medios tonos en lugar de aplastarlos. Punto de partida probado (aspecto: negros ricos, sala ligeramente fría, piel natural): curves=master='0/0 0.04/0.025 0.25/0.31 0.6/0.70 0.9/0.92 1/0.98',colorbalance=rs=-0.025:bs=0.04:rm=0.03:bm=-0.015,eq=saturation=1.06,unsharp=5:5:0.3. Siempre renderiza raw | LUT | corrección lado a lado en 2 fotogramas y mira antes de renderizar por lotes. Corrige tomas individualmente cuando la iluminación cambie; mantén la frecuencia de fotogramas de origen (24000/1001).
  • Los clips verticales de Pocket 3 son 1728x3072 (o 2160x3840): suficiente espacio para zooms de acercamiento de 1.15-1.3x.

…

Skills relacionados