Was macht thought-to-motion?
Die Idee ist das Produkt; alles andere ist eine Ebene. Dieses Skill nimmt eine Aufnahme (ein Talking-Head- Video oder nur eine Sprachnotiz), findet die Beats in dem, was gesagt wurde, und entwirft Bewegung um sie herum: Untertitel in der gesprochenen Sprache, Karten zu den Schlüsselwörtern, eine Enthüllung des Wendepunkts, eine Abschlussfrage.
Drei Modi:
- talking-head: Das Filmmaterial bleibt; Karten, Untertitel und Punch-Ins liegen darüber.
- voice: Kein Filmmaterial erforderlich (eine Audiodatei oder das aus einem Video extrahierte Audio); eine vollflächige Markenleinwand mit Szenen, kinetischen Untertiteln und einer Live-Wellenform.
- text: Keine Aufnahme; reiner Text wird zu zeitlich abgestimmten kinetischen Untertiteln und Szenen auf der Markenleinwand, normalerweise mit Hintergrundmusik.
Zwei Formate: 9:16 (Standard; Reels, TikTok, Shorts) und 16:9 ("aspect": "16:9"; YouTube, LinkedIn, Web).
Derselbe Plan wird in beiden Formaten gerendert: In 16:9 wird das 9:16-Layout auf eine breite Bühne gesetzt (Talking-Head: der Sprecher
ist rechts eingerahmt, das Motion Design links).
Alles läuft auf diesem Rechner. Kein Filmmaterial, Audio oder Text wird irgendwo hochgeladen.
0. Einrichtung (einmal pro Rechner)
Aus dem Skill-Ordner:
bash scripts/setup.sh # venv + fixierte Pakete + engine/node_modules aus der Lockdatei + lokales Sound-Kit
Erfordert ffmpeg, Node 18+, Python 3.10+. Die erste Transkription lädt Modelle von huggingface.co
(plus dessen Datei-CDN *.hf.co) in .cache/hf herunter. Wenn der Netzwerkzugriff auf eine Whitelist beschränkt ist, müssen diese Hosts erlaubt sein.
Falls eine Chrome/Chromium Headless Shell bereits existiert, setzen Sie BROWSER_EXECUTABLE=/pfad/zur/headless_shell;
andernfalls lädt Remotion bei der ersten Wiedergabe eine eigene in engine/node_modules herunter.
Führen Sie Python-Skripte mit .venv/bin/python aus.
Ihre Marke (einmalig)
Kopieren Sie brand.example.json in brand.json und füllen Sie es aus: Wortmarke (Ihr Name oder Ihre Marke), Serienbezeichnung, Handle,
Markenlinie, Thema (warm, cinematic oder tech, siehe engine/src/lib/theme.js; fügen Sie dort Ihre eigenen Farben und Schriftarten hinzu).
Die Felder brand, theme und bumpers jedes Plans stammen daraus. Ohne brand.json gibt es keinen Header, kein Intro oder Outro.
1. Aufnahme (Fragen Sie nur, was Sie nicht ableiten können)
- Die Quelle. Video mit einer sprechenden Person -> Talking-Head; nur Audio oder ein Video, bei dem nur die Stimme zählt -> Voice (Prep extrahiert das Audio); reiner Text -> Textmodus.
- Format: 9:16, 16:9 oder beide (zwei Renderings desselben Plans mit einem anderen
aspect). - Musik: ein oder aus. Nur die integrierten generierten Betten sind eingebettet (ruhig / warm / pulsierend, kein Copyright, nichts zum Reklamieren). Wenn der Benutzer einen bestimmten Song möchte, lassen Sie die Musik aus; er fügt sie in der App hinzu.
- Untertitelsprache(n): Standard = die gesprochene Sprache. Zwei Optionen für eine zweite Sprache: zweisprachig
(ein Video, die gesprochene Sprache oben und eine kleinere Übersetzung darunter:
lang2+text2) oder ein separater Render. - Thema (
warmwarm /cinematicdunkel /techmarineblau, siehe engine/src/lib/theme.js), Markenwortmarke + Serienbezeichnung (oder keine) und die Abschlussfrage / der Call-to-Action, falls vorhanden. - Voice-Modus: Eigene Fotos, die verwendet werden sollen (legen Sie sie in
<job>/public/ab).
2. Vorbereiten
Textmodus (keine Aufnahme):
.venv/bin/python scripts/prep_text.py <text.txt | "Inline-Text"> <job> [--lang he|en] [--wpm 150] [--aspect 9:16|16:9]
Teilt den Text an Phrasengrenzen in untertitelgroße Zeilen, timt sie mit einem angenehmen Lesetempo und schreibt
plan.draft.json (Modus "text", Musik ruhig, Bewegung ruhig). Schreiben Sie die Wörter des Benutzers nicht um; teilen und timen Sie sie nur.
Entwerfen Sie dann die Szenen (Abschnitt 4) wie für den Voice-Modus. Fahren Sie mit Abschnitt 4 fort.
Video oder Audio:
.venv/bin/python scripts/prep.py <medien> <job> [--mode voice] [--lang he|en|auto] [--no-cut]
Normalisiert auf 1080x1920 30fps (oder Audio), schneidet Pausen > 0,45s, bereinigt die Sprache
(DeepFilterNet3 Rauschunterdrückung + EQ, De-Esser, Kompression, -14 LUFS; --clean gentle standardmäßig,
full für sehr laute Außenaufnahmen, off für Studioaufnahmen), kopiert das Sound-Kit und transkribiert
die GESCHNITTENE Zeitleiste mit Wortzeitstempeln -> <job>/transcript.json.
Hebräisch verwendet automatisch das ivrit.ai-Modell. Das Skript druckt Wörter mit niedriger Konfidenz: Überprüfen Sie diese zuerst.
Optional: Hintergrund ersetzen (Talking-Head)
Beste Ergebnisse - Nehmen Sie eine saubere Platte auf. Bevor Sie sich hinsetzen, filmen Sie 3-5 Sekunden des leeren Raums, gehen Sie dann hinein und
beginnen Sie. Fixieren Sie das Telefon auf einem Stativ und sperren Sie Belichtung und Fokus (auf dem iPhone: lange auf den Bildschirm drücken, bis "AE/AF LOCK" erscheint),
damit der Raum nicht heller oder dunkler wird, wenn Sie eintreten. Zoomen oder bewegen Sie die Kamera nicht. prep.py erkennt die leere
Eröffnung automatisch, speichert sie als genaue Hintergrundreferenz (work/clean_plate.png) und schneidet sie (und den
Eingang) aus dem Video heraus. Ohne eine saubere Platte muss das System den Raum hinter dem Kopf und Oberkörper erraten.
Der leere Raum kann auch ein separater Clip sein, der von derselben fixierten Telefonposition aus gefilmt wurde (vor oder nach dem Gespräch):
.venv/bin/python scripts/plate_from_clip.py <job> <leerer_raum_clip>
Es verwendet nur den stillen, leeren Anfang dieses Clips (es stoppt, wenn jemand hineingeht), richtet ihn auf den eigenen Hintergrund des Gesprächs aus
(ECC, affin) und gleicht Belichtung und Farbe pro Kanal ab. Überprüfen Sie work/plate_check.jpg (Gespräch | Platte |
Unterschied) und die gedruckten Übereinstimmungszahlen vor der Verarbeitung.
.venv/bin/python scripts/background.py <job> <plate.jpg> --draft [--reveal SEKUNDEN] # Entwürfe: halbe Auflösung, ~4x schneller
.venv/bin/python scripts/background.py <job> <plate.jpg> [--reveal SEKUNDEN] # Final: volle Auflösung
# Optionen: [--match 0.65] [--wrap 0.35] [--preview SEKUNDEN]
Lokales Porträt-Matting (MODNet) kombiniert mit einer Differenzmaske für den sauberen Raum: Bei einer statischen Kamera ist der Median
des Clips der leere Raum, und alles, was davon abweicht (schnelle Hände, Haare, Arme), wird als Person beibehalten.
Der leere Raum wird nur aus Frames gelernt, in denen jede Stelle tatsächlich leer ist (die Person wird zuerst maskiert),
damit die echte Wand neben dem Kopf niemals mit der Person verwechselt wird. Halbtransparente Kanten (Haare) werden
gegen diesen leeren Raum dekontaminiert, sodass kein Rand der alten Wand sichtbar ist. Alles unterhalb der Tischlinie
(--desk auto: etwa 1,2 Kopflängen unter dem Kinn; oder ein Bruchteil wie 0,9; off für Stehaufnahmen) ist
vor der Person - der Tisch und die ruhenden Unterarme - und wird wie gefilmt beibehalten, neu beleuchtet, um es anzupassen.
Verwenden Sie --moving-camera für Handheld-Aufnahmen (nur Modell). Eine schlichte oder grüne Wand hinter dem Sprecher liefert das
sauberste Ergebnis. Dann wird die Person auf die Helligkeit und Farbe der Platte neu beleuchtet, das Licht der Platte
umhüllt ihre Ränder, und eine Vignette + Körnung wird über beide gelegt, sodass sie eine Kamera teilen. --reveal behält den
echten Raum bis zu diesem Moment und überblendet zum neuen (großartig, wenn der Sprecher es vor der Kamera verlangt). Führen Sie immer
--preview für 1-2 Frames aus und zeigen Sie es dem Benutzer, bevor Sie den gesamten Clip verarbeiten. Führen Sie nach der Verarbeitung
scripts/bg_qa.py <job> aus: Es vergleicht das Original und das neue Video jeden zweiten Frame und meldet, wo die
Person verloren gegangen ist (rot) oder der alte Raum durchgesickert ist (gelb), pro Sekunde, mit einem Blatt der schlimmsten Frames
(work/bg_qa_sheet.jpg). Korrigieren oder kennzeichnen Sie jede fehlgeschlagene Sekunde, bevor der Benutzer das Video sieht. Bekannter falsch positiver
Befund: Ein Objekt, das sich zwischen der sauberen Platte und der Aufnahme bewegt hat (ein Stuhl, eine Tür), wird als "Person" gezählt; sehen Sie sich das
Blatt an, bevor Sie auf diese Sekunden reagieren. Die Platte sollte mit der Szene übereinstimmen:
drinnen/draußen, Tageszeit, warmes/kaltes Licht, Kamerahöhe. Schreibt public/source_bg.mp4.
3. Transkript lesen, korrigieren, Untertitel schreiben
- Offensichtliche Erkennungsfehler korrigieren (Namen, Slang, gemischte Sprachen). Jede Korrektur für den Benutzer auflisten; niemals die Bedeutung stillschweigend ändern. Wenn Sie sich nicht sicher sind, was gesagt wurde, fragen Sie.
- Füllwörter entfernen ("ähm", "אה"). Untertitel: eine Idee pro Cue, <= ~42 Zeichen, maximal 2 Zeilen, lesbare Geschwindigkeit (<= ~20 Zeichen/s), Cue-Zeiten aus den Wortzeitstempeln.
- Zweite Sprache: Übersetzen Sie die Cues selbst, behalten Sie die Stimme des Sprechers und dieselben Zeitangaben
(als
text2für zweisprachige Untertitel; halten Sie die Übersetzung kurz genug für eine Zeile). - In RTL-Untertiteln halten Sie zitiertes Englisch als einen Durchlauf ("כי אני זוכר Ist das Käse") - das System isoliert es.
4. Bewegungsplan -> TOR 1 (Freigabe)
Lesen Sie zuerst references/motion-rules.md. Führen Sie dann die Stufenaufforderungen in references/prompts/ der Reihe nach aus, als Ihre eigenen Arbeitsschritte (sie erzeugen Material für die Tore; sie ersetzen diese niemals):
- Story- & Hook-Editor (1-story-hook-editor.md): Hook-Kandidaten, die offene Frage und wo sie sich schließt, der Bogen, eine Schnittliste. Nur wörtliche Abschnitte. Textmodus: Verwenden Sie stattdessen 6-text-to-video-writer.md.
- Untertitel-Designer (3-caption-designer.md): Aufteilung, Lesegeschwindigkeit, Betonungswörter, RTL.
- Bewegungsregisseur (2-motion-director.md): Ein Element pro Beat, das auf seinem Wort landet, ein Brennpunkt zur Zeit, transformieren statt ersetzen.
- Sound-Designer (4-sound-designer.md): Spärliche Sounds auf Landungen, Musikstil, ein Stille-Beat.
Finden Sie die Beats (siehe references/design-rules.md): Hook, genannte Referenzen (Shows, Personen, Orte, Produkte), das Schlüsselkonzept, Kontraste oder Entscheidungen, Listen, Zahlen, die der Sprecher tatsächlich genannt hat, den Wendepunkt/die Enthüllung, die Frage/den CTA. Ordnen Sie jeden Beat einem Element zu (references/plan-schema.md). Präsentieren Sie dem Benutzer eine Tabelle:
| # | Zeit | Was gesagt wird | Element | Warum | Lehrt | Prüfen |
|---|
Schlagen Sie auch den Video-Slogan vor (die Hauptidee des Videos, ein Satz, den der Sprecher tatsächlich sagt, etwa 2-3 s) für den Opener. Listen Sie auch auf: Untertitelkorrekturen, alle hinzugefügten On-Screen-Fakten (z. B. die Jahre einer Show) mit einer Quelle, Thema, Sounds. Anhalten und auf Freigabe warten. Vorher wird nichts gerendert.
5. Plan schreiben und validieren
Schreiben Sie <job>/plan.json (Schema in references/plan-schema.md, Beispiel in examples/). Dann:
.venv/bin/python scripts/validate_plan.py <job>/plan.json
Beheben Sie jeden FEHLER. Lesen Sie die WARNungen und beheben Sie, was wichtig ist. Neben dem Schema prüft es die Bewegungsregeln: Inhalt um 0,5 s,
keine Lücke über 6 s ohne visuelles Ereignis, höchstens 2 Grafiken gleichzeitig, Lesegeschwindigkeit (max. 20 Zeichen/s), Untertitel-
dauer, Punch-In-Grenzen, Lichtleck-Sicherheit, Soundeffekt-Abstände, Stille-Beats. Brechen Sie eine Regel nur absichtlich
und sagen Sie warum an Tor 2.
Der Validator erzwingt auch den sicheren Bereich (x 60-900, y 220-1420: die Teile des Rahmens, die keine App-Oberfläche abdeckt)
und hält jede Karte und jedes Panel vom Gesicht des Präsentators fern (verfolgt in faces.json). Fügen Sie --fix hinzu, um Karten
automatisch zu verschieben. Siehe references/safe-zones.md.
Virtuelle Kameras (Talking-Head, automatisch)
.venv/bin/python scripts/shots.py <job> [--plan plan.json]
Macht eine feste Aufnahme wie einen Multi-Kamera-Schnitt lesbar: Kamera A (Weitwinkel, der ursprüngliche Bildausschnitt), B (Mittel, ~1,2x) und C (Nah, ~1,4x; bis zu 1,7x in 16:9), aus demselben Frame beschnitten und auf dem verfolgten Gesicht verankert. Kamerwechsel landen auf den Pausenschnitten, die Prep gemacht hat (Überspringen verstecken), sonst an Satzenden; Aufnahmen dauern 3-8 s; niemals dieselbe Kamera zweimal; Weitwinkel, während Karten Platz brauchen, Nahaufnahme bei Punch-Ins und Enthüllungen; jede gezoomte Aufnahme drückt ~1,5 % hinein (ruhig). Jede Kamera wird gegen die Karten und Untertitel getestet, sodass das Gesicht klar bleibt. Nahaufnahmen-Selfies (Gesicht größer als ein Drittel des Rahmens) erhalten in 9:16 keine virtuellen Kameras - es gibt keinen Platz, um näher heranzugehen. Keine KI-generierten Winkel: Das Filmmaterial bleibt echt und lokal. Fügen Sie der Tabelle für Tor 1 eine Spalte "Kamera" (A/B/C) hinzu.
6. Standbilder -> TOR 2 (Freigabe)
.venv/bin/python scripts/render.py stills <job> # Schlüsselmomente -> <job>/stills/sheet.jpg
Das Blatt zeigt Führungslinien: nicht sichere Zonen in Rot, das verfolgte Gesicht in Grün. Sehen Sie es sich zuerst selbst an: alles innerhalb des sicheren Bereichs, nichts bedeckt das Gesicht/den Mund, Hebräisch/Englisch-Reihenfolge korrekt, Schriftarten geladen (kein Times-ähnlicher Fallback), keine Überlappungen. Führen Sie dann den unabhängigen Prüfer (references/prompts/5-reviewer.md) als separaten Agenten aus, der Ihre Argumentation nicht gesehen hat: Geben Sie ihm nur die Standbilder, plan.json und Transkript. Beheben Sie seine Blocker und zeigen Sie sein Urteil dem Benutzer mit den Standbildern. Anhalten und auf Freigabe warten. Der Prüfer gibt niemals im Namen des Benutzers eine Freigabe.
7. Rendern, prüfen, ausliefern
.venv/bin/python scripts/render.py video <job> --name <NAME> # 540x960 Entwurf (Standard, schnell) zur Überprüfung
.venv/bin/python scripts/render.py video <job> --name <NAME> --final # voll 1080x1920, höchste Qualität
Jeder Prüf-Render ist ein Halbauflösungs-Entwurf (540x960). Rendern Sie --final nur für die freigegebene endgültige Version.
Ein Render pro Untertitelsprache (ändern Sie lang + captions im Plan). Nach dem Rendern prüfen:
Dauer stimmt, Audio vorhanden, ein paar Frames sehen richtig aus. Liefern Sie die MP4s (1080x1920 oder 1920x1080 H.264 High Profile,
Faststart; geeignet für Reels, TikTok, Shorts, YouTube, LinkedIn) und die .srt-Untertiteldateien, die daneben geschrieben werden
(eine pro Untertitelsprache). Mit "music" im Plan wird das Bett zur Renderzeit eingemischt und duckt sich automatisch unter die
Stimme. Das Rendern dauert einige Minuten pro Minute Video auf 2 CPUs.
--final schreibt auch <NAME>_social.mp4: dasselbe Bild mit etwa 10 Mbit/s (klein genug für Scheduler-APIs,
z. B. Instagrams ~300 MB-Limit) mit dem neu gemessenen und auf -14 LUFS / -1 dBTP in der Enddatei normalisierten Audio.
Liefern Sie diese Kopie zum Posten aus und behalten Sie das hochbitratige Master als Archiv. Messen Sie die ausgelieferte Datei
(ffmpeg -i <datei> -af ebur128=peak=true -f null -) und melden Sie ihre Lautstärke.
Das Video endet etwa 0,8 s nach dem letzten gesprochenen Wort (Prep behält diesen Schwanz bei), sodass das letzte Wort niemals abgeschnitten wird.
Mit "bumpers" im Plan fügt render.py Opener -> Intro -> Video -> Outro zusammen (scripts/bumpers.py), verschiebt die .srt
Dateien um die Länge von Opener + Intro und stoppt, wenn Ton und Bild nicht synchron sind (siehe Opener, Intro und Outro).
Regeln (nicht verhandelbar)
- Niemals Fakten, Zahlen, Zitate oder Geschichten erfinden. On-Screen-Fakten über das Transkript hinaus (Daten, Titel) müssen verifiziert und dem Benutzer an Tor 1 gezeigt werden.
- Zeichnen Sie keine erkennbaren Charaktere, Logos oder urheberrechtlich geschützte Kunstwerke; verwenden Sie Typografie und die integrierten generischen Symbole.
Ausnahme: das
logo-Element
…
[gekürzt für die Übersetzung]