CommunityCodierung & Entwicklunggithub.com

bounce12340/josh-video-skills

Erstellt vertikale Reels aus Interviews/Vorträgen mit Kommentar (Fox Hsiao-Stil), inklusive Voice-Over, Untertiteln und Clips der Originalredner.

Was ist josh-video-skills?

Dieses Skill-Paket generiert automatisch vertikale Kurzvideos (Reels) im Stil von Fox Hsiao, die Interview- oder Vortragsausschnitte mit erklärendem Voice-Over kombinieren. Es unterstützt sowohl Chinesisch (mit einer benutzerdefinierten ElevenLabs-Stimme) als auch Englisch („Sarah Explains“). Der Workflow beginnt mit einer JSON-Spezifikation, die alle Parameter enthält, und führt dann automatisiert Schritte wie Clip-Auswahl, Transkription, Voice-Over-Generierung, B-Roll-Suche und Videomontage durch. Das Ergebnis ist ein fertiges 1080x1920-Video (max. 3 Minuten, unter 45 MB) mit chinesischen Hauptuntertiteln und englischen Zusatztexten, einer Kontaktblatt-Übersicht, Credits und einem Cover. Das Skill läuft auf Plattformen wie Claude Code, Cursor oder Codex und nutzt lokale Python-Skripte sowie Tools wie yt-dlp, easier-whisper und die ElevenLabs-API. Die Einhaltung von Urheberrechtsregeln (fair use) und Qualitätskontrollen sind fest integriert.

Funktioniert mit✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/bounce12340/josh-video-skills/tree/HEAD/interview-reel

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

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

Dokumentation

interview-reel: Reel aus Interviews/Vorträgen (Fox Hsiao-Stil)

Josh 2026-10-12 genehmigt: Für Interview-Reels den Fox-Stil verwenden, mit erklärenden Passagen und 15-30-Sekunden-Originalausschnitten (mit Quellenangabe). Dieses Skill erstellt nur Entwürfe, keine finalen Posts. Das Posten übernimmt immer der Haupt-Bot nach Josh's Freigabe.

  • Skripte: <SKILLS_DIR>/interview-reel/scripts/ (im Folgenden $S)
  • Beispiel-Spezifikation: examples/mcp_test.spec.json (Anthropic offizielles MCP-Interview, Testvideo)
  • Referenz-Endprodukt: <YOUR_WORKSPACE>/media-team/03-drafts/interview-reel-test/test.mp4
  • Referenzvideos: <YOUR_WORKSPACE>/refs/ig-DeWJjxJyoEb/ (Fox Hsiao, Musk Terafab, zu kopierendes Format), <YOUR_WORKSPACE>/refs/ig-DWVQfDmE41Z/ (AI Post, Huang Jen-Hsun, nur Originalton, einfach, NICHT kopieren – keine Quellenangabe)
  • Verwendet: common.py aus stock-footage-reel (Schriftarten, Downloads), synth_music.py (eigene Musik), Pexels-Cache; venv von OpenMontage (faster-whisper, yt-dlp) und elevenlabs_tts; Cover <YOUR_WORKSPACE>/media-team/00-profile/covers/render.py.

Format (basierend auf Fox Hsiaos Video)

AbschnittBildTon
Hook (0 bis ca. 11 Sekunden)Vollbild 9:16 B-Roll (abgedunkelt, langsame Zoom-in), alle 1 bis 2,5 Sekunden wechselnd; oben links große Textkarte (roter kleiner Kategorie-Tag + zwei Zeilen großer fetter Text, wichtige Wörter orange)Voice-Over (Chinesisch <YOUR_VOICE_NAME> / Englisch Sarah Explains) + Musik
clip (Originalton, jede 15 bis 30 Sekunden, 3 bis 4 Stücke)16:9 Original zentriert (y=468), oben und unten mit demselben Bild unscharf abgedunkelt; oben links kleiner Text „Video / Originalkanal“; unter dem Original roter „Originalton“-Tag + „Englischer Name · Chinesischer Name oder Rolle“ + „AnlassYYYY.MM.DD“
explainer (Erklärung, zwischen den Clips)Wie Hook, Textkarten durch Faktenkarten ersetzt, unten kleiner Text „Quelle: WerDatum“; alle 2 bis 3,2 Sekunden wechselnd
OutroZentrierte große Frage (wichtige Wörter gelb) + Markenzeichen + @bounce12340 + ganz unten eine Zeile QuellenangabeVoice-Over fragt das Publikum (Chinesisch <YOUR_VOICE_NAME> / Englisch Sarah Explains)

Gemeinsam für das ganze Video: Feste Titelzeile oben (Markenzeichen + einzeiliger Titel, wichtige Wörter orange); Untertitel zentriert, großes traditionelles Chinesisch (weiß, fett, leichter Schatten, wichtige Wörter gelb) + darunter eine Zeile klein Englisch. In den Erklär-Abschnitten ist das Englisch der Originaltext des Voice-Overs; in den Originalton-Abschnitten ist das Englisch die Transkription des Redners, Chinesisch unsere Übersetzung.

Hausregeln (müssen befolgt werden)

  • 1080x1920, unter 3 Minuten, IG-Endprodukt unter 45 MB (sonst automatische Bitratenreduzierung), H.264/AAC.
  • Voice-Over: ElevenLabs-Stimme je nach Sprache. Chinesisch: „<YOUR_VOICE_NAME>“ (<YOUR_ELEVENLABS_VOICE_ID>); Englisch: Sarah Explains (Nhs7eitvQWFTQBsf0yiT). Modell eleven_multilingual_v2. Verwendet elevenlabs_tts von OpenMontage. Der API-Key ist die Umgebungsvariable ELEVENLABS_API_KEY (wird nur mit bash -lc übergeben), nicht ausdrucken oder in Dateien speichern.
  • Untertitel: Traditionelles Chinesisch als Hauptuntertitel + kleines Englisch. Taiwanesische Begriffe (軟體, 資料, 影片, 網路, 運算資源…). Anführungszeichen: 「」. Keine Gedankenstriche (wird von build.py blockiert).
  • Erklärung dominiert: Originalton insgesamt unter 40%, über 50% wird von build.py direkt blockiert. Jeder Originalton-Clip max. 30 Sekunden (wird von prep_clips.py blockiert), empfohlen 15 bis 30 Sekunden.
  • Originalton-Abschnitte: Kein Voice-Over, keine Änderung des Originaltextes des Redners; die chinesische Übersetzung muss dem Original treu bleiben, keine Schlussfolgerungen für den Redner hinzufügen.
  • Quellentreue: Zahlen, Daten in der Erklärung müssen auf die Primärquelle zurückgehen; Textkarten mit cite „Quelle: Wer | Datum“ versehen und in facts.md aufnehmen.
  • Das Ende MUSS eine Frage an das Publikum stellen (outro.question muss „?“ enthalten).
  • Cover: Mit covers/render.py, cover.template standardmäßig "E" (Porträt, von Josh als „D Personen-Porträt“ bezeichnet). Josh hat vor dem 2026-10-12 entschieden: Alle Interview-Reels verwenden diese Vorlage.

Quellen & Lizenzierung (in credits.json jedes Videos)

  1. Bevorzugt offizielle Quellen: Firmenkanäle (Anthropic, OpenAI, NVIDIA, Microsoft…), Veranstalter (GTC, Build, TED…), Podcast-eigene Kanäle. Im channel-Feld der Spezifikation den Originalkanal angeben; prep_clips.py vergleicht mit dem YouTube-Kanal und warnt bei Abweichungen.
  2. Auf keinen Fall Nachdrucke / Versionen mit fremden Wasserzeichen verwenden (z. B. von Fanpages neu hochgeladen, von anderen Accounts geschnittene Clips, Clips mit fremden Logos). Wenn keine offizielle Version gefunden wird, diesen Abschnitt nicht machen.
  3. Quellenangabe im Bild zwingend: Unter dem Originalton „Originalton Name | Anlass | Datum“ + oben links „Video / Originalkanal“; am Ende noch einmal klein; in der Post-Beschreibung den caption_credits aus credits.json einfügen.
  4. credits.json zeichnet automatisch auf: Quell-URL, Kanal, Kanal-URL, Videotitel, Upload-Datum, verwendete Start-/Endzeit (source_in/source_out), Position im Endvideo, URLs und Autoren der B-Rolls, Voice-Over, Musik.
  5. Lizenzhinweis: Das Urheberrecht an diesen Interviewausschnitten liegt beim Originalkanal. Wir haben keine Lizenz erworben, sondern berufen uns auf „Kommentar, Zitat“ im Rahmen des Fair Use (Taiwanesische Urheberrechtsgesetze Art. 52, 65). Dies ist eine Grauzone. Daher: Jeder Clip kurz; das gesamte Video konzentriert sich auf Josh's Kommentare und Zusammenfassung (transformativ); Originalton nur als Beleg; keine ganzen Abschnitte übernehmen; nichts so schneiden, dass der Redner etwas nicht Gesagtes zu meinen scheint.
  6. Keine implizite Unterstützung: Nicht „Empfohlen von…“, „Offizielle Zusammenarbeit“ o. Ä. schreiben; Cover und Titel sollen nicht den Eindruck erwecken, der Redner unterstütze Josh oder seine Produkte.
  7. Downloads: Nur yt-dlp für öffentliche Videos verwenden, kein Login, keine Cookies, keine Bezahlschranken oder Regionssperren umgehen. --download-sections von YouTube führt auf diesem Rechner zu 403, daher lädt prep_clips.py das ganze Video (max. 1080p) in den cache/sources/-Ordner und schneidet es mit ffmpeg zu.
  8. Wenn der Originalkanal die Löschung verlangt oder Josh Bedenken hat, nur mit Textzitaten arbeiten, ohne Video.

Ablauf

D=<YOUR_WORKSPACE>/media-team/03-drafts/<Thema>-interview ; mkdir -p $D/work
cp $S/../examples/mcp_test.spec.json $D/spec.json      # Auf aktuellen Inhalt anpassen
bash -lc "source <SKILLS_DIR>/OpenMontage/om-env.sh >/dev/null; cd $S; python prep_clips.py --spec $D/spec.json --work $D/work"
  1. Clips auswählen: Zuerst die Kapitel des Originalvideos lesen (yt-dlp --print description). Im offiziellen Video 15-30-Sekunden-Ausschnitte wählen, in denen der Redner einen wichtigen Punkt vollständig darstellt. Transkription mit prep_clips.py; zum Probehören das ganze Video herunterladen und einen kleinen Ausschnitt mit ffmpeg schneiden.
  2. prep_clips.py: Download, zuschneiden, transkribieren (faster-whisper medium, CPU: 20-Sekunden-Clip ca. 10 Sekunden). Gibt eine "subs"-Vorlage aus: Diese zurück in den Clip kopieren, zh in taiwanesisches Chinesisch übersetzen. Zeilen können zusammengeführt oder geteilt werden (t ist die Sekunden relativ zum Clip-Start). Englisch so lassen, wie der Redner spricht; bei Zweifeln an der Transkription nochmal anhören oder mit einem anderen Modell gegenprüfen (--retranscribe --model small).
  3. tts.py: Eine Audiodatei pro Zeile; derselbe Text wird nur einmal gesendet (gecacht per Hash in cache/tts/). Zuerst --dry-run ausführen, um die Zeichenanzahl zu sehen. Fallback bei Fehler: user-Elevenlabs-Connector creative_generate_speech (generations_count: 1), in den ausgegebenen Cache-Pfad speichern.
  4. fetch_broll.py: Pro Schlüsselwort 3 Videos von Pexels holen (Querformat bevorzugt, Schlüsselwörter genauer). Konkrete Bilder verwenden („Server-Rack-Lichter“, „Programmierer beim Codieren“), keine abstrakten Begriffe. In der Zeile kann auch "image" (Standbild, langsamer Zoom-in) oder "file" (z. B. Screen-Recording einer Webseite) angegeben werden.
  5. build.py --check: Gibt Videolänge, Originalton-Anteil, Untertitelzeiten und Regelverstöße aus.
  6. build.py: Video rendern. Oder alles auf einmal: bash $S/run.sh $D/spec.json $D <name> (Untertitel müssen vorher übersetzt sein).

Spezifikationsfelder

{
  "title": "Fester Titel oben, [[wichtig]] wird orange",
  "voice": {"voice_id": "Nhs7eitvQWFTQBsf0yiT", "model": "eleven_multilingual_v2"},  // Englisch Sarah Explains; Chinesisch: <YOUR_ELEVENLABS_VOICE_ID> (deine chinesische Stimme)
  "music": "synth",            // Eigene synthetische Musik; oder Dateipfad (mit music_license); oder "none"
  "music_db": -19,             // Grundlautstärke der Musik
  "clip_music_db": -8,         // Musik noch leiser während der Originalton-Clips (dB)
  "gap": 0.28,                 // Pause nach jedem Voice-Over-Satz (Sekunden), Überschreibung pro Zeile mit line.pause
  "max_cut": 3.2,              // Maximale Bildwechsel alle X Sekunden in Erklär-Abschnitten (Hook standardmäßig 2.4, Überschreibung pro Segment mit seg.max_cut)
  "segments": [
    {"type": "hook", "broll": ["Schlüsselwort"], "lines": [
      {"en": "Voice-Over Englisch", "zh": "Untertitel Chinesisch", "card": {"tag": "Kleiner roter Tag", "text": "Erste Zeile\nZweite Zeile[[wichtig]]", "cite": "Quelle: …|YYYY.MM.DD"}}
    ]},
    {"type": "clip", "url": "https://www.youtube.com/watch?v=…", "channel": "Originalkanal", "official": true,
     "in": 147.1, "out": 166.75, "speaker_en": "David Soria Parra", "speaker_zh": "MCP-Mitbegründer",
     "event": "Anthropic offizielles Interview", "date": "2025.12.11", "highlight": ["gelb zu machendes chinesisches Wort"],
     "subs": [{"t": [0.0, 3.56], "en": "Originaltext des Redners", "zh": "Taiwanesische Übersetzung"}]},
    {"type": "explainer", "broll": ["…"], "lines": [
      {"en": ["Absatz eins,", "Absatz zwei."], "zh": ["Untertitel eins", "Untertitel zwei"], "broll": ["Schlüsselwort für diesen Satz"], "card": {…}}
    ]},
    {"type": "outro", "tag": "Hinterlasse einen Kommentar", "question": "Große Frage erste Zeile\nZweite Zeile[[wichtig]]?", "broll": ["…"], "lines": [{"en": "…", "zh": "…"}]}
  ],
  "cover": {"template": "E", "ep": "EP.13", "kicker": "…", "title": "…\n[[…]]", "subtitle": "…", "frame": {"clip": 1, "t": 4.0}}
}
  • en / zh können ein String oder eine gleich lange Liste sein (Liste = derselbe Voice-Over-Satz, aufgeteilt in mehrere Untertitel, Zeit proportional zur englischen Zeichenanzahl).
  • card wird innerhalb desselben Abschnitts für den nächsten Satz übernommen, bis eine neue Karte kommt; "card": false löscht sie.
  • Wenn zh zu lang ist, wird automatisch bei „,“ getrennt; manuell mit \n. Wichtige Wörter mit [[ ]] oder hl-Liste kennzeichnen.
  • cover.frame: Für das Cover den X-ten Originalton-Clip zur Sekunde Y (rohes 16:9-Bild) verwenden. Andere Felder der E-Vorlage (photo_side, visual_pos, brightness, tag) nach covers/README.md.
  • Chinesischer Name: Wenn der Redner einen allgemein üblichen chinesischen Namen hat (z. B. 黃仁勳, 馬斯克), diesen verwenden; ansonsten die Rolle (z. B. „MCP-Mitbegründer“). Keine eigenen Umschriften erstellen.

Ausgabe (OUT)

<name>.mp4, preview_720p.mp4 (für Josh zum Ansehen im Chat), contact_sheet.jpg (ein Bild pro Kameraeinstellung), credits.json, timeline.json, cover_reel.png / cover_post.png, cover_spec.json.

Selbstcheck vor Abgabe

  1. Mit Read contact_sheet.jpg prüfen: Überschneiden sich Textkarten, Untertitel, Originalton-Tags? Werden sie von der IG-Oberfläche verdeckt (oben 220px, unten 380px, rechts 130px)?
  2. Originalton-Untertitel: Englisch stimmt mit dem Original des Redners überein, Chinesisch verfälscht die Bedeutung nicht. Bei unsicheren Transkriptionsstellen Josh zum Anhören markieren.
  3. ffprobe für Länge und Dateigröße; Originalton-Anteil in der letzten Zeile von build.py.
  4. In credits.json: Jeder interview_clips-Eintrag enthält URL, Kanal, Start-/Endzeit; bestätigen, dass es der offizielle Kanal ist.
  5. Dem Haupt-Bot melden: Dateipfad, Länge, Größe, Originalton-Quellen und Lizenzinformationen, Entscheidungen, die Josh treffen muss. Nicht posten.

Bekannte Einschränkungen

  • faster-whisper auf diesem Rechner: *.en-Modelle (small.en usw.) liefern unsinnige Ausgaben, daher mehrsprachige Modelle medium / small verwenden; PyAV-Version inkompatibel, Audio muss als numpy übergeben werden (im Skript bereits behandelt). Verschiedene Modelle lassen gelegentlich Wörter aus, daher wichtige Sätze gegenprüfen.
  • YouTube --download-sections führt zu 403, daher muss das ganze Video heruntergeladen werden (lange Interviews in 1080p können mehrere 100 MB sein; im Cache cache/sources/, nach Gebrauch löschbar).
  • Keine GPU: 1-minütiges Video ca. 2 Minuten Rendering, 3-minütiges Video ca. 6-8 Minuten.
  • Pexels-Schlüsselwort-Ergebnisse sind manchmal ungenau; nach Ansicht des Kontaktblatts Schlüsselwörter ändern oder image / file verwenden.

Individual skills in this repo

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

bounce12340/josh-video-skills

收到「做一支影片/Reel」時先用:判斷影片類型、轉給對應的影片 skill,套用共用本家規則並交給事實編輯。只做草稿,不發文。

bounce12340/josh-video-skills

用 OpenMontage(開源 AI 影片製作流水線,<SKILLS_DIR>/OpenMontage)做 Josh 的影片時的「本家規則」轉接層。適用:長片剪成多支短片(clip-factory)、真實螢幕錄製教學(screen-demo)、翻譯配音(localization-dub)、Podcast 轉影片(podcast-repurpose)、「照這支參考影片做」(reference video 分析)、無旁白紀錄片蒙太奇(documentary-montage),以及幫 stock-footage-reel 加抓 NASA/國會圖書館/NARA/Archive.org 老片。觸發語:「用 OpenMontage」、「長片切短片」、「照這支 Reel 做」、「翻譯配音」、「螢幕教學影片」。

bounce12340/josh-video-skills

用 Playwright 錄「公開網頁」的操作畫面(捲動、滑過、點連結、高亮重點、章節卡),輸出 1080x1920 直式 mp4,當 Reel 的工具/網站導覽素材。觸發語:「錄一段網頁操作」「網站導覽素材」「螢幕錄影素材」「screen record」。只錄公開頁面,不登入、不發文。

bounce12340/josh-video-skills

「真實素材剪輯」直式短影音(AYi @ayi_ainotes 那種紀錄片風):照口播稿每一句,自動搜尋並下載免費可商用素材(Pexels、Mixkit Free、Wikimedia Commons),加上洋紅調的 1950 到 70 年代 Prelinger 公有領域老片,硬切剪輯,燒上雙語字幕(繁中+英文,重點字金色),左上固定標題,ElevenLabs 配音,暗色合成器配樂,片尾金句卡加出處小字,再用 B 剪報 Vox 樣板出封面。觸發語:「做一支真實素材剪輯」、「stock footage reel」、「AYi 風格」、「素材庫剪輯」。

Verwandte Skills