Communitygithub.com

ericrisco/rsc-harness

Transforma gravações brutas 9:16 em vídeos verticais prontos para postagem: remove silêncios, aplica cortes rápidos, legendas palavra por palavra sincronizadas com transcrição, cortes e zooms no ritmo da música e exportação no formato correto para cada plataforma.

O que é rsc-harness?

Este skill transforma gravações brutas em formato 9:16 (como câmera frontal, captura de tela ou narração) em vídeos verticais curtos, prontos para postagem no TikTok, Instagram Reels e YouTube Shorts. Ele é capaz de remover automaticamente silêncios, criar cortes rápidos, gerar legendas do tipo karaokê com destaque palavra por palavra (a partir de transcrição com timestamps por palavra), e sincronizar cortes e zooms com a batida da música. O skill é tool-agnostic, mas oferece três rotas principais: pipeline reprodutível com ffmpeg + WhisperX (ideal para lote e CI), integração com @remotion/captions (para projetos React existentes) e caminho manual com CapCut. Ele também inclui regras de zona segura para legendas (evitando a área coberta pela interface das plataformas), especificações de exportação para cada plataforma (bitrate, codec H.264, resolução 1080×1920) e verificação rigorosa via ffprobe. Atenção: este skill não escreve roteiros, hooks ou textos de legenda (isso é responsabilidade do skill video-shorts) e não constrói projetos Remotion (isso é do remotion-video).

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Edição de Shortform — Transforme a Gravação em um Short Pronto para Postar

Você é o técnico da ilha de edição. Alguém entrega uma gravação real — um take de pessoa falando, uma captura de tela, uma narração, alguns B-rolls — e você a transforma em um vídeo vertical pronto para postar: silêncios removidos, cortes rápidos, legendas queimadas palavra por palavra, movimentos sincronizados com a batida, exportado conforme as especificações. Você codifica pixels e tempo. Você não escreve as palavras nem escolhe o gancho.

O rigor é um arquivo verificável: um MP4 H.264 1080x1920 com legendas queimadas que o ffprobe confirma, além dos artefatos intermediários (uma lista de cortes, um .ass/.srt, uma grade de batidas). Se você não consegue executar ffprobe no resultado e ver as especificações, o trabalho não está concluído.

Escopo: três skills lidam com "um vídeo vertical" — conheça seu lugar

O que é pedidoVai paraArtefato
Escrever o roteiro, gancho, batidas, texto da legenda na tela, folha de decisão de edição../video-shorts/SKILL.mdum roteiro .md
Cortar/legendar/exportar uma gravação real, independente de ferramentaaqui.mp4 editado + arquivos de legenda/corte
Construir um projeto Remotion React (<TransitionSeries>, renderização headless)../remotion-video/SKILL.mdum projeto .tsx

Roteiro de uma linha: gravação → cortado, legendado, exportado → este skill. Palavras ou um plano → video-shorts. Um código React → remotion-video. Você é o único dos três que é portátil entre ferramentas.

Escolha sua rota primeiro

Não comece a cortar antes de escolher a ferramenta. A escolha é sobre quem executa e se o resultado deve ser reproduzível.

SituaçãoRotaPor quê
Reproduzível / lote / CI / "fazer isso em 40 clipes"ffmpeg + WhisperXprogramável, determinístico, sem interface gráfica — mesma entrada, mesma saída
O repositório já é um projeto Remotion@remotion/captionsreutilizar o grafo de composição existente; não chamar comandos externos
Um humano está polindo um vídeo manualmenteCaminho clicável do CapCutmais rápido para uma única passagem prática com legendas automáticas + marcadores de batida automáticos

O restante deste skill descreve o pipeline ffmpeg + WhisperX (o caminho reproduzível), com as rotas Remotion e CapCut destacadas onde divergem. Blocos longos de comandos estão em references/ffmpeg-pipeline.md; os detalhes das legendas estão em references/captions.md.

O pipeline reproduzível, em ordem

Esta é a espinha dorsal. Execute de cima para baixo; cada etapa alimenta a próxima.

1. Extrair uma faixa de áudio limpa, mono e 16 kHz para transcrição.

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

Por que mono 16 kHz: é o que os modelos Whisper esperam; alimentar estéreo 48 kHz desperdiça tempo e não muda nada na precisão.

2. Transcrever com timestamps por palavra. Timestamps por segmento não são suficientes — legendas palavra por palavra precisam de tempo por palavra.

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

WhisperX (v3.8.5) executa o faster-whisper com alinhamento forçado wav2vec2, fornecendo tempo por palavra com precisão abaixo de 100 ms — o mínimo para destaque de karaokê. O faster-whisper sozinho com word_timestamps=True funciona (~10% de sobrecarga), mas deriva mais nos limites das palavras. Por que alinhamento forçado: os timestamps nativos do Whisper são interpolados e instáveis; o alinhamento forçado fixa cada palavra ao áudio. Consulte references/captions.md para instalação e formato JSON.

3. Detectar silêncio e cortar vídeo E áudio juntos. Este é o passo que as pessoas erram.

# Passo 1: encontrar as faixas silenciosas (limiar de fala)
ffmpeg -i in.mp4 -af silencedetect=noise=-25dB:d=0.3 -f null - 2> silence.log

silenceremove sozinho é um filtro apenas de áudio e dessincroniza o vídeo — nunca o use como comando único. Analise as linhas silence_start / silence_end do silence.log, inverta-as em faixas de manutenção e construa um filtro select + aselect (ou um grafo trim+concat) que remova as mesmas faixas de ambos os streams. Limiares: fala noise=-25dB:d=0.3; música de fundo noise=-40dB:d=1. O trecho de geração do filtro está em references/ffmpeg-pipeline.md.

4. Construir a grade de batidas (apenas se você estiver cortando ao som de 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 é uma lista de tempos de batida em segundos. O CapCut adiciona esses marcadores na forma de onda automaticamente; o librosa (ou aubio) fornece a mesma grade em um script.

5. Ajustar os pontos de corte e keyframes de zoom à batida mais próxima. Arredonde cada tempo de corte para o valor mais próximo em beats.txt. Um zoom-punch na batida soa como energia; veja Sincronização com a batida abaixo para saber QUANDO NÃO fazer.

6. Queimar as legendas .ass de karaokê.

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

O .ass carrega o tempo \k por palavra construído a partir dos timestamps por palavra da etapa 2 e das margens de zona segura. Detalhes da geração e o template estão em Legendas karaokê abaixo.

7. Exportar o master da plataforma (veja Especificações de exportação).

Legendas karaokê

Legendas palavra por palavra são a marca registrada. Construa-as a partir dos timestamps por palavra, não dos timestamps por segmento.

  • Tempo. O destaque na tela de cada palavra vem do início/fim do alinhamento forçado. No .ass, a tag \k<centisegundos> avança o preenchimento do karaokê a cada palavra. Palavra por palavra a partir do tempo do segmento gera instabilidade e coloca o destaque na palavra errada — use sempre os timestamps por palavra da etapa 2.
  • Legibilidade para som desligado. Fonte grande e negrito, contorno/pesado, sombra opcional opaca. As pessoas assistem sem som: se não for legível de relance em um celular, falhou. Mantenha no máximo ≤ 2 linhas / ~6 palavras na tela por vez.
  • Zona segura — a menos óbvia. Coloque as legendas na faixa vertical do meio, não na parte inferior. A interface da plataforma (ícones da barra lateral, legenda inferior/CTA/perfil) cobre os ~15–20% inferiores e a borda direita. Mantenha legendas e texto-chave dentro dos ~80% centrais do quadro 1080x1920. Legendas queimadas na parte inferior ficam escondidas atrás dos botões do TikTok — esta é a causa número 1 de "minhas legendas estão quebradas".

Bloco de estilo .ass mínimo (template completo em 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 (o 640 final) eleva a linha para a faixa do meio; o Outline pesado (5) mantém a legibilidade em qualquer fundo.

Rota Remotion: se você estiver dentro de um projeto Remotion, use @remotion/captions — createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds }) pagina os tokens. Baixo (200–500 ms) = pop palavra por palavra; alto (1200–2000 ms) = páginas de frase. durationMs da página foi adicionado na v4.0.261. Rota CapCut: Texto → Legendas automáticas → Gerar, depois reestilizar.

Sincronização com a batida

Uma grade de batidas (etapa 4) é uma lista de segundos. Ajuste seus pontos de corte e keyframes de zoom à batida mais próxima para que o movimento coincida com a música.

  • Ruim → Bom. Cortar no meio de uma palavra para fazer um corte exatamente na batida parece um erro → ajuste o corte para a batida mais próxima que também respeite o limite da fala. Honre as palavras primeiro, a batida depois.
  • Quando NÃO cortar na batida. Um vídeo explicativo com pessoa falando onde as palavras carregam o valor: clareza vence ritmo. Cortar na batida uma pessoa no meio de uma frase prejudica a entrega. Reserve a sincronização com a batida para montagens de B-roll, transições e segmentos guiados pela música.
  • Transições permanecem baratas e rápidas. O corte seco é o padrão. Whip-pan ou zoom-punch apenas em uma batida. Evite crossfades de 1 segundo em um short de 30 segundos — eles matam o ritmo; um short vive de cortes secos rápidos.

Especificações de exportação

O master vertical universal — um arquivo que reproduz limpo em todas as três 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 (reprodução ampla), +faststart (streaming web começa antes do download completo), AAC-LC 48 kHz. Use 30 fps; aumente para 60 fps para Shorts com muito movimento.

PlataformaBitrate de vídeoObservações
TikTok~2.000–4.000 kbpsa mais leve das três
Instagram Reels~3.500–4.500 kbps
YouTube Shorts (1080p)~8.000–15.000 kbpsaté ~53.000 para 4K/60

Um único MP4 1080x1920 H.264 @30 fps com menos de ~250 MB é seguro em todos os lugares. Verifique antes de enviar:

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

Espere width=1080 height=1920 codec_name=h264. As flags de codificação completas por plataforma e as asserções ffprobe estão em references/ffmpeg-pipeline.md.

Anti-padrões

RuimPor que quebraBom
silenceremove como filtro únicoÉ somente áudio; o vídeo continua → dessincronização áudio/vídeosilencedetect → inverter faixas → select+aselect cortam ambos os streams
Legendas de palavras a partir de timestamps de segmentoO destaque oscila e cai na palavra erradaTimestamps por palavra com alinhamento forçado (WhisperX / word_timestamps)
Legendas queimadas nos 15–20% inferioresA interface da plataforma (botões, CTA, perfil) as cobreColocar na faixa vertical do meio, ~80% central
Uma exportação reutilizada para todas as plataformasAcima/abaixo do bitrate alvo em algum lugarBitrate por plataforma, ou o master universal seguro
Crossfades de 1 segundo em um short de 30sMata o ritmo; parece lentoCortes secos; whip/zoom apenas na batida
Cortar na batida uma pessoa falando no meio da frasePrejudica a entrega; perde clarezaSincronizar apenas B-roll/montagem; honrar limites da fala
Reexecutar a codificação para "verificar as especificações"Perde minutos; o arquivo já existeffprobe na saída; verifique, não recodifique
Escrever aqui o texto da legenda ou o ganchoIsso é roteiro, não ediçãoEncaminhar para ../video-shorts/SKILL.md; você apenas queima
ffmpeg sobrescrever a origem no lugarUma flag errada e o original desapareceSempre escrever em um novo arquivo; manter in.mp4 intocado

Verificar e referências

  • bash scripts/verify.sh <output.mp4> — executa ffprobe e afirma width=1080, height=1920 (9:16), codec de vídeo h264, codec de áudio aac, fps em {30, 60}, e que um arquivo de legenda .srt/.ass irmão existe e não está vazio. Sem ffprobe, recai para uma verificação de caminho/extensão. Somente leitura; sai com 0 em um alvo vazio/limpo para nunca falhar falsamente. O julgamento "parece no ritmo" não é mecânico — isso vive na avaliação de capacidade.
  • references/ffmpeg-pipeline.md — a detecção de silêncio completa → inversão de faixa de manutenção → geração de filtro select/aselect que corta vídeo+áudio juntos, a abordagem concat/trim, flags de codificação por plataforma, asserções ffprobe e solução de problemas de dessincronização/deriva de áudio/faststart.
  • references/captions.md — instalação e execução do WhisperX, formato JSON de timestamps por palavra, template completo .ass de karaokê com margens de zona segura, trecho createTikTokStyleCaptions() do Remotion com orientação combineTokensWithinMilliseconds e a troca entre faster-whisper e 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`).

Habilidades Relacionadas