Ein Video untertiteln
Der Benutzer gibt ein Sprechvideo vor. Er wählt aus dem Untertitel-Stilkatalog, der auf seinem eigenen Material als Vorschau angezeigt wird, und du lieferst das untertitelte MP4. Alles läuft lokal mit HyperFrames. After Effects wird nie benötigt.
Kit: .claude/skills/caption-video/kit/ innerhalb des Studio-Repos. Projekte werden in videos/captions/<name>/ erstellt und fertige Videos landen in out/captions/<name>.mp4 (beides relativ zum Studio-Root).
Vom Studio-Root aus setze K="$PWD/.claude/skills/caption-video/kit" und führe python3 "$K/caption.py" … aus (Pfade in Anführungszeichen; Ordner können Leerzeichen enthalten). Verwende das Studio-Venv-Python (.venv/bin/python), falls numpy/scipy im System-Python fehlen – setup/setup.sh erstellt es.
Ablauf
1. Das Video holen
Wenn kein Videopfad angegeben wurde, frage nach einem. Prüfe, dass es existiert und eine sprechende Person enthält. Führe aus:
python3 "$K/caption.py" new "<Videopfad>" <Kurzname>
Dies kopiert das Video, kodiert es in H.264 um und transkribiert es Wort für Wort mit WhisperX. Der erste Durchlauf nach einer Weile kann eine Minute dauern. Lange Videos benötigen ungefähr Echtzeit ÷ 4.
2. Das Transkript anzeigen
Gib das Transkript aus der Befehlsausgabe in einem lesbaren Block aus. Weise auf wahrscheinliche Fehler hin, insbesondere Markennamen und Fachjargon (Produktnamen, „HyperFrames“, Akronyme), und frage den Benutzer, ob er sie bestätigen oder korrigieren möchte. Korrekturen kommen beim Bauen in --fix "falsch=richtig,…". Wenn das Transkript Kauderwelsch ist oder das Audio keine Sprache enthält, brich ab und sage das. Erfinde keine Wörter für Untertitel.
3. Jeden Stil auf ihrem Material zeigen
Führe python3 "$K/caption.py" styles für die Liste aus und python3 "$K/caption.py" preview <name> für das visuelle Blatt. Das Blatt liegt unter videos/captions/<name>/previews/styles.png. Sieh es dir selbst an, sende es dann mit SendUserFile (Anzeige render). Daneben gib die nummerierte Liste mit der „geeignet für“-Zeile jedes Stils:
- Lime Hook: der Vorlagen-Look (Anton-Großbuchstaben, limettengrünes gesprochenes Wort)
- Karaoke Pop: große 2-Wort-Ausbrüche, gelbes gesprochenes Wort
- One Word: ein riesiges Wort nach dem anderen
- Clean Box: dunkler Text auf weißer Karte, Textmarker auf dem gesprochenen Wort
- Editorial: ruhige Satzschreibung, Schlüsselwörter in kursiver Serife
- Subtitle: kleine vollständige Satzuntertitel
- Neon: cyanfarbenes Leuchten auf dem gesprochenen Wort
Empfehle einen in einer einzigen Zeile basierend auf dem Inhalt: Hype oder Social → 1 oder 2, Erklärvideo oder Werbung → 4, Gründergeschichte oder Premium → 5, Interview oder Podcast → 6, Tech oder KI → 7. Frage dann, ob der Benutzer eine Nummer wählen möchte. Wenn sich der Katalog in caption.py geändert hat, gib das aus, was styles ausgibt, anstatt dieser Kopie.
4. Hook (optional)
Schlage 3 Hooks vor, die aus dem tatsächlichen Gesagten des Sprechers stammen. Beginne mit der überraschendsten Zahl, dem Ergebnis oder Widerspruch, verwende 4–8 Wörter und behalte den Höhepunkt bei einem großen Wort. Formatiere jeden in Hook-Syntax und frage dann mit AskUserQuestion: drei Hook-Optionen plus „Kein Hook“ (der Benutzer kann auch einen eigenen eingeben).
Die Hook-Syntax verwendet eine Zeile pro |, jede beginnt mit ihrem Stil:
s:kursive Serifen-Einleitung („Wie“, „Warum“)c:weiße kondensierte Großbuchstaben-Aufbaub:das große umrahmte Höhepunkt-Wort oder die Zahl (1–2 Wörter)l:limettengrüne Großbuchstaben-Wendungr:kleine kursive Markierung
Beispiel: s:Wie|c:Ich erreichte|b:300k+|l:ohne Werbung|r:Aufrufe. Der Hook muss dem entsprechen, was das Video in den ersten 10 Sekunden liefert.
4b. Polieren (anbieten; ausführen, wenn der Benutzer nach Benotung, saubererem Audio, Trimmen oder Musik fragt)
python3 "$K/polish.py" <name> [--grade clean|cinematic|none] [--music calm|none] [--music-level 1.0] [--denoise 100]
- Trimmen: Schneidet tote Luft vor dem ersten Wort und nach dem letzten weg (behält 0,3 s bzw. 0,9 s) und verschiebt das Transkript entsprechend.
- Benotung:
clean(Standard) sorgt für warme, gesunde Haut, sanften Kontrast und eine weiche Vignette.cinematicist tiefer und kühler. Vergleiche vor der Auswahl einen Frame von jedem mit dem Original und schau ihn dir an. - Stimme: DeepFilterNet3-Rauschentfernung (
~/.venvs/dfn, erstellt von setup.sh; niemals global installieren, es benötigt numpy<2), dann ein Hochpass, Präsenzanhebung, De-Esser und sanfte Kompression. - Musik: ein synthetisiertes ruhiges Klavier- und Pad-Bett. Bei Stufe 1 liegt es etwa 20 dB unter der Stimme in Pausen und etwa 25 dB unter ihr, während gesprochen wird. Verwende
--music-level 0.6für leiser oder1.5für präsenter. - Originale bleiben als
source_orig.mp4/transcript_orig.jsonerhalten, sodass das Polieren mit beliebigen Einstellungen wiederholt werden kann. Führe nach dem Polieren erneutbuildundrenderaus. - Erwähne Stolperer oder Fehlstarts in der Eröffnung („im Moment, im Augenblick…“). Das Wegschneiden erzeugt einen kleinen Sprungschnitt, frage also vorher nach.
5. Bauen, prüfen, rendern
python3 "$K/caption.py" build <name> --style <key> [--hook "…"] [--hot "Wort,Wort"] [--fix "a=b"]
cd "videos/captions/<name>" && npx --yes [email protected] check
python3 "$K/caption.py" render <name>
--hotlistet Wörter auf, die in der Akzentfarbe bleiben. Wähle 2–5 Höhepunkt-Wörter; Zahlen sind automatisch hot.check-Kontrastwarnungen im Moment des Hook-Ausblendens sind zu erwarten. Behebe echte Fehler vor dem Rendern.- Erstelle vor dem Rendern eines Hooks einen Schnappschuss (
npx --yes [email protected] snapshot . --at 1.6 --no-end --describe false) und prüfe, dass er das Gesicht nicht verdeckt. Wenn das Gesicht hoch im Bild ist (sitzend oder amerikanische Einstellung), verschiebe den Hook auf die Brust mit--hook-y 0.43; die Schattierung folgt automatisch. - Ziehe vor dem Senden 3–4 Frames aus
out/captions/<name>.mp4und schau sie dir an. Untertitel dürfen Mund oder Augen nicht verdecken. Wenn doch, baue mit--cap-yneu (höhere Zahl = tiefer auf dem Bildschirm). - Seitlich gefilmtes Material (eine Kamera auf die Seite gedreht, ohne Rotationsmetadaten) zeigt die Person im Kontaktblatt auf der Seite liegend. Drehe es zuerst (
ffmpeg -vf transpose=2= 90° gegen den Uhrzeigersinn, odertranspose=1= im Uhrzeigersinn; prüfe einen Frame) nachvideos/_caption-inputs/und führe dannnewauf dieser Datei aus. - Sende das MP4 mit
SendUserFileund gib den Pfad als Link an.
6. Überarbeitungen
Einstellungen bleiben in videos/captions/<name>/caption.json erhalten, eine Überarbeitung ist also nur build <name> --<option> … gefolgt von render <name>. Häufige Wünsche:
- Anderer Stil:
--style. - Größer oder kleiner:
--size 1.2. - Höher oder tiefer:
--cap-y 0.7. - Weniger Wörter pro Untertitel:
--words 2. - Andere Farbe:
--accent "#FF4D3D". - Hook ändern:
--hook;--hook ""entfernt ihn. - Hook-Länge:
--hook-dur 3.5.
Sie können das Projekt auch selbst in HyperFrames Studio öffnen mit cd videos/captions/<name> && npm run dev.
Setup-Fakten (falls etwas kaputtgeht)
- Die Transkription ruft
~/.claude/skills/embedded-captions/scripts/transcribe.cjsmitHYPERFRAMES_ROOT=~/.hyperframes-rootauf, eine HyperFrames CLI 0.8.147-Installation mit einempackages/cli/dist/cli.js-Symlink auf. Fehlt eines, installiere neu:npx hyperframes skills update embedded-captions, baue dann~/.hyperframes-rootneu (npm install[email protected]und symlinkenode_modules/hyperframes/dist/cli.jsnachpackages/cli/dist/cli.js). - Schriftarten liegen in
kit/fonts/(alle SIL OFL) und werden in jedes Projekt kopiert. setup/doctor.shprüft jede Komponente unten;setup/setup.shrepariert sie.- Untertitel, die hinter der Person liegen, sind mit dem
/embedded-captions-Workflow möglich, aber viel langsamer (etwa 4 Minuten pro 10 Sekunden) und benötigenHYPERFRAMES_ROOT. Biete es nur an, wenn danach gefragt wird.