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.
- 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 mitasr_chunks.py ... auto. - 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 alsprojects/<slug>-<YYYYMMDD>/, wenn dieses Repo in der Sitzung ist, ansonsten in derscratchpad.cp -r template/. <project>/. - Überprüfe/Installiere Abhängigkeiten (einmalig):
ffmpeg, Node + Playwright Chromium (/opt/pw-browsers, niemalsplaywright installausführen),pip install numpy pillow sherpa-onnx,scripts/fetch_asr_model.sh. Kein Netzwerkzugriff für Huggingface; GitHub-Releases + npm + PyPI funktionieren. - 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.mdausgewählt und an das tatsächlich Gesagte angepasst werden). - Liefere:
SendUserFilefü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 (ohnework/) und die endgültige mp4 im Repo und pushe es in den festgelegten Branch der Sitzung (odermain, falls keiner angegeben wurde). Erstelle niemals einen PR, es sei denn, du wirst dazu aufgefordert. - 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".
- 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. - Modelle:
scripts/fetch_dub_models.sh(+fetch_asr_model.shzur Überprüfung). - 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.jsonmit den TATSÄCHLICHEN Sprachsegmenten. YourTTS (coqui, wird vonfetch_dub_models.shheruntergeladen) 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 viaDISPLAY|spoken(und schließe sie von der Bewertung aus - automatisch). Fallbacktts_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. - 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 btesten; 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. Dannscripts/01b_upscale_lipsynced.sh. Verwende NICHT das altelipsync.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. - 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.
- Grafiken:
python3 -I scripts/build_transcript.py work/en16k.wav(setzemax_chars~22 im Quell-JSON für Englisch), generierecomposition/transcript.jsneu, schreibe dannscene.jsKopie 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)), niemalsts('your skin'). - Rendere wie gewohnt (
LAST_SRC_FRAME=<n> scripts/02_render_all.sh, Cues, SFX) und mische mitVOICE=work/voice_en.wav OUT=out/name-en.mp4 scripts/03_mix_and_encode.sh. - 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
- 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. - 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/--brandincomposition/style.cssund#wm/#outro. - Vorbereiten:
END=<trim seconds> scripts/01_prepare.sh input.mp4(Frames, 16k wav, Stimme). - Transkribieren (kein HF-Zugriff in der Sandbox; GitHub-Releases funktionieren):
scripts/fetch_asr_model.sh; dannpython3 -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 ...(deren-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.
- Timing:
python3 -I scripts/pauses.py work/asr16k.wav-> Pausen sind die zuverlässigen Phrasengrenzen. Schreibedata/transcript.source.jsonals[start, end, "text"]Phrasen (siehedata/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). Dannpython3 -I scripts/build_transcript.py work/asr16k.wavundecho "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. - Gestalte Szenen in
composition/scene.js(siehereference/scene-patterns.md). Verwendecard(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. Setzefinish(<seconds>)= Stimmenende + ~1,7 s Outro. - 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. Dannscripts/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, übergebeLAST_SRC_FRAME=<n>, um den letzten sauberen Frame einzufrieren. - 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 - verwendesplit(' ')(bereits in build_transcript.py). - Das Animieren von SVG
<rect>mit CSSscaleYkippt/verschiebt es im Headless-Chromium - verwende stattdessen Tweening vonattr:{y,height}. Strich-Zeichnung:draw(path,t,d). - Elemente, die versteckt starten, benötigen CSS
opacity:0(Klassehid) und Tweens mitimmediateRender:false; jeder Tween muss suchbar sein (Worker springen direkt zu ihrem Start-Frame). - Karten mit
backdrop-filterverschwimmen nur, wenn der Videoframe auf derselben Seite ist (#bgimg) - 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
COSRXals Buchstaben: verwendeDISPLAY|spoken-Überschreibungen. - GitHub MCP
create_repositorykann 403 geben - bitte den Benutzer, das Repo zu erstellen, dannadd_repo+ Klon (Klone in ein frisches Verzeichnis, falls der Pfad existiert).