anime-reel
Eingabe: ein Skript + eine Sprach-MP3 pro Zeile (beides wird vom Benutzer angehängt). Ausgabe: ein 9:16-Reel und eine 16:9-Kopie, jeweils mit der Original-Audio, plus eine 720p-Kopie unter 20 MB für WhatsApp.
Harte Regeln (bei jedem Durchlauf)
- Alles in Code zeichnen: HTML Canvas, frame-für-frame in headless Chrome gerendert, mit ffmpeg codiert. Kein Stock-Filmmaterial, keine Bildgeneratoren. Verwende
engine/als Basis; erweitere es, ersetze es nicht, damit das Aussehen jedes Mal gleich bleibt. - Jedes Wort mit erzwungener Ausrichtung timen (torchaudio MMS_FA via
scripts/align.py). Nie Timings raten. Schlägt die Ausrichtung für eine Zeile fehl, anhalten und dem Benutzer den Grund nennen; nicht auf gleichmäßigen Abstand zurückfallen. - Vor dem vollständigen Rendern einen Kontaktbogen mit Standbildern zeigen und auf Freigabe warten.
- Vor dem Überschreiben einer vorhandenen Datei nachfragen.
encode.shweigert sich zu überschreiben und beendet mit Exit-Code 2; dies dem Benutzer mitteilen. - Die Original-Audio im finalen MP4 unverändert lassen (Sprachzeilen werden nur auf einer Timeline platziert, niemals neu verarbeitet). Keine Hintergrundmusik, es sei denn, der Benutzer wünscht sie.
Methode
- Einrichtung. Führe
bash scripts/check_setup.shaus (ffmpeg, Node, puppeteer, torch/torchaudio, uroman). Behebe fehlende Komponenten, bevor du fortfährst. Führebash scripts/sfx.sh <project>/sfxaus, um Treffer-/Whoosh-/Aufprall-/Pop-Sounds mit ffmpeg zu synthetisieren. - Skript in Aufnahmen (Shots) aufteilen. Eine Aufnahme pro Sprachzeile. Schreibe für jede:
id,speaker,text(exakt das, was die MP3 sagt),audio-Pfad,place(rooftop, office, street, bedroom, sky, oder füge einen neuendrawPlace-Zweig hinzu),camera(static|push|pull|pan+amount),cast,slots(left/center/right) undfx. Speichere alsshots.json(Schema inscripts/build_timeline.py). Zeige die Aufnahmeliste und lass den Benutzer sie korrigieren, falls sie mehrdeutig ist. - Charaktere. Definiere jeden in
characters(name, skin, hair, hairStyle spiky|bob|long|short, eye, outfit, accent,color= die Farbe der Beschriftung dieses Charakters). Sie müssen originell sein, niemals aus bestehenden Animes kopiert. Anime-Look: große Augen mit Glanzlichtern, dicke saubere Konturen, flache Farbe plus genau eine Schattierung. Rendere das Charakterblatt und behalte das JSON als einzige Quelle der Wahrheit, damit Charaktere zwischen den Aufnahmen nie wechseln:node scripts/render_frames.mjs sheet timeline.json landscape out/character_sheet.png - Ausrichten und Lippen-Synchronisation.
python3 scripts/build_timeline.py shots.json timeline.json workführt MMS_FA pro Zeile aus (Wort-Timings) und erstellt für jeden Charakter die Mund-Öffnungs-Kurve aus der Lautstärke dieser Sprachzeile (mouth.py). Blinzeln und Leerlauf-Bewegungen sind in die Engine eingebaut. Bei nicht-englischen Zeilen romanisiertalign.pymit uroman, während die Originalschreibweise auf dem Bildschirm erhalten bleibt. - Anime-Tricks bei Schlüsselzeilen (zu
fxhinzufügen, Zeiten in Sekunden ab Aufnahmebeginn):speedlinesbei Enthüllungen und Entschlossenheit,impact(weiße/schwarze Blitz-Frames, mitsfx: "impact") bei der wichtigsten Zeile,shakebei Treffern,chibi(+who,sfx: "pop") bei komischen Reaktionen. Sparsam verwenden: ungefähr ein Trick pro 2-3 Aufnahmen, damit sie noch wirken. - Untertitel und Ton. 2-3-Wort-Untertitel werden bereits von der Engine verarbeitet, wobei das gesprochene Wort in der Farbe des Sprechers und der Rest in Weiß erscheint. Soundeffekte liegen auf denselben Cues wie die visuellen Treffer (via
fx[].sfx). Mische mitpython3 scripts/build_audio.py timeline.json work/audio.wav. - Kontaktbogen, dann Freigabe. Wähle ~12 Zeitpunkte, die über die Episode verteilt sind, inklusive jedes Tricks:
node scripts/render_frames.mjs stills timeline.json portrait work/stills 0.5,2.0,...bash scripts/contact_sheet.sh work/stills out/contact_sheet.pngZeigeout/contact_sheet.pngund halte an. Rendere das vollständige Video erst, wenn der Benutzer es freigibt. - Rendern nach Freigabe, für jede Ausrichtung (
portrait= 1080x1920,landscape= 1920x1080, 30 fps):node scripts/render_frames.mjs video timeline.json portrait work/reel_silent.mp4bash scripts/encode.sh work/reel_silent.mp4 work/audio.wav out/<name>_9x16Wiederhole für Querformat mitout/<name>_16x9.encode.shmuxed AAC 256k Audio und schreibt die_720p.mp4-Kopie (Ziel ~17 MB, immer unter 20 MB). Überprüfe die Größen mitls -lhund gib sie aus.
Render-Einstellungen
- 9:16: 1080x1920, 30 fps, H.264 yuv420p, CRF 16, AAC 256k, faststart. 16:9: 1920x1080, gleiche Einstellungen.
- WhatsApp-Kopie: 720p (720x1280 oder 1280x720), Bitrate basierend auf der Dauer berechnet, um unter 20 MB zu bleiben.
- Untertitel sitzen bei ~68% Höhe im 9:16-Format (frei von den oberen 250 px und unteren 420 px App-UI) und ~86% im 16:9-Format.
Dateien in diesem Skill
engine/engine.js,engine/index.html: Canvas-Engine (Charaktere, Orte, Speedlines, Impact-Frames, Shake, Chibi, Untertitel, Badge).scripts/:check_setup.sh,sfx.sh,align.py,mouth.py,build_timeline.py,build_audio.py,render_frames.mjs,contact_sheet.sh,encode.sh.