Communitygithub.com

MuhammadToffaha/Video-Bearbeitung

Verwandelt ein gesprochenes Video in ein professionell bearbeitetes Reel/TikTok/Short mit wort-synchronen Untertiteln (auch Arabisch/E. RTL), animierten Grafiken, Infografiken, Soundeffekten und optionalem Dub mit neuer Stimme und Lippen-Synchronisation.

Was ist Video-Bearbeitung?

Dieses Skill ermöglicht die automatisierte, professionelle Videobearbeitung direkt in der Cloud-Umgebung (z. B. Claude Code). Es verarbeitet ein vom Benutzer hochgeladenes Video zu einem kurzen, social-media-tauglichen Clip (z. B. Reel, Short, TikTok). Die Bearbeitung umfasst: Transkription mit Whisper (sherpa-onnx, offline), wortgenaue Untertitel (linksläufig für Arabisch, rechtsläufig für Englisch), animierte Hervorhebungen von Schlüsselwörtern, Einblendung von Infografiken, Diagrammen und UI-Karten, die genau zum Gesagten erscheinen, Kamerazooms ('Punch-ins') zur Aufmerksamkeitssteuerung, Platzierung von Markenlogos, dezente Soundeffekte (Whooshs, Ticks) und eine Lautheitsnormalisierung auf -14 LUFS. Optional kann der gesamte Sprach-Track in eine andere Sprache übersetzt, eine neue synthetische Stimme (mit Klon des Original-Sprechers) erzeugt und die Lippenbewegungen im Video mittels Wav2Lip und GFPGAN an die neue Tonspur angepasst werden. Das Skill arbeitet vollständig offline und nutzt ffmpeg, headless Chromium, GSAP für Animationen und Python-Skripte. Es ist besonders nützlich für Content Creator, die schnell hochwertige Kurzvideos mit wenig manuellem Aufwand erstellen möchten.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MuhammadToffaha/Video-editing/tree/HEAD/.claude/skills/short-form-video-editor

In Ihrer bevorzugten KI fragen

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

Dokumentation

AUTOPILOT - Was tun, wenn der Benutzer /short-form-video-editor eingibt

Der Benutzer lädt ein Video (und optional ein Logo-Bild) hoch und gibt den Befehl ein. Erledige die GESAMTE Aufgabe, ohne Fragen zu stellen; stoppe nur, wenn dich etwas wirklich blockiert (kein Video gefunden, kein ffmpeg). Zusätzlicher Text nach dem Befehl = Stil-/Markenhinweise, wende sie an.

  1. Finde Eingaben: Das neueste Video in den Sitzungs-Uploads (ls -t /root/.claude/uploads/*/*.{mp4,mov,webm} oder der in der Nachricht angegebene Pfad); Logo = ein angehängtes Bild, falls vorhanden (kein Logo -> überspringe Wasserzeichen/Helden/Outro-Logo, verwende ein sauberes, textfreies Outro). Sprache = automatische Erkennung mit asr_chunks.py ... auto.
  2. Lokalisiere das Toolkit: Dieses Skill-Verzeichnis (das Verzeichnis, in dem diese SKILL.md liegt) enthält template/. Arbeite in einem neuen Projektordner: innerhalb des Video-editing-Repository-Klons als projects/<slug>-<YYYYMMDD>/, wenn dieses Repo in der Sitzung ist, ansonsten in der scratchpad. cp -r template/. <project>/.
  3. Überprüfe/Installiere Abhängigkeiten (einmalig): ffmpeg, Node + Playwright Chromium (/opt/pw-browsers, niemals playwright install ausführen), pip install numpy pillow sherpa-onnx, scripts/fetch_asr_model.sh. Kein Netzwerkzugriff für Huggingface; GitHub-Releases + npm + PyPI funktionieren.
  4. Führe den unten stehenden Workflow von Anfang bis Ende aus, und triff Design-Entscheidungen selbst (Markenfarbe aus dem Logo; ansonsten Korallen-/Teal-Tech-Farbpalette; Szenen, die aus reference/scene-patterns.md ausgewählt und an das tatsächlich Gesagte angepasst werden).
  5. Liefere: SendUserFile für die mp4 (Render anzeigen), dann eine kurze Zusammenfassung: Spezifikationen, welche Grafiken hinzugefügt wurden, Transkriptstellen mit NIEDRIGER VERTRAUENSWÜRDIGKEIT zur manuellen Überprüfung, Hinweis zur Auflösung des Ausgangsmaterials, „Audio nicht angehört". Speichere das Projekt (ohne work/) und die endgültige mp4 im Repo und pushe es in den festgelegten Branch der Sitzung (oder main, falls keiner angegeben wurde). Erstelle niemals einen PR, es sei denn, du wirst dazu aufgefordert.
  6. Rechne mit ~15–25 Minuten für ein 60 s Video (Transkription ~3 min, Rendering ~4 min, Kodierung ~2 min). Informiere den Benutzer zu Beginn in einem Satz und arbeite dann still, bis du fertig bist.

DUB-MODUS - Übersetzen + neue Stimme + Lippen-Synchronisation (einmal mit dem Glow-Clip getestet: Arabisch -> Englisch)

Wird verwendet, wenn der Benutzer das Video in einer anderen Sprache haben möchte, „wobei die Lippen den Worten folgen".

  1. Skript: Transkribiere und überprüfe das Original wie im Bearbeitungsmodus, schreibe dann die Übersetzung selbst als data/phrases.<lang>.json = [[win_start, win_end, "text with *key words and DISPLAY|spoken overrides (NBSP inside multi-word tokens)"], ...]. Behalte die ORIGINALEN Phrasenfenster bei, damit Kamera-/Grafik-Beats erhalten bleiben; du kannst benachbarte Fenster zusammenführen. Budget: etwa 2,5–3 Wörter/s (Englisch) pro Fenster - verdichte eher, als zu hetzen; behalte die Bedeutung, füge keine neuen Behauptungen hinzu. Beispiel für eine gesprochene Überschreibung: *COSRX|Cosrex, Axis-Y|Axis\u00a0Y.
  2. Modelle: scripts/fetch_dub_models.sh (+ fetch_asr_model.sh zur Überprüfung).
  3. Stimme (Standard = KLON der sprechenden Person): Baue work/ref.wav = 4–5 saubere, pausenbegrenzte Clips (ca. 15 s) der ursprünglichen Sprache der Person (16k Mono, zusammengehängt). python3 -I scripts/tts_clone.py data/phrases.en.json work/ref.wav 8 <total_seconds> -> work/voice_en.wav + data/transcript.source.json mit den TATSÄCHLICHEN Sprachsegmenten. YourTTS (coqui, wird von fetch_dub_models.sh heruntergeladen) klont die Klangfarbe ohne Beispiele; das Skript generiert N Takes pro Zeile, behält den Take, dessen Whisper-Rückübersetzung am besten zum Skript passt, und führt dann eine Zeitdehnung (0,72–1,25-fach, tonhöhenerhaltend) durch, um ~90% des ursprünglichen Fensters zu füllen. Bewährte Zahlen für den Glow-Clip: Mittlere Tonhöhe 144 Hz vs. Sprecherin 154 Hz (Kokoro-Standardstimme 123 Hz), Langzeit-Spektrums-Ähnlichkeit 0,96 vs. 0,90, jede Zeile wird korrekt zurückgelesen. Schreib Markennamen phonetisch via DISPLAY|spoken (und schließe sie von der Bewertung aus - automatisch). Fallback tts_phrases.py = Kokoro-Standardstimme (deutlich, aber nicht die der sprechenden Person). Akzent: Das Modell überträgt Klangfarbe/Tonhöhe, NICHT einen muttersprachlichen Akzent - versprich KEINEN ägyptisch-akzentuierten Englisch; sage, was erreicht wurde.
  4. Lippen-Synchronisation auf den ORIGINAL-Auflösungs-Frames: ffmpeg -t <end> -i src -vf fps=30 work/raw/%05d.png; ffmpeg -i work/voice_en.wav -ac 1 -ar 16000 work/en16k.wav; MODELS=work/models python3 -I scripts/lipsync2.py work/raw work/en16k.wav work/ls --model wav2lip_gan_96.onnx --enhance 0.7 (erstmal mit --range a b testen; vollständiger Lauf ~25 Min. für 1700 Frames auf 4 CPUs: Haar-Boxen, 2dfan4-Landmarken auf jedem Frame, dann Wav2Lip + GFPGAN pro Frame). lipsync2 = landmarkenausgerichteter FFHQ-512-Zuschnitt, geglättete Landmarken, Wav2Lip auf der Landmarken-Gesichtsbox, GFPGAN-Restaurierung mit 0,7 gemischt, mundförmige Maske (berührt niemals die Nase), wieder eingefügt. Dann scripts/01b_upscale_lipsynced.sh. Verwende NICHT das alte lipsync.py (grober Haar-Zuschnitt: verschmierte Lippen, zungenähnliche Artefakte - der Benutzer nannte es „sehr schlecht"). EDTalk-256 wurde getestet und ist schlechter (geisterhafter Mund). Modelle: 2dfan4, gfpgan_1.4, wav2lip_gan_96 aus dem facefusion-assets GitHub-Release.
  5. Visueller Synchronisationsbeweis: Kontaktbogen mit Mundausschnitten und der Audiohüllkurve unter jedem Kachel - der Mund muss in den stillen Lücken geschlossen und offen/variiert sein, während der Balken oben ist. Pixel-Korrelationsmetriken sind hier zu verrauscht; verlasse dich nicht auf sie.
  6. Grafiken: python3 -I scripts/build_transcript.py work/en16k.wav (setze max_chars ~22 im Quell-JSON für Englisch), generiere composition/transcript.js neu, schreibe dann scene.js Kopie und Trigger-Wörter in der neuen Sprache (LTR: .row/.chunk-Richtung ltr, Inter-Schriftart, Strike-Ursprung links, Fluss-Pfeile links->rechts). Mehrwort-Token sind separate Wörter im Transkript: suche einzelne Wörter (ts('skin',0,43.5)), niemals ts('your skin').
  7. Rendere wie gewohnt (LAST_SRC_FRAME=<n> scripts/02_render_all.sh, Cues, SFX) und mische mit VOICE=work/voice_en.wav OUT=out/name-en.mp4 scripts/03_mix_and_encode.sh.
  8. Sei ehrlich in der Zusammenfassung: Wav2Lip bei ~100px Gesichtern ergibt einen weichen, leicht geglätteten Mund (bei genauer Betrachtung sichtbar), Kopf-/Handbewegungen sind immer noch die der ursprünglichen sprechenden Person, die Stimme ist synthetisch, die sprechende Person sollte eine synchronisierte Version ihres Abbilds genehmigen, erwäge, es als AI-ge dubbed zu kennzeichnen. Nenne jede übersetzte Phrase, deren Quelle geringe Vertrauenswürdigkeit hatte.

Kurzvideo-Editor (Untertitel + Bewegungsgrafiken + Soundeffekte)

Zwei Modi: Bearbeiten (Sprache beibehalten, Untertitel/Grafiken/SFX hinzufügen) und Dub (in eine andere Sprache übersetzen, neue Stimme, Lippen für das neue Audio neu animiert - ausgelöst, wenn der Benutzer Englisch/übersetzen/synchronisieren/Lippen-Synchronisation sagt). Pipeline nachgewiesen an einem 57 s ägyptisch-arabischen Apothekenwerbevideo (Glow Cosmetics). Ausgabe: 1080x1920 @30, H.264/AAC, -14 LUFS. Ausgearbeitetes Beispielprojekt: projects/glow-kbeauty-reel/ in https://github.com/MuhammadToffaha/Video-editing

Regeln, die „professionell, nicht Vorlage“ definieren

  • Behalte die sprechende Person, Stimme und Bedeutung unverändert. Erfinde niemals Behauptungen (Zahlen, „100%", Preise). Wenn eine Grafik Text benötigt, der nicht gesprochen wurde, halte ihn generisch (Kategorienamen, Markierungen über Stichworten).
  • Jedes visuelle Element unterstützt eine gesprochene Phrase und wird AUF dem Wort ausgelöst (ts('word')), nicht am Phrasenanfang. Karten verlassen den Bildschirm, bevor die nächste erscheint; keine überlappenden Geister.
  • Eine visuelle Sprache: Markenfarbe (aus dem Logo entnommen) + Weiß + tiefschwarze Glas-Paneele, Inter für lateinische Beschriftungen, Cairo (Arabisch) für Überschriften/Untertitel. Mint nur für Erfolgszustände.
  • Layout-Zonen (1080x1920, Gesicht der sprechenden Person y 790-1110): Karten y 235-735 (niemals über dem Gesicht, auch nicht nach 1,15-fachem Zoom), Untertitel y1545, halte die unteren 220 px und oberen 130 px frei von Schlüsselinhalten (Plattform-UI). Überprüfe die Gesichtsposition für jedes Ausgangsmaterial neu.
  • Aufmerksamkeits-Bringer, in Maßen: Punch-in-Schnappschuss (1,12-1,15x) an Satzanfängen mit langsamen Bewegungen dazwischen, eine Grafik alle 2–4 s, aktive Wort-Untertitel-Hervorhebung, Durchstreichen/Häkchen/Hochzählen-Mikroanimationen, Helden-Logo-Moment, wenn die Marke genannt wird, Marken-Endkarte.
  • Soundeffekte: Whoosh beim Karten-Einblenden, Pop/Tick bei Elementen, Klingelton bei Erfolg, Thud beim Logo. Leise (ca. -10 dB unter der Stimme). Keine Musik, es sei denn, der Benutzer liefert sie.

Workflow

  1. Untersuche: ffprobe, Kontaktbogen (ffmpeg -vf "fps=1/6,scale=239:-1,tile=5x2"), finde nachfolgende Endkarten (WhatsApp/CapCut schwarzer Rahmen) und notiere die Position der sprechenden Person. Quelle ist normalerweise niedrig aufgelöst (Telefon/WhatsApp): Upscale mit lanczos, teile dem Benutzer mit, dass das Filmmaterial weich wird, während die Grafiken scharf bleiben.
  2. Projekt: cp -r <skill>/template/. my-project/ && cd my-project; cp <logo> assets/; python3 -I scripts/extract_logo.py assets/logo_original.png assets/logo_white.png (gibt Marken-Hex aus). Aktualisiere --coral/--brand in composition/style.css und #wm/#outro.
  3. Vorbereiten: END=<trim seconds> scripts/01_prepare.sh input.mp4 (Frames, 16k wav, Stimme).
  4. Transkribieren (kein HF-Zugriff in der Sandbox; GitHub-Releases funktionieren): scripts/fetch_asr_model.sh; dann
    • python3 -I scripts/asr_chunks.py work/asr16k.wav <lang|auto> 3.2 a, wiederhole mit 2.4 und 4.5. Whisper kappt Chunk-Enden; führe die 3 Hypothesen selbst zusammen und korrigiere mit deinen eigenen Sprachkenntnissen.
    • Unsichere Wörter / Markennamen: python3 -I scripts/asr_probe.py work/asr16k.wav ar,en 14.0-16.8 14.5-16.6 ... (der en-Durchgang buchstabiert lateinische Markennamen). Vertraue nur dem, was überlappende Fenster konsistent zeigen; liste den Rest in der endgültigen Nachricht und README als GERINGE VERTRAUENSWÜRDIGKEIT. Erstelle keine Grafiken auf Basis von geratenen Namen.
  5. Timing: python3 -I scripts/pauses.py work/asr16k.wav -> Pausen sind die zuverlässigen Phrasengrenzen. Schreibe data/transcript.source.json als [start, end, "text"] Phrasen (siehe data/transcript.source.example.json; *wort = Akzent-Pille; verwende NBSP innerhalb mehrwörtiger lateinischer Namen; lateinische Marken in RTL-Text: vermeide, das arabische و-Präfix mit ihnen zu verkleben, schreibe و Brand). Dann python3 -I scripts/build_transcript.py work/asr16k.wav und echo "window.TRANSCRIPT=$(cat data/transcript.json);" > composition/transcript.js. Es verteilt Wortzeiten nach Silbengewicht innerhalb jeder Phrase und rastet an Energietälern ein, erstellt dann ausgewogene 2-4-Wort-Untertitel-Chunks. Plausibilitätsprüfung: kein Wortanfang innerhalb einer Stille.
  6. Gestalte Szenen in composition/scene.js (siehe reference/scene-patterns.md). Verwende card(t0,t1,{y,h,html}), pop, fade, draw, cue, ts. Nimm die Beispielszenen als Vorlage: Hook-Karte, Marken-Chips (Skelett-Plätze, die sich füllen, wenn jeder Name genannt wird), Kategorien-Kacheln, A->B-Vergleichsdiagramm mit wanderndem Punkt + Häkchen, durchgestrichene Chips, Flussknoten, Sternbewertung, Checklisten-Reihen, Roadmap, Balkendiagramm, Vertrauensringe, Helden-Logo-Enthüllung, Marken-Outro. Setze finish(<seconds>) = Stimmenende + ~1,7 s Outro.
  7. Rendern + Qualitätssicherung: rendere zuerst ein paar Test-Frames (node scripts/render.mjs <f> <f+1> work/test), erstelle Kontaktbögen mit Pillow, SCHAU sie dir an. Dann scripts/02_render_all.sh (4 Arbeiter, ~8 fps insgesamt), node scripts/render.mjs cues work/cues.json && python3 -I scripts/sfx.py work/cues.json work/sfx.wav, OUT=out/name.mp4 scripts/03_mix_and_encode.sh. Wenn die Quelle mit einer Endkarte endet, übergebe LAST_SRC_FRAME=<n>, um den letzten sauberen Frame einzufrieren.
  8. Liefere: sende die mp4 (SendUserFile), gib Spezifikationen an, die Transkript-Stellen mit geringer Vertrauenswürdigkeit, die Auflösungsgrenze des Filmmaterials, und dass das Audio nicht mit den Ohren gehört wurde (du kannst es nicht hören) - nur mit Lautheitsmessern und Onset-vs.-Energie-Tests geprüft.

Bereits gelöste Fallstricke (nicht wiederholen)

  • Python str.split() zerteilt an NBSP - verwende split(' ') (bereits in build_transcript.py).
  • Das Animieren von SVG <rect> mit CSS scaleY kippt/verschiebt es im Headless-Chromium - verwende stattdessen Tweening von attr:{y,height}. Strich-Zeichnung: draw(path,t,d).
  • Elemente, die versteckt starten, benötigen CSS opacity:0 (Klasse hid) und Tweens mit immediateRender:false; jeder Tween muss suchbar sein (Worker springen direkt zu ihrem Start-Frame).
  • Karten mit backdrop-filter verschwimmen nur, wenn der Videoframe auf derselben Seite ist (#bg img) - deshalb werden Frames innerhalb der Seite zusammengesetzt.
  • Leere, verschwommene Karten sehen defekt aus: starte entweder die Karte auf ihrem Trigger-Wort oder zeige helle Platzhalter-Zeilen/Plätze an, die aufleuchten, wenn gesprochen wird.
  • Arabisch benötigt echte Formgebung: Chromium + Cairo woff2 (Unicode-Range getrennt Arabisch/Lateinisch) funktioniert; Pillow/ffmpeg drawtext nicht.
  • Whisper in sherpa-onnx hat keine Wort-Zeitstempel und kappt Enden; daher kurze Fenster + Pausen-Verankerung.
  • opencv 5.x hat kein CascadeClassifier (auf 4.10.0.84 festlegen); Haar-Gesichtsboxen ergeben falsch-positive Ergebnisse bei Händen/Hemd und verpassen ~30% der Frames -> Median-Box-Ausreißer-Ablehnung + ROI-Zweiter-Durchlauf + Interpolation (bereits in lipsync.py).
  • Kokoro/Whisper-artiges TTS liest COSRX als Buchstaben: verwende DISPLAY|spoken-Überschreibungen.
  • GitHub MCP create_repository kann 403 geben - bitte den Benutzer, das Repo zu erstellen, dann add_repo + Klon (Klone in ein frisches Verzeichnis, falls der Pfad existiert).

Verwandte Skills