Communitygithub.com

ericrisco/rsc-harness

Corta footage 9:16 vertical en un short listo para publicar: elimina silencios, aplica cortes rápidos, agrega subtítulos palabra por palabra (karaoke), sincroniza cortes y zooms con el ritmo musical y exporta en MP4 optimizado para cada plataforma.

¿Qué es rsc-harness?

Este skill es una herramienta técnica de edición que toma footage crudo (toma a cámara, grabación de pantalla, voz en off, b-roll) y lo transforma en un short vertical listo para publicar. Su enfoque principal es reproducible y scripteable mediante un pipeline ffmpeg + WhisperX, aunque también ofrece rutas para proyectos Remotion existentes o edición manual con CapCut. El flujo de trabajo es paso a paso: extrae audio limpio (mono 16 kHz para Whisper), transcribe con WhisperX para obtener marcas de tiempo por palabra (alineadas forzosamente con sub-100ms de precisión), detecta silencios y corta tanto video como audio simultáneamente (evitando la desincronización común con silenceremove solo), construye una rejilla de beats (con librosa o aubio), ajusta puntos de corte y zooms al beat más cercano respetando límites de habla, quema subtítulos karaoke en formato .ASS dentro de una zona segura (banda central vertical, no la parte inferior) y exporta un master universal 1080x1920 H.264 MP4 @30fps con verificación mediante ffprobe. Es especialmente útil para automatizar la edición de múltiples clips en CI o batch, o para integración en pipelines más grandes. No escribe el guion ni el hook (eso va a video-shorts), no construye componentes Remotion React (eso va a remotion-video), y no decide cuándo o dónde publicar (eso va a social-publisher). Su salida verificable son archivos: un MP4, una lista de cortes, archivos .ASS/.SRT y una rejilla de beats.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ericrisco/rsc-harness/tree/HEAD/skills/shortform-editing

Preguntar en tu IA favorita

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

Documentación

Edición de Shorts — Corta el Footage en un Short Listo para Publicar

Eres el técnico de sala de edición. Alguien te entrega footage real — una toma a cámara, una grabación de pantalla, una voz en off, algo de b-roll — y lo conviertes en un short vertical listo para publicar: silencios eliminados, cortes rápidos, subtítulos quemados palabra por palabra, movimiento sincronizado con el ritmo, exportado conforme a especificaciones. Codificas píxeles y tiempos. No escribes las palabras ni eliges el gancho.

El rigor es un archivo comprobable: un MP4 H.264 1080x1920 con subtítulos quemados que ffprobe confirma, más los artefactos intermedios (una lista de cortes, un .ass/.srt, una rejilla de beats). Si no puedes ejecutar ffprobe sobre el resultado y ver las especificaciones, no has terminado.

Alcance: tres habilidades tocan "un vídeo vertical" — conoce tu lugar

La peticiónVa aArtefacto
Escribir el guion, gancho, beats, texto de subtítulos en pantalla, hoja de decisiones de edición../video-shorts/SKILL.mdun script .md
Cortar/subtitular/exportar footage real, independiente de herramientaaquí.mp4 editado + archivos de subtítulos/cortes
Construir un proyecto de composición Remotion React (<TransitionSeries>, render headless)../remotion-video/SKILL.mdun proyecto .tsx

Enrutamiento de una línea: footage de entrada → cortado, subtitulado, exportado → esta habilidad. Palabras o un plan → video-shorts. Un codebase React → remotion-video. Eres la única de las tres que es portable entre herramientas.

Elige tu ruta primero

No empieces a cortar antes de haber elegido la herramienta. La elección depende de quién la ejecuta y si debe ser reproducible.

SituaciónRutaPor qué
Reproducible / batch / CI / "haz esto a 40 clips"ffmpeg + WhisperXscripteable, determinista, sin GUI — misma entrada, misma salida
El repositorio ya es un proyecto Remotion@remotion/captionsreutiliza el grafo de composición existente; no invoques externamente
Un humano pule un vídeo manualmenteRuta CapCutlo más rápido para un solo pase práctico con subtítulos automáticos + marcadores de beat automáticos

El resto de esta habilidad es el pipeline ffmpeg + WhisperX (la ruta reproducible), con las rutas Remotion y CapCut indicadas cuando divergen. Los bloques largos de comandos están en references/ffmpeg-pipeline.md; el detalle de subtítulos está en references/captions.md.

El pipeline reproducible, en orden

Esta es la columna vertebral. Ejecútalo de arriba a abajo; cada paso alimenta al siguiente.

1. Extraer una pista de audio limpia mono a 16 kHz para transcripción.

ffmpeg -i in.mp4 -vn -ac 1 -ar 16000 a.wav

Por qué mono 16 kHz: eso es lo que esperan los modelos Whisper; alimentar estéreo 48 kHz pierde tiempo y no cambia nada en la precisión.

2. Transcripción con marcas de tiempo por palabra. Las marcas de tiempo por segmento no son suficientes — los subtítulos palabra por palabra necesitan temporización por palabra.

whisperx a.wav --model large-v3 --output_format json --highlight_words True

WhisperX (v3.8.5) ejecuta faster-whisper más alineación forzada wav2vec2, dando una temporización por palabra precisa a menos de 100 ms — el mínimo para el resaltado karaoke. faster-whisper solo con word_timestamps=True funciona (~10% de sobrecarga) pero se desvía más en los límites de las palabras. Por qué alineación forzada: las marcas de palabra nativas de Whisper son interpoladas y tiemblan; la alineación forzada fija cada palabra al audio. Ver references/captions.md para la instalación y la forma del JSON.

3. Detectar silencio, luego cortar video Y audio juntos. Este es el paso que la gente hace mal.

# Pase 1: encontrar los rangos de silencio (umbral de habla)
ffmpeg -i in.mp4 -af silencedetect=noise=-25dB:d=0.3 -f null - 2> silence.log

silenceremove solo es un filtro solo de audio y desincroniza el video — nunca lo uses como un solo comando. Analiza las líneas silence_start / silence_end de silence.log, inviértelas en rangos de conservación y construye un filtro select + aselect (o un gráfico trim+concat) que elimine los mismos rangos de ambos flujos. Umbrales: habla noise=-25dB:d=0.3; bases musicales noise=-40dB:d=1. El fragmento de generación de filtros está en references/ffmpeg-pipeline.md.

4. Construir la rejilla de beats (solo si estás cortando con música).

python -c "import librosa; y,sr=librosa.load('music.wav'); \
_,b=librosa.beat.beat_track(y=y,sr=sr,units='time'); print(*b,sep='\n')" > beats.txt

beats.txt es una lista de tiempos de beat en segundos. CapCut coloca estos marcadores en la forma de onda automáticamente; librosa (o aubio) te da la misma rejilla en un script.

5. Ajustar los puntos de corte y keyframes de zoom al beat más cercano. Redondea cada tiempo de corte a su valor más cercano en beats.txt. Un zoom-punch en el beat se percibe como energía; ver Sincronización con el beat más abajo para CUÁNDO NO hacerlo.

6. Quemar los subtítulos karaoke .ass.

ffmpeg -i tightened.mp4 -vf "ass=captions.ass" -c:a copy captioned.mp4

El .ass lleva la temporización \k por palabra construida a partir de las marcas de tiempo por palabra del paso 2 y los márgenes de zona segura. El detalle de generación y la plantilla están en Subtítulos karaoke más abajo.

7. Exportar el master de plataforma (ver Especificaciones de exportación).

Subtítulos karaoke

Los subtítulos palabra por palabra son la apariencia característica. Constrúyelos a partir de las marcas de tiempo por palabra, no de las marcas de tiempo por segmento.

  • Temporización. El resaltado en pantalla de cada palabra proviene de su inicio/fin de alineación forzada. En .ass, la etiqueta \k<centisegundos> avanza el relleno karaoke por palabra. Palabra por palabra a partir de la temporización de segmento tiembla y coloca el resaltado en la palabra equivocada — usa siempre las marcas por palabra del paso 2.
  • Legibilidad sin sonido. Negrita grande sans, contorno/trazo grueso, sombra opcional opaca. La gente ve en silencio: si no es legible de un vistazo en un teléfono, ha fallado. Mantén un máximo de ≤ 2 líneas / ~6 palabras en pantalla a la vez.
  • Zona segura — la menos obvia. Coloca los subtítulos en la banda central vertical, no en la parte inferior. La UI de la plataforma (iconos del carril derecho, subtítulos/CTA/perfil inferiores) cubre la parte inferior ~15–20% y el borde derecho. Mantén los subtítulos y el texto clave dentro del ~80% central del fotograma 1080x1920. Los subtítulos quemados en la parte inferior quedan ocultos detrás de los botones de TikTok — esta es la causa #1 de "mis subtítulos están rotos".

Bloque de estilo .ass mínimo (plantilla completa en references/captions.md):

[V4+ Styles]
Style: Karaoke,Montserrat,64,&H00FFFFFF,&H0000FFFF,&H00000000,&H64000000,-1,0,0,0,100,100,0,0,1,5,2,5,80,80,640,1

MarginV (el 640 final) eleva la línea a la banda central; el Outline (5) grueso la mantiene legible sobre cualquier fondo.

Ruta Remotion: si estás dentro de un proyecto Remotion, usa @remotion/captions — createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds }) pagina los tokens. Bajo (200–500 ms) = aparición palabra por palabra; alto (1200–2000 ms) = frases paginadas. durationMs de página se añadió en v4.0.261. Ruta CapCut: Texto → Subtítulos automáticos → Generar, luego cambiar estilo.

Sincronización con el beat

Una rejilla de beats (paso 4) es una lista de segundos. Ajusta tus puntos de corte y keyframes de zoom al beat más cercano para que el movimiento caiga sobre la música.

  • Malo → Bueno. Cortar a mitad de palabra para que un corte caiga exactamente en un beat se percibe como un error → desplaza el corte al beat más cercano que también respete el límite del habla. Honra las palabras primero, el beat segundo.
  • CUÁNDO NO cortar al beat. Un video explicativo de una persona hablando donde las palabras son el valor: la claridad supera al ritmo. Cortar al beat a una persona a mitad de frase corta su presentación. Reserva la sincronización con el beat para montajes de b-roll, transiciones y segmentos guiados por música.
  • Las transiciones se mantienen baratas y rápidas. El corte directo es el predeterminado. Whip-pan o zoom-punch solo en un beat. Evita crossfades de 1 segundo en un short de 30 segundos — matan el ritmo; un short vive de cortes directos rápidos.

Especificaciones de exportación

El master vertical universal — un archivo que se reproduce limpio en las tres plataformas:

ffmpeg -i captioned.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1" \
  -c:v libx264 -profile:v high -pix_fmt yuv420p -r 30 \
  -c:a aac -b:a 192k -ar 48000 -ac 2 \
  -movflags +faststart out.mp4

yuv420p (reproducción amplia), +faststart (la transmisión web comienza antes de la descarga completa), AAC-LC 48 kHz. Usa 30 fps; sube a 60 fps para Shorts de alto movimiento.

PlataformaBitrate de videoNotas
TikTok~2,000–4,000 kbpsel más ligero de las tres
Instagram Reels~3,500–4,500 kbps
YouTube Shorts (1080p)~8,000–15,000 kbpshasta ~53,000 para 4K/60

Un único 1080x1920 H.264 MP4 @30 fps con menos de ~250 MB es seguro en todas partes. Verifica antes de enviar:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,codec_name,avg_frame_rate out.mp4

Espera width=1080 height=1920 codec_name=h264. Las banderas de codificación completas por plataforma y las aserciones ffprobe están en references/ffmpeg-pipeline.md.

Anti-patrones

MaloPor qué se rompeBueno
silenceremove como filtro únicoEs solo de audio; el video sigue reproduciéndose → desincronización audio/videosilencedetect → invertir rangos → select+aselect cortan ambos flujos
Subtítulos de palabras a partir de marcas de tiempo de segmentoEl resaltado tiembla y cae en la palabra equivocadaMarcas por palabra de alineación forzada (WhisperX / word_timestamps)
Subtítulos quemados en la parte inferior 15–20%La UI de la plataforma (botones, CTA, perfil) los cubreColocar en la banda central vertical, ~80% central
Una exportación reutilizada para cada plataformaPor encima/por debajo del objetivo de bitrate en algún lugarBitrate por plataforma, o el master universal seguro
Crossfades de 1 segundo en un short de 30 segundosMata el ritmo; se percibe lentoCortes directos; whip/zoom solo en un beat
Cortar al beat a una persona hablando a mitad de fraseCorta la presentación; se pierde claridadSincronizar al beat solo b-roll/montaje; honrar límites del habla
Volver a ejecutar la codificación para "verificar las especificaciones"Pierde minutos; el archivo ya existeffprobe sobre la salida; verifica, no vuelvas a renderizar
Escribir el texto del subtítulo o el gancho aquíEso es el guion, no el corteEnrutar a ../video-shorts/SKILL.md; tú solo lo quemas
ffmpeg sobrescribiendo la fuente en el lugarUna mala bandera y el original se pierdeSiempre escribir a un nuevo archivo; mantener in.mp4 intacto

Verificar y referencias

  • bash scripts/verify.sh <output.mp4> — ejecuta ffprobe y afirma width=1080, height=1920 (9:16), códec de video h264, códec de audio aac, fps en {30, 60}, y que exista un archivo de subtítulos .srt/.ass hermano y no esté vacío. Sin ffprobe falla a una comprobación de ruta/extensión. Solo lectura; sale 0 en un destino vacío/limpio para que nunca falle falsamente. El juicio de "¿se siente en el beat?" no es mecánico — eso vive en la evaluación de capacidad.
  • references/ffmpeg-pipeline.md — la detección de silencio completa → inversión de rango de conservación → generación de filtro select/aselect que corta video+audio juntos, el enfoque concat/trim, banderas de codificación por plataforma, aserciones ffprobe y solución de problemas de desincronización/desviación de audio/faststart.
  • references/captions.md — instalación y ejecución de WhisperX, la forma del JSON de marcas de tiempo por palabra, la plantilla .ass karaoke completa con márgenes de zona segura, el fragmento createTikTokStyleCaptions() de Remotion con guía de combineTokensWithinMilliseconds, y la compensación faster-whisper vs WhisperX.

Individual skills in this repo

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

ericrisco/rsc-harness

Use when writing the words on a single conversion page — the hero headline and subhead, the offer, the proof and testimonials, and one primary CTA — or diagnosing a page that gets traffic and does not convert, as a copy problem rather than a layout one. NOT the paid ad that drives the click (that is `ads`), NOT the visual layout the words sit in (that is `design`), NOT the experiment that picks the winning variant (that is `ab-testing`).

ericrisco/rsc-harness

Use when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions from a transcript, automatic silence removal, b-roll overlays, headless CI renders, and a final MP4 or MOV. NOT writing the script, hook, beats or caption text (that is `video-shorts`), NOT mastering audio to LUFS or building an RSS feed (that is `podcast`), NOT structuring the narrative arc (that is `course-storytelling`).

ericrisco/rsc-harness

Use when a Reels/TikTok/Shorts account needs its next video ideas scored into a ranked backlog, grounded in its own performance log plus dated trending sounds, each bet logged so its outcome feeds the next batch. NOT scripting a chosen idea (that is `video-shorts`), NOT pillars or cadence (that is `shortform-strategy`), NOT packaging a finished cut (that is `shortform-packaging`).

ericrisco/rsc-harness

Use when a vertical short is shot or scripted and you need the upload-form copy and cover that win the feed — the hook line, the first-frame on-screen text, the search-led caption, a tight hashtag set, and the cover frame; it learns from what performed via the 02-DOCS log. NOT inventing the idea (that is `shortform-ideation`), NOT scripting or directing the cuts (that is `video-shorts`), NOT executing the edit (that is `shortform-editing`), NOT scheduling the post (that is `social-publisher`).

ericrisco/rsc-harness

Use when the unit of work is a TikTok/Reels account, not one clip: positioning, sustainable cadence and format mix, ride-or-skip on a trend or sound, recurring series, diagnosing a flat account, and the dated learning loop. NOT the single script or hook variants (that is `video-shorts`), NOT the idea backlog (that is `shortform-ideation`).

ericrisco/rsc-harness

Use when planning a posting schedule, building a multi-platform content calendar, or reshaping one source asset into channel-native posts across X, LinkedIn, Instagram, Threads, Bluesky, TikTok, Facebook or YouTube — cadence, best-time slots, per-platform format limits, API publish caps, and a dated CSV or JSON calendar a scheduler can import. NOT the brand voice the posts speak in (that is `brand-voice`), NOT the editorial strategy of what to make (that is `content-engine`).

ericrisco/rsc-harness

Use when connecting a real TikTok account to code via the Content Posting, Display and Business Account APIs — OAuth, chunked video publish with status polling, and pulling views, watch time and impression sources, then logging that performance into the wiki as a dated feedback record. Covers short-lived tokens breaking a cron, unverified pull-from-URL ownership, and rate limits. NOT what to post or how to package it (that is `shortform-strategy` and `shortform-packaging`).

ericrisco/rsc-harness

Use when scripting or directing the edit of a single vertical short that has to hold attention from the first frame — turning a topic, a clip or a long video into a shot-by-shot script and an edit decision sheet, fixing a hook that dies in second three, generating hook variants to test, and planning cuts and on-screen text. NOT scheduling or cross-platform cadence (that is `social-publisher`), NOT running the editorial calendar (that is `content-engine`), NOT defining the durable brand tone (that is `brand-voice`).

ericrisco/rsc-harness

Use to judge whether a short-form clip is worth publishing — scores a reel, short or podcast excerpt 0-100 on ten weighted criteria with automatic penalties, then ranks a batch and says where the cut-off falls. Run it on transcript candidates before rendering. NOT writing the hook or caption (that is `shortform-packaging`), NOT inventing the idea (that is `shortform-ideation`), NOT executing the edit (that is `shortform-editing`).

Skills relacionados