Communitygithub.com

ericrisco/rsc-harness

Verwendet bei rohem 9:16-Material, das in ein postfertiges vertikales Kurzvideo geschnitten werden muss – inklusive Entfernung von Stille, schnellen Jump Cuts, wortgenauen Karaoke-Untertiteln, an den Musik-Beat gebundenen Cuts und Zooms sowie plattformkorrektem MP4-Export.

Was ist rsc-harness?

Diese Fähigkeit ist der technische Schnittdienst für vertikale Kurzvideos. Sie nimmt rohes 9:16-Material (Talking Heads, Screencasts, Voiceovers, B-Roll) und verwandelt es in ein postfertiges MP4: Stille wird entfernt, Jump Cuts sind schnell, Untertitel werden wortgenau eingebrannt, Bewegungen sind an den Beat gebunden und der Export erfüllt die technischen Anforderungen der Zielplattformen (TikTok, Instagram Reels, YouTube Shorts). Die Fähigkeit ist plattformunabhängig und bietet drei Routen: eine reproduzierbare ffmpeg + WhisperX-Pipeline, eine Remotion-Integration für React-basierte Projekte und einen CapCut-Klickpfad für manuelle Bearbeitung. Die reproduzierbare Pipeline ist der Kern und wird durch referenzierte Skripte in `references/ffmpeg-pipeline.md` und `references/captions.md` detailliert. Wichtig: Diese Fähigkeit schneidet und exportiert nur; sie schreibt kein Skript, keinen Hook und keine Untertiteltexte – das fällt in den Zuständigkeitsbereich von `video-shorts`. Sie erstellt auch keine Remotion-Komposition – das ist `remotion-video` vorbehalten.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Kurzvideo-Schnitt – Rohmaterial in ein postfertiges Kurzvideo schneiden

Du bist der Schnitttechniker. Jemand gibt dir echtes Filmmaterial – eine Talking-Head-Aufnahme, einen Screencast, einen Voiceover, etwas B-Roll – und du machst daraus ein vertikales Kurzvideo, das bereit zum Posten ist: Stille entfernt, schnelle Cuts, Untertitel wortgenau eingebrannt, Bewegungen im Takt des Beats, Export nach Spezifikation. Du kodierst Pixel und Timing. Du schreibst weder den Text noch wählst du den Hook.

Die Strenge liegt in einer überprüfbaren Datei: einem 1080x1920 H.264 MP4 mit eingebrannten Untertiteln, das ffprobe bestätigt, plus den Zwischenartefakten (einer Cuts-Liste, einer .ass/.srt, einem Beat-Raster). Wenn du das Ergebnis nicht mit ffprobe prüfen und die Spezifikationen sehen kannst, bist du nicht fertig.

Zuständigkeitsbereich: Drei Fähigkeiten befassen sich mit „einem vertikalen Video“ – kenne deine Rolle

Die AufgabeGeht anArtefakt
Schreibe das Skript, den Hook, die Beats, den Text der Bildschirmuntertitel, das Edit Decision Sheet../video-shorts/SKILL.mdein .md-Skript
Schneide/untertitele/exportiere echtes Filmmaterial, werkzeugunabhängighierbearbeitetes .mp4 + Untertitel-/Cut-Dateien
Baue ein Remotion-React-Kompositionsprojekt (<TransitionSeries>, Headless-Render)../remotion-video/SKILL.mdein .tsx-Projekt

Einzeiliger Router: Filmmaterial rein → geschnitten, untertitelt, exportiert → diese Fähigkeit. Wörter oder ein Plan → video-shorts. Eine React-Codebasis → remotion-video. Du bist die einzige der drei, die werkzeugunabhängig ist.

Wähle zuerst deinen Weg

Beginne nicht mit dem Schneiden, bevor du das Werkzeug gewählt hast. Die Wahl betrifft, wer es ausführt und ob es reproduzierbar sein muss.

SituationRouteWarum
Reproduzierbar / Batch / CI / „mach das mit 40 Clips“ffmpeg + WhisperXscriptbar, deterministisch, keine GUI – gleiche Eingabe, gleiche Ausgabe
Das Repository ist bereits ein Remotion-Projekt@remotion/captionsNutze den vorhandenen Kompositionsgraphen; rufe keine externen Programme auf
Ein Mensch poliert ein Video manuellCapCut-Klickpfadam schnellsten für einen einzelnen, praxisnahen Durchgang mit automatischen Untertiteln und automatischen Beat-Markern

Der Rest dieser Fähigkeit beschreibt die ffmpeg + WhisperX-Pipeline (den reproduzierbaren Weg), wobei die Remotion- und CapCut-Routen dort erwähnt werden, wo sie abweichen. Lange Befehlsblöcke befinden sich in references/ffmpeg-pipeline.md; die Untertitel-Details stehen in references/captions.md.

Die reproduzierbare Pipeline, in Reihenfolge

Dies ist das Rückgrat. Führe sie von oben nach unten aus; jeder Schritt speist den nächsten.

1. Extrahiere eine saubere Mono-16-kHz-Audiospur für die Transkription.

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

Warum Mono 16 kHz: Das ist das, was Whisper-Modelle erwarten; die Verarbeitung von Stereo 48 kHz verschwendet Zeit und ändert nichts an der Genauigkeit.

2. Transkribiere mit Wort-Zeitstempeln. Segment-Zeitstempel reichen nicht – wortgenaue Untertitel benötigen Zeitangaben pro Wort.

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

WhisperX (v3.8.5) verwendet faster-whisper plus wav2vec2-Forced-Alignment und liefert Wort-Zeitangaben mit einer Genauigkeit von unter 100 ms – die Grundlage für Karaoke-Highlights. faster-whisper allein mit word_timestamps=True funktioniert (~10% Overhead), driftet aber stärker an Wortgrenzen. Warum Forced Alignment: Whispers native Wortstempel sind interpoliert und zittern; Forced Alignment verankert jedes Wort am Audio. Siehe references/captions.md für die Installation und die JSON-Struktur.

3. Erkenne Stille, schneide dann Video UND Audio gemeinsam. Das ist der Schritt, den die Leute falsch machen.

# Durchgang 1: Finde die stillen Bereiche (Sprachschwelle)
ffmpeg -i in.mp4 -af silencedetect=noise=-25dB:d=0.3 -f null - 2> silence.log

silenceremove allein ist ein Nur-Audio-Filter und desynchronisiert das Video – verwende es niemals als einmaligen Befehl. Analysiere die silence_start- / silence_end-Zeilen aus silence.log, invertiere sie in Keep-Bereiche und baue einen select- + aselect-Filter (oder einen trim+concat-Graphen), der dieselben Bereiche aus beiden Streams entfernt. Schwellenwerte: Sprache noise=-25dB:d=0.3; Musikteppich noise=-40dB:d=1. Das Snippet zur Filtergenerierung befindet sich in references/ffmpeg-pipeline.md.

4. Baue das Beat-Raster (nur wenn du im Takt der Musik schneidest).

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 ist eine Liste von Beat-Zeiten in Sekunden. CapCut setzt diese Marker automatisch auf der Wellenform; librosa (oder aubio) liefert dir dasselbe Raster in einem Skript.

5. Richte Schnittpunkte und Zoom-Keyframes am nächsten Beat aus. Runde jede Schnittzeit auf den nächstgelegenen Wert in beats.txt. Ein Zoom-Punch auf den Beat wirkt energiegeladen; siehe Beat-Synchronisation unten, wann NICHT.

6. Brenne die Karaoke-.ass-Untertitel ein.

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

Die .ass-Datei trägt die pro-Wort-\k-Zeitangaben, die aus den Wort-Zeitstempeln von Schritt 2 und den Safe-Zone-Rändern erstellt wurden. Details zur Generierung und die Vorlage findest du unter „Karaoke-Untertitel“ weiter unten.

7. Exportiere den plattformspezifischen Master (siehe Export-Spezifikationen).

Karaoke-Untertitel

Wortgenaue Untertitel sind der Markenzeichen-Look. Baue sie aus den Wort-Zeitstempeln, nicht aus den Segment-Zeitstempeln.

  • Timing. Das Highlight jedes Wortes auf dem Bildschirm basiert auf seinem Forced-Alignment-Start/-Ende. In .ass bewegt das Tag \k<Zentisekunden> die Karaoke-Füllung pro Wort weiter. Wortgenaue Darstellung aus Segment-Timing zittert und setzt das Highlight auf das falsche Wort – verwende immer die pro-Wort-Stempel aus Schritt 2.
  • Lesbarkeit bei ausgeschaltetem Ton. Groß, fett, serifenlos, starke Kontur/Schatten, optionaler Schlagschatten. Leute schauen stumm: Wenn es auf dem Handy nicht auf einen Blick lesbar ist, ist es gescheitert. Halte es auf ≤ 2 Zeilen / ~6 Wörter gleichzeitig auf dem Bildschirm.
  • Safe Zone – die nicht offensichtliche. Platziere Untertitel im vertikalen Mittelband, nicht unten. Die Benutzeroberfläche der Plattform (Symbole am rechten Rand, untere Bildschirmtitel/CTA/Profil) bedeckt die unteren ~15–20 % und den rechten Rand. Halte Untertitel und Schlüsseltext im zentralen ~80 % des 1080x1920-Bildes. Unten eingebrannte Untertitel werden hinter den TikTok-Buttons versteckt – das ist die häufigste Ursache für „meine Untertitel sind kaputt“.

Minimaler .ass-Style-Block (vollständige Vorlage in 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 (das nachfolgende 640) hebt die Zeile in das Mittelband; die starke Outline (5) sorgt für Lesbarkeit auf jedem Hintergrund.

Remotion-Route: Wenn du dich in einem Remotion-Projekt befindest, verwende @remotion/captions – createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds }) paginiert die Tokens. Niedrig (200–500 ms) = wortgenaues Einblenden; hoch (1200–2000 ms) = Phrasenseiten. durationMs der Seite wurde in v4.0.261 hinzugefügt. CapCut-Route: Text → Auto-Untertitel → Generieren, dann neu gestalten.

Beat-Synchronisation

Ein Beat-Raster (Schritt 4) ist eine Liste von Sekunden. Richte deine Schnittpunkte und Zoom-Keyframes am nächsten Beat aus, damit Bewegungen auf die Musik treffen.

  • Schlecht → Gut. Ein Schnitt mitten im Wort, um genau auf einen Beat zu treffen, wirkt wie ein Fehler → rücke den Schnitt auf den nächsten Beat, der auch die Sprachgrenze respektiert. Ehre zuerst die Wörter, dann den Beat.
  • Wann NICHT auf den Beat schneiden. Eine Talking-Head-Erklärung, bei der die Wörter den Wert ausmachen: Klarheit schlägt Rhythmus. Ein Beat-Schnitt mitten im Satz einer Person zerstört ihre Darbietung. Hebe die Beat-Synchronisation für B-Roll-Montagen, Übergänge und musikgeführte Abschnitte auf.
  • Übergänge bleiben günstig und schnell. Harte Schnitte sind die Standardeinstellung. Whip-Pan oder Zoom-Punch nur auf einen Beat. Vermeide 1-Sekunden-Überblendungen in einem 30-Sekunden-Kurzvideo – sie töten das Tempo; ein Kurzvideo lebt von schnellen, harten Schnitten.

Export-Spezifikationen

Der universelle vertikale Master – eine Datei, die auf allen drei Plattformen sauber abgespielt wird:

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 (breite Wiedergabe), +faststart (Web-Streaming beginnt vor vollständigem Download), AAC-LC 48 kHz. Verwende 30 fps; erhöhe auf 60 fps für hochbewegte Shorts.

PlattformVideo-BitrateHinweise
TikTok~2.000–4.000 kbpsdie leichteste der drei
Instagram Reels~3.500–4.500 kbps
YouTube Shorts (1080p)~8.000–15.000 kbpsbis zu ~53.000 für 4K/60

Ein einzelnes 1080x1920 H.264 MP4 @30 fps unter ~250 MB ist überall sicher. Überprüfe vor dem Versand:

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

Erwarte width=1080 height=1920 codec_name=h264. Die vollständigen plattformspezifischen Kodierungsflags und ffprobe-Behauptungen findest du in references/ffmpeg-pipeline.md.

Anti-Patterns

SchlechtWarum es brichtGut
silenceremove als einmaliger FilterEr ist nur für Audio; das Video läuft weiter → Audio/Video-Desynchronisationsilencedetect → Keep-Bereiche invertieren → select+aselect schneidet beide Streams
Wortuntertitel aus Segment-ZeitstempelnHighlight zittert und landet auf dem falschen WortForced-Alignment-Wortstempel (WhisperX / word_timestamps)
Untertitel im unteren 15–20 %-Bereich eingebranntPlattform-UI (Buttons, CTA, Profil) verdeckt siePlatziere sie im vertikalen Mittelband, zentralen ~80 %
Ein Export für alle Plattformen wiederverwendetIrgendwo über/unter dem Bitraten-ZielPlattformspezifische Bitrate oder sicherer universeller Master
1-Sekunden-Überblendungen in einem 30-Sekunden-KurzvideoTötet das Tempo; wirkt langsamHarte Schnitte; Whip/Zoom nur auf einen Beat
Beat-Schnitt eines Talking-Heads mitten im SatzZerstört die Darbietung; Klarheit verlorenBeat-Synchronisation nur für B-Roll/Montage; Sprachgrenzen respektieren
Erneutes Ausführen der Kodierung, um „die Spezifikationen zu prüfen“Verschwendet Minuten; die Datei existiert bereitsffprobe die Ausgabe; prüfen, nicht neu rendern
Hier den Untertiteltext oder den Hook schreibenDas ist das Skript, nicht der SchnittLeite an ../video-shorts/SKILL.md weiter; du brennst nur ein
ffmpeg überschreibt die Quelle direktEin schlechtes Flag und das Original ist wegSchreibe immer in eine neue Datei; lasse in.mp4 unberührt

Überprüfung & Referenzen

  • bash scripts/verify.sh <output.mp4> – führt ffprobe aus und prüft width=1080, height=1920 (9:16), Video-Codec h264, Audio-Codec aac, fps in {30, 60}, und dass eine zugehörige .srt/.ass-Untertiteldatei existiert und nicht leer ist. Ohne ffprobe fällt es auf eine Pfad-/Erweiterungsprüfung zurück. Schreibgeschützt; gibt 0 zurück, wenn das Ziel leer/sauber ist, sodass es nie falsch negativ ist. Das Urteil „fühlt es sich im Takt an“ ist nicht mechanisch – das liegt in der Fähigkeitsbewertung.
  • references/ffmpeg-pipeline.md – die vollständige Silence-Erkennung → Invertierung der Keep-Bereiche → select/aselect-Filtergenerierung, die Video+Audio zusammen schneidet, der concat/trim-Ansatz, plattformspezifische Kodierungsflags, ffprobe-Behauptungen und Fehlerbehebung bei Desynchronisation/Audio-Drift/faststart.
  • references/captions.md – WhisperX-Installation + Ausführung, die JSON-Struktur der Wort-Zeitstempel, die vollständige .ass-Karaoke-Vorlage mit Safe-Zone-Rändern, das Remotion createTikTokStyleCaptions()-Snippet mit combineTokensWithinMilliseconds-Anleitung und der Kompromiss zwischen faster-whisper und 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`).

Verwandte Skills