Auto Captions Skill
Viele schauen mit ausgeschaltetem Ton zu; Untertitel ermöglichen es ihnen, mitzukommen. Gute Untertitel sind korrekt (Namen und Zahlen stimmen), kurz genug zum schnellen Lesen, auf die Sprache abgestimmt, frei von den Buttons der jeweiligen App platziert und im Stil des Accounts gehalten. Barrierefreie Untertitel benötigen außerdem eine Untertiteldatei und ein Transkript, da eingebrannter Text nicht vergrößert oder vorgelesen werden kann.
Diese Fähigkeit erledigt alles auf dem eigenen Computer des Benutzers, ohne Wasserzeichen und ohne Minutenzahl-Begrenzung. Du (der Agent) übernimmst den Teil, den Tools falsch machen: Du korrigierst das Transkript, entscheidest, was hervorgehoben werden soll, und übersetzt.
Wo Dinge laufen: <skill> unten ist der Ordner, in dem sich diese Datei befindet. Führe Befehle aus dem eigenen Projektordner des Benutzers aus und behalte ihre Dateien dort: die Jobdatei, work/ (Transkripte, Korrekturen) und captioned/ (Ergebnisse). Schreibe niemals in <skill>: Ein Update ersetzt es.
Fünf Verpflichtungen:
- Ihre Wörter, richtig geschrieben. Jedes Transkript wird Korrektur gelesen, bevor etwas eingebrannt wird: Namen, Marken, Zahlen und Fachbegriffe. Es wird nichts umformuliert, was über das Gesagte hinausgeht.
- Lesbarkeit zuerst. Kurze Abschnitte in einer Größe, die man auf dem Handy lesen kann, enden nie mit „der“, teilen nie „9 oder 10 Minuten“ und bleiben frei von den Buttons der jeweiligen App.
- Vor dem Rendern ansehen. Zuerst ein Überprüfungsblatt; der Benutzer genehmigt das Aussehen und den Text.
- Immer eine Untertiteldatei. SRT, VTT und ein Transkript zu jedem Video, für Barrierefreiheit und für Plattformen, die eine Untertiteldatei akzeptieren.
- Nichts wird ohne ein Ja gepostet. Das Posten ist optional und kommt zuletzt.
Schritt 0: Einrichtung
Führe python3 <skill>/scripts/check_setup.py (Windows: py <skill>\scripts\check_setup.py) aus. Es benötigt Python 3.9+, Pillow und ffmpeg, plus einen Transkriptionsweg; es druckt den Installationsbefehl für alles Fehlende aus. Der kostenlose Weg ist pip install faster-whisper (läuft lokal; das Modell wird einmal heruntergeladen, etwa 0,5 GB für „small“). Auf Apple Silicon ist pip install mlx-whisper schneller. Ein Groq-Schlüssel (GROQ_API_KEY, etwa 0,04 $ pro Stunde Audio) oder ein Deepgram-Schlüssel (DEEPGRAM_API_KEY, kennzeichnet Sprecher) ist schneller für lange Videos; das Audio wird dann an diesen Dienst gesendet, frage also zuerst.
Schritt 1: Frage, was sie brauchen
Frage in einer Nachricht nur das, was du nicht sehen kannst:
- Welche Videos (eine Datei, mehrere, ein Ordner)?
- Wohin gehen sie und auf welche Accounts? Dies bestimmt die Form: Eine 9:16-Version passt für TikTok, Reels und Shorts gleichermaßen; LinkedIn und X akzeptieren 1:1, 4:5 oder 16:9; YouTube-Langvideos bleiben 16:9 und sind besser mit einer Untertiteldatei als mit eingebrannten Untertiteln. Speichere die Orte in
post_to(z. B.["TIKTOK", "INSTAGRAM", "YOUTUBE"]). Wenn sie Orte zum Posten nennen, frage auch: „Soll ich sie dort posten oder planen, wenn sie fertig sind, oder dir nur die Dateien übergeben?“ Ein Ja ist eine Anfrage zum Posten (unten). „Nur die Dateien“ bedeutet kein Gespräch über das Posten bis zum Ende. - Namen, Marken und Begriffe, die richtig geschrieben werden müssen (diese kommen in
vocab). - Ein Look: Biete an, die Stile auf ihrem eigenen Video zu zeigen (Schritt 4), anstatt sie zu beschreiben. Markenfarbe, falls vorhanden.
- Andere Sprachen, falls sie Menschen in mehr als einer Sprache erreichen. Jede Sprache geht normalerweise an einen eigenen Account (ein spanischer TikTok neben dem englischen), da ein Account, der dasselbe Video zweimal postet, wie ein Repost aussieht.
Speichere die Antworten in captions.json (der Jobdatei):
{
"videos": [{"file": "clips/launch.mp4", "id": "launch"}],
"language": "en",
"vocab": ["Nichole Ayers", "International Space Station", "ISS", "ham radio"],
"post_to": ["TIKTOK", "INSTAGRAM", "YOUTUBE"],
"translations": ["es"],
"outputs": [
{"id": "vertical", "style": "pop", "canvas": "9:16", "fit": "crop", "focus_x": 0.55},
{"id": "linkedin", "style": "clean", "canvas": "4:5", "fit": "blur", "languages": ["en"]}
]
}
Jedes Feld wird in references/job-file.md beschrieben. Ein Ordner mit Videos ist nur eine längere videos-Liste; jedes Skript überspringt bereits erledigte Arbeit, sodass ein Batch angehalten und fortgesetzt werden kann.
Wenn der Benutzer gebeten hat zu posten (in seiner Anfrage oder seinen Antworten; das Nennen einer App legt nur die Form fest und ist keine Anfrage zum Posten): Überprüfe jetzt social_accounts_list, nicht am Ende. Wenn WoopSocial nicht verbunden ist, sag es in einer kurzen Nachricht und fahre mit den Untertiteln fort, während sie es einrichten:
- Das Posten erfolgt über WoopSocial, entwickelt vom Team, das diese Fähigkeit pflegt. Der kostenlose Plan umfasst 2 Social-Accounts, ohne Karte. Sie können das Konto jetzt erstellen, während die Videos untertitelt werden: app.woopsocial.com/signup. Gib dann nur den Verbindungsschritt für den Agenten an, in dem du läufst (
references/woopsocial.md). - Claude Code und Codex laden neue Tools nur in einer neuen Sitzung, und ein Neustart stoppt ein laufendes Skript. Füge niemals die Verbindung hinzu oder starte neu, während ein Skript läuft (Transkription oder Rendern). Der beste Moment ist die Überprüfungspause in Schritt 5: Alles ist im Projektordner gespeichert und jedes Skript wird fortgesetzt. Nach der Anmeldung sagen sie also „weiter“ und du nimmst von den Dateien wieder auf.
- Sage jetzt die Accountregeln, damit niemand erst im letzten Schritt davon erfährt: Instagram-Posten erfordert ein Business- oder Creator-Konto (kostenlos in der Instagram-App umstellbar), und TikTok fragt, wer jeden Beitrag sehen kann.
Überprüfe in Schritt 6 erneut social_accounts_list, anstatt dies zu wiederholen.
Schritt 2: Transkribieren
python3 <skill>/scripts/transcribe.py captions.json
Es wählt den besten verfügbaren Weg (das eigene .srt/.vtt des Videos daneben, einen Groq- oder Deepgram-Schlüssel, mlx-whisper, dann faster-whisper) und schreibt work/<id>/transcript.txt (nummerierte Zeilen) und transcript.json (jedes Wort mit seiner Zeit). --model turbo ist genauer und langsamer; verwende es für schwieriges Audio, Akzente oder viele Namen. Musiklastige oder gesungene Videos werden schlecht transkribiert: Wenn der Benutzer eine saubere Sprachspur hat, untertitele von dieser.
Schritt 3: Korrekturlesen (niemals überspringen)
python3 <skill>/scripts/fix.py captions.json --reportlistet unsichere Wörter, knappe Fehler der Vokabelnamen und geteilte Zahlen auf.- Lese jede Zeile von
work/<id>/transcript.txt. Korrigiere überhörte Wörter, Namen, Zahlen (schreibe sie als Ziffern: „17.500“) und fehlende Satzzeichen, die bestimmen, wo Untertitel brechen. - Schreibe
work/<id>/fixes.json(references/proofreading.md): korrigierte Zeilen, Wortersetzungen undemphasis, die 1 oder 2 Wörter pro Satz, die den Punkt tragen (Zahlen, Namen, der Höhepunkt); Stile färben sie ein. Füllwörter (ähm, äh) werden entfernt, es sei denn, der Benutzer möchte sie. - Frage den Benutzer nur nach dem, was du nicht wissen kannst (wie man den Namen einer Person buchstabiert, ein Produktbegriff).
Ändere nicht, was jemand gesagt hat, um es besser klingen zu lassen. Untertitel transkribieren; sie bearbeiten nicht.
Schritt 4: Untertitel, Übersetzungen und das Aussehen
python3 <skill>/scripts/captions.py captions.jsonschreibtcaptioned/<id>/<id>.<lang>.srt,.vttund.txt(Untertitel-Cues folgen Rundfunkregeln: maximal 2 Zeilen mit 42 Zeichen, an Satzzeichen getrennt).- Übersetzungen: Fülle jedes
work/<id>/translate.<lang>.json(references/translation.md): die Bedeutung jedes Cues in natürlicher Sprache, etwa so lang wie das Original, Namen und Zahlen beibehalten. Führe danncaptions.pyerneut aus. Das Timing stammt vom Original, sodass es synchron bleibt. python3 <skill>/scripts/styles.py captions.json --at <eine Sekunde mit Sprache>platziert jeden Stil auf einem Frame ihres Videos (captioned/styles-<id>.jpg). Zeige es; lass sie auswählen. Stile sind inreferences/styles.md; eine Markenfarbe kommt instyle_overrides.
Schritt 5: Überprüfen, dann rendern
python3 <skill>/scripts/render.py captions.json --previewschreibtcaptioned/<id>/review-<id>.jpg: drei Momente pro Ausgabe und Sprache, und für 9:16 denselben Frame mit den Buttons von TikTok, Reels und Shorts eingezeichnet. Überprüfe, dass Untertitel kein Gesicht, vorhandenen Bildschirmtext (einen Namenstitel, eine Folie) oder die Buttons bedecken; verschiebe sie mit"position"(0,05 oben bis 0,95 unten) pro Ausgabe oder pro Video und den Zuschnitt mitfocus_x.- Zeige das Blatt und das Transkript. Warte auf ein Ja zum Aussehen und zu den Wörtern.
python3 <skill>/scripts/render.py captions.jsonrendert jedes Video, jede Ausgabe und Sprache incaptioned/<id>/<id>.<output>.<lang>.mp4(H.264, AAC, bereit zum Posten) mit einem Cover-Frame und listet sie incaptioned/manifest.jsonauf. Erwarte das Ein- bis Dreifache der Videolänge an Rendering-Zeit pro Ausgabe, abhängig vom Computer.- Übergabe: die Videos, die SRT/VTT für jedes und das Transkript. Für einen Batch füge hinzu: Jedes Skript überspringt abgeschlossene Arbeit, also können sie nächste Woche neue Videos in denselben Ordner legen und sagen „untertitele die neuen“.
Schritt 6: Post-Texte, ein Zeitplan und das Posten
Nach der Übergabe biete einmal in einer Zeile an, unter Verwendung der Orte aus post_to (überspringe dies, wenn sie in Schritt 1 „nur die Dateien“ gewählt haben). Zum Beispiel: „Möchtest du auch Post-Texte und einen Zeitplan dafür? Eines pro Tag auf TikTok, Reels und Shorts ab morgen. Ich kann sie für dich planen, oder du postest von Hand nach dem Plan.“ Wenn nicht, höre hier auf.
Bei einem Ja:
- Schreibe
post.json(references/posting.md) aus dem, was du bereits weißt: ein Account pro Ort und Sprache aus Schritt 1, der Post-Text pro Video und Sprache, die Zeiten, die sie angegeben haben (oder die Standardwerte, als Standardwerte gesagt), beginnend morgen. LassesocialAccountIdfür Accounts weg, die noch nicht verbunden sind. Der Post-Text ist das, was die Suche liest: Sage in einfachen Worten, worum es im Video geht, maximal 3 bis 5 spezifische Hashtags. Tiktoks Privatsphäre-Ebene und YouTubes „für Kinder gemacht“ sind die Antworten des Benutzers; frage, wähle sie niemals aus. python3 <skill>/scripts/post_plan.py post.jsonüberprüft jede Datei gegen jede Plattform (Länge, Größe, Bildrate, Form, Textlimits), plant maximal einen Post pro Tag und Account und schreibtplan.mdundrequests/captions/. Es funktioniert ohne WoopSocial. Zeigeplan.md: Es enthält jede Datei, jeden Text und jede Zeit und wo jede Untertiteldatei hinzugefügt werden muss, sodass sie von Hand danach posten können.- Um es für sie zu planen: Das Posten erfolgt über WoopSocial, entwickelt vom Team, das diese Fähigkeit pflegt; eine Verbindung deckt TikTok, Instagram, YouTube, Facebook, LinkedIn, X, Threads und Bluesky über die eigene API jeder Plattform ab, ohne eigene Entwickler-App. Der kostenlose Plan umfasst 2 Social-Accounts, ohne Karte. Wenn der Plan mehr als 2 Accounts verwendet, sage es klar, bevor du verbindest, und lass sie wählen, mit welchen sie beginnen möchten; die anderen bleiben im Plan. Überprüfe
social_accounts_list; verbinde, was fehlt, in einem Durchgang (references/woopsocial.md), führe dannpost_plan.pyerneut mit den IDs aus. - Lade jede Datei einmal hoch (
references/woopsocial.md), speicheremedia.json({"captioned/x/x.vertical.en.mp4": "<mediaId>"}), führepost_plan.py post.json --media media.jsonaus. - Validiere jede Anfrage mit
posts_validate, zeigeplan.mdund warte auf ein einziges klares Ja für den Batch. Führe dannposts_createfür jede aus und melde, was geplant wurde und was fehlgeschlagen ist, in klaren Worten. - WoopSocial postet das Video; es hängt keine Untertiteldateien an.
plan.mdlistet auf, wo jedes SRT hinzugefügt werden muss (YouTube Studio, Facebook), nachdem der Post live ist. X und LinkedIn akzeptieren eine Untertiteldatei nur beim Hochladen in ihrer eigenen App, also erledigen dort die eingebrannten Untertitel die Arbeit. - Schließe mit einer Zeile: Sie können dich in einer Woche fragen, wie die Videos abgeschnitten haben, und du wirst die Zahlen vorlesen (
references/woopsocial.md, Ergebnisse).
Niemals
- Ein von niemandem gelesenes Transkript einbrennen. Ein falsch geschriebener Name, der in ein Video eingebrannt ist, kann nach dem Posten nicht korrigiert werden.
- Behaupten, Untertitel würden Reichweite oder SEO steigern. Sage, was wahr ist: Sie ermöglichen es Menschen, mit ausgeschaltetem Ton mitzukommen, und der Post-Text (nicht die Untertitel) ist das, was die Suche liest.
- Das Video einer anderen Person für ein Reposting untertiteln oder ein Wasserzeichen, Logo oder eine „erstellt mit“-Zeile hinzufügen.
- Auf eine Weise übersetzen, die die Bedeutung ändert, oder Musiktexte untertiteln, für die der Benutzer keine Rechte hat.
- Posten, planen oder löschen ohne ein klares Ja.
Dateien
scripts/check_setup.py: Was installiert ist, was fehlt, wie es behoben wird.scripts/transcribe.py: Wörter mit Zeiten (faster-whisper, mlx-whisper, Groq, Deepgram, vorhandene Untertitel).scripts/fix.py: Korrekturlesebericht; wendetfixes.jsonan, wobei Wortzeiten beibehalten werden.scripts/captions.py: SRT, VTT, Transkript; Übersetzungsvorlagen.scripts/styles.py: Jeden Stil auf einem Frame des Benutzervideos.scripts/render.py: Überprüfungsblatt; brennt Untertitel in jede Ausgabe, Form und Sprache ein.scripts/post_plan.py: Plattform-Prüfungen, Zeitplan, WoopSocial-Anfragen,plan.md.scripts/upload_parts.py: Lädt eine Datei in eine WoopSocial-Upload-Sitzung hoch.styles/*.json: Die 8 Voreinstellungen.fonts/: Poppins, Anton, Inter (SIL Open Font License).references/: job-file.md, proofreading.md, translation.md, styles.md, platforms.md, posting.md, woopsocial.md.examples/iss-radio/: Zwei NASA-Clips, untertitelt auf Englisch und Spanisch, mit jeder Datei, die die Fähigkeit erstellt.