overlays: Grafiken synchron zur Stimme, platziert in Premiere
Zwei Skills, ein Workshop
Hier (overlays): platzieren und bearbeiten | Workshop (motion-design): erstellen |
|---|---|
Transkript, Zeitleiste der .prproj, Plan mit Phrasen-Ankern | Das EINE Remotion-Projekt: motion-design/src/, Overlay-Kompositionen in src/illustration/ (BrandedVideo, LowerThirdTrack, Screencast, Scene, FondAnime) |
Quellen: Fotos, B-Rolls, GIFs (gifs.py), Web-Captures, E-Mail-Karten (mail-cards.py) | public/: Schriftarten, scenes/<video>/ (Szenenmedien), sfx/ (Sounds) |
Aufnahme von Site-Demos (screencast-record.py) | Theme (src/illustration/theme.ts), Sound-Palette (reference/sound-palette.md, scripts/make-sfx.py, scripts/son.py) |
render-segments.py, screencast-render.py, montage-tella.py: Rendering IM Workshop starten, dann alles im Premiere-XML platzieren | Musik, Mix |
Die beiden Ordner müssen Nachbarn sein (<skills>/overlays und <skills>/motion-design): Die Skripte finden den Workshop über ../motion-design. Eine neue Szenenkomponente wird in motion-design/src/illustration/scenes/ geschrieben; ein neuer Sound kommt in die Synthese-Rezepte des Workshops.
Installation (einmal pro Maschine, Plugin-Installation): bash "${CLAUDE_PLUGIN_ROOT}/install.sh" --data "${CLAUDE_PLUGIN_DATA}".
Von Hand, mit den vier Skill-Ordnern nebeneinander kopiert: bash install.sh vom Kit-Root. Nach einem Plugin-Update ist der node_modules-Link des Workshops weg: Setup-Zeile erneut ausführen. Details: INSTALL.md des Kits.
Redaktionelle Goldene Regel (Standardeinstellung, an den Kanal anpassen)
Das Video wird von der Stimme getragen. Grafiken erzählen nicht nach, was gesagt wird: Sie verankern, was man sonst nur fühlen würde (ein Eigenname, ein Zitat, ein Ort, ein Titel, eine Zahl), oder sie ZEIGEN, worüber gesprochen wird (ein Dokument, eine Website, ein Diagramm).
Zwei Ebenen der Bekleidung:
- leicht: 1 Premium pro Kapitel + 1 Lower Third alle 45 bis 60 s, außerhalb des Intros (0–30 s) und des Schlusses;
- dicht (Demo, Untersuchung oder Tutorial-Video): animierte Szenen über 60 bis 70 % des Bildes, jede Szene auf Worte synchronisiert, keine Szene ohne Bewegung länger als 3 s. Der Talking-Head behält seinen Platz.
Fragen Sie nach dem gewünschten Level, falls es nicht genannt wird. Standardmäßig nicht animieren: das Intro (Zuschauer entscheiden, ob sie bleiben), eine intime Anekdote (Animation tötet die Emotion), eine Frage, die Spannung aufbaut, der Schluss und der Call-to-Action, eine Liste von Adjektiven.
Eine Abweichung vom Skript, die vor der Kamera gesprochen wurde (eine Zahl, ein Begriff, eine Annäherung), wird AUF DEM BILDSCHIRM korrigiert: Der Rohschnitt markiert sie in seinem Bericht, der Plan setzt den richtigen Wert auf die Stimme, ohne um eine neue Aufnahme zu bitten.
Regel Null: Die Referenzzeitleiste ist die des Premiere-Projekts, niemals die des Rohschnitts
Die Reihenfolge ist IMMER: Rohschnitt (rough-cut) -> der Editor prüft und ändert den Schnitt in Premiere -> Overlays. Dazwischen verschieben sich Cuts, Clips werden entfernt, die Dauer ändert sich: Zeiten, die auf dem Rohschnitt berechnet wurden, liegen 30 s bis 1 min daneben, und Elemente enden nach dem Ende des Videos.
Harter Stopp nach dem Rohschnitt, selbst wenn der Benutzer sagte: „Rohschnitt, dann Overlays, das bleibt dir überlassen“: Liefern Sie das Rohschnitt-XML, dann warten Sie, bis der Benutzer sagt, dass er es in Premiere validiert hat. Davor kein Plan, keine Zeiten, keine Platzierung. Nur das, was von keiner Zeit abhängt, kann weitergehen (Quellen für Bilder und GIFs).
python3 scripts/timeline-from-prproj.py "/pfad/clip.MOV" --list # Welche Sequenzen tragen den Clip
python3 scripts/timeline-from-prproj.py "/pfad/clip.MOV" --sequence "Derush_v1"
# -> <clip>_transcription.json (Wörter in SEQUENZ-Zeit) + <clip>_timeline.json (Map Clip -> Sequenz)
Es liest die Clips des Footage in der gewählten Sequenz (Ticks = 254016000000/s) und übernimmt die Wörter von <clip>_Derush_vN_work/words_premiere.json (das Transkript des Projekts, bereits vom Rohschnitt neu ausgerichtet).
Mehrere Sequenzen tragen den Clip: Es weigert sich zu raten (Code 2), fragen Sie, welche. Mehrere Clips in einer Sequenz: alle übergeben, in Reihenfolge (A.MOV B.MOV --sequence "..."); jeder Timeline-Eintrag und jedes Wort trägt media, und die Ausgaben nehmen den Namen des ersten Clips. Ein Wort, das bündig geschnitten ist, bleibt, wenn es IM Clip STARTET (mindestens 80 ms vor dem Cut); ein wirklich geschnittenes Wort bricht den Anker, der darauf zielt: Verschieben Sie den Anker zum vorherigen Wort + offset. Prüfen Sie, dass das letzte platzierte Element vor dem tatsächlichen Ende der Sequenz bleibt.
Verwenden Sie niemals eine cuts_final.json oder eine Map des Rohschnitts erneut. Ohne ein Premiere-Projekt (Clip allein):
python3 scripts/transcribe.py "/pfad/clip.mp4" (lokales whisper.cpp, etwa 5 min für 15 min Footage auf Apple Silicon).
Wenn der Benutzer den Schnitt zurückgibt, führen Sie zuerst den Vergleich durch: Die Änderungen, die sie in Premiere vorgenommen haben, sind das zuverlässigste Feedback. Vergleichen Sie ihre Sequenz mit dem Rohschnitt-XML, wandeln Sie jede wiederkehrende Lücke in eine Korrektur, eine Prüfung oder eine Regel um, und schreiben Sie erst dann den Overlay-Plan. Wenn der Benutzer den endgültigen Schnitt validiert, machen Sie dasselbe mit dem gelieferten Overlay-XML: Was sie entfernt, verschoben (mehr als 2 Frames), in der Größe geändert oder hinzugefügt haben (ihr eigenes Footage, das auf V1 eingefügt wurde, zählt nicht) wird zu einer Korrektur, einer Prüfung oder einer Regel. Nichts entfernt oder verschoben bedeutet, dass die Methode dieser Lieferung richtig war: Behalten Sie sie.
Pipeline
0. (Optional) B-Rolls
Ein Ordner Brolls/ neben dem Clip, Dateien mit dem Namen NN_description_K.mp4 (Nummer, Beschreibung, Variante):
python3 scripts/match-brolls.py "/pfad/clip.mp4" # -> <clip>_broll-script.json zum Ausfüllen
Für jedes B-Roll: die Variante (file), die Zeit (timecode MM:SS, im Transkript überprüft), durationSec (null = native Dauer). Platzieren auf V2. Führen Sie es VOR den Site-Demos aus (--force überschreibt die Datei). Sehen Sie sich ein Kontaktblatt der Varianten an, bevor Sie auswählen (3 Frames pro Variante): Ein Dateiname lügt oft („street-photography-portrait“ war eine Drohnenaufnahme einer Stadt bei Nacht). Setzen Sie niemals ein B-Roll auf einen Satz, den der Sprecher nicht buchstäblich zeigt, und kein Overlay-Sound, während ein B-Roll läuft.
0 bis. (Optional) Illustrationsfotos
Für ein Video, das Personen, Werke, Bücher, Orte zitiert:
- Manifest aus dem Skript des Videos: Entitäten in der Reihenfolge ihres Auftretens ->
illustrations-manifest.json:Das Referenzskript kann in jedem Format vorliegen (Text, Markdown, ein Dokument): Es liefert die richtige Schreibweise und die Dinge, die gezeigt werden sollen.{"version": 1, "dest": "Illustrations", "items": [ {"n": 1, "categorie": "reference", "nom": "Vorname Nachname", "sujet": "portrait", "url": "https://...", "fallback_urls": [], "note": "Quelle: ..."}]} - URLs: Zuerst freie Quellen (Wikimedia Commons, offizielle Websites, Open-Access-Museen), dann
python3 scripts/serp_images.py "Name Titel" --num 5 --min-width 1200(Google Images über SerpAPI, SchlüsselSERPAPI_API_KEY). Prüfen, ob das Bild das richtige ist (sehen Sie sich das Thumbnail an, nicht nur den Seitentitel; Auktionslosseiten sind eine Falle). Rechte prüfen, wenn das Video verkauft wird. - Download:
python3 scripts/source-illustrations.py illustrations-manifest.json->Illustrations/NN-category-name-subject.ext(Bytes geprüft, Breite gemessen; Exit 1, wenn URLs fehlen). - Timing:
python3 scripts/match-photos.py "/pfad/clip.mp4"-><clip>_photos-script.json, Zeiten vorausgefüllt durch eine unscharfe Suche des Namens im Transkript (Spracherkennung verunstaltet Eigennamen). IMMER jede Zeit von Hand gegen das Transkript überprüfen (die unscharfe Suche kann eine späte Erwähnung anstelle der ersten nehmen);enabled: falseverwirft ein Foto. Fotos gehen auf V3, mit Priorität vor B-Rolls (ein B-Roll, das ein Foto überlappt, wird aus dem XML entfernt und protokolliert).
Fotobehandlung: Nie zuschneiden (natürliches Seitenverhältnis, ein Hochformat bleibt hoch); ein Foto sitzt auf einem einfarbigen Hintergrund mit einem Rand auf allen vier Seiten (etwa 86 % des Frames), nicht als Full-Container, der die Ober- und Unterkanten berührt. Kein .webp im Manifest (Premiere liest es als Null-Längen-Medium im XML: Konvertieren mit sips -s format jpeg). Ein Foto unter 800 px Breite wirkt weich: render-segments.py gibt eine LOW RES-Warnung aus, listen Sie diese vor der Auslieferung auf. Ein von einer Szene gezeigtes Buchcover ist das visuelle Material des Verlags, das aus dem Web stammt (deren Website, ein HD-Mockup), niemals ein Bild aus dem eigenen Footage des Sprechers.
Wenn der Sprecher ein Objekt ZEIGT, deckt nichts es ab. Scannen Sie das Transkript nach „hier“, „wie Sie hier sehen können“, „dieses“, „schauen Sie“ in der Nähe der Erwähnung eines Werks: Der Sprecher hält das Buch oder die Kamera vor die Linse. Kein Full-Screen-Foto in diesem Fenster (ein Editor hat in einem gelieferten Schnitt jedes solche Cover entfernt); das Cover kommt vor oder nach der Demonstration, oder gar nicht.
0 ter. GIFs und Memes (ein Grundbestandteil, keine Option)
Ein GIF alle 2 bis 4 Minuten, bei Momenten der Stimmung oder Selbstironie („das pusht sehr hart“, „ich erfinde das alles“), niemals im Intro, niemals, um einen technischen Satz wörtlich zu illustrieren. Eine gif-Szene (Overlay, weißer Rahmen, Looping), die auf das Wort trifft, mit ihrem Soundeffekt.
python3 scripts/gifs.py chercher "that's a bug" --planche gifs-sheet.jpg # Liste + nummeriertes Kontaktblatt
python3 scripts/gifs.py prendre <id> --nom bug --public <video> # Quelle MP4 + die Daten der Szene
Sehen Sie sich das Kontaktblatt VOR der Auswahl an (ein GIPHY-Titel sagt nicht, was gezeigt wird; die Suche auf Englisch funktioniert oft besser). prendre lädt das MP4 (niemals das .gif) herunter in Illustrations/gifs/, behält gifs.json (Quelle jedes GIFs), kopiert es nach motion-design/public/scenes/<video>/gifs/ und gibt die data der gif-Szene aus (src, srcW, srcH, loopSec). Schlüssel GIPHY_API_KEY (kostenlos). Ein GIF verwendet oft ein geschütztes Werk: Bei einem Video, das verkauft wird, verzichten Sie.
1. Bildrate und Format des Clips (KRITISCH)
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,width,height -of csv=p=0 "/pfad/clip.mp4"
render-segments.py liest Bildrate und Größe des Clips, wenn das JSON sie nicht angibt. Ein JSON mit 30 auf einem Clip mit 60 verschiebt alles um den Faktor 2. Bei 29,97 dauern n Sequenzframes n x 1,001 / 30 s, und jedes Rendern muss seinen Clip abdecken (tailFrames und die Komponente TenirFin kümmern sich darum). Ein Clip wird in der Rate seines MEDIUMS geschrieben: Premiere liest <in> bei 29,97 (die Rate der <file>), nicht in der <rate> des Clips; das Skript schreibt in = round(t x fps x 1000/1001) mit <ntsc>TRUE.
Vertikal 9:16 (Reel): Gleiche Pipeline, gleiches JSON. Der Lower Third erkennt vertikal und bewegt sich nach oben über den Untertitelbereich; Fotos bleiben ganz (ein Band auf dem Hintergrund); ein 16:9 B-Roll erhält eine Skalierung, die die Breite ausfüllt. Reel-Regeln (aus dem Vergleich von Lieferungen mit dem endgültigen Schnitt): Fotos von 2 bis 3 s (Standard 2,5), Lower Third so lang wie sein assoziiertes Porträtfoto und damit beginnend, keine Stock-B-Rolls außer auf Anfrage, keine Abdeckung, während der Sprecher das Objekt zeigt. Rendern Sie immer EINEN Lower Third als Standbild und setzen Sie ihn auf einen grauen Rahmen, um das vertikale Layout vor der Serie zu überprüfen.
2. Vor dem Vorschlagen lesen
Lesen Sie das GESAMTE Transkript. Finden Sie: Personennamen (Lower Third „nom“), Werktitel („oeuvre“), Orte („lieu“), Begriffe oder Bewegungen („term“), starke Zitate (Premium quote-full), Ankündigungen eines Teils (section-title oder Kapitelkarte), auffällige Zahlen (stat-Szene), Dokumente, Austausche und Websites, über die gesprochen wird (Beweisszenen, Demos). Jeder zitierte Name, jedes Werk oder Buch wird IRGENDWO gezeigt (eine hängende Szene, ein Foto, eine Karte), oder der Grund, warum es nicht gezeigt wird, wird niedergeschrieben. Lesen Sie den Inhalt jedes Diagramms in den EIGENEN Worten des Sprechers (erneut im Transkript lesen), niemals eine Interpretation: Ein falsches Diagramm (ein Profil, das auf die falsche Ebene eines Trichters gesetzt wird) stammt aus Paraphrasierung.
3. Jedes Premium wird in einem Satz konzipiert
„Was ich sehen will: Der Satz groß, kursiv, eine Akzentlinie links, die Zuschreibung klein.“ Wenn die Beschreibung „Text erscheint“ ist, ist es kein Premium: Lower Third oder nichts.
4. Basiskatalog
| Typ | Komponente / Art | Spur | Daten | Dauer |
|---|---|---|---|---|
motion (Full-Screen-Premium) | quote-full | V5 opak | text, author?, source? | 10–14 s |
lower-third | lower-third-nom | V6 alpha | name, years?, tag? | 6 s |
lower-third | lower-third-oeuvre | V6 | title, author, year? | 6 s |
lower-third | lower-third-lieu | V6 | place, date | 6 s |
lower-third | lower-third-term | V6 | term, subtitle? | 6 s |
section-title | V6 | eyebrow?, title | 4 s | |
scene | siehe „Animierte Szenen“ | V5 / V6 / V7 | data, cues | folgt der Stimme |
Ein Name und sein Werk, die innerhalb von 10 s zitiert werden: ein einzelner „nom“ Lower Third mit dem Werk in tag. Ein Zitat des Sprechers selbst: quote-full ohne author (seine Stimme signiert). Die Animationen enden mit einem automatischen Ausblenden über die letzten 18 Frames.
5. Zeiten auf das Wort genau (KRITISCH)
Niemals eine Schätzung: Das Wort in <clip>_transcription.json nachschlagen und seinen start nehmen. Das Element erscheint am Anfang des Wortes (ein Lower Third kann ihm höchstens um 0,5 s vorausgehen; die Synchronisation auf den Satzanfang wird als Ankündigung gelesen, die zu früh kommt). render-segments.py lehnt ein Segment ohne gültige Zeit ab und überprüft jede Zeit gegen das Transkript (OK / WARN / UNKNOWN). Überprüfen Sie auch die Bildrate im JSON (Schritt 1).
6. Plan vor dem Schreiben vorlegen
| # | Zeit | Dauer | Typ | Komponente | Grund |
|---|---|---|---|---|---|
| 1 | 01:24 | 6 s | lower-third | lower-third-nom | 1. Erwähnung von Vorname Nachname |
| 2 | 02:14 | 12 s | motion | quote-full | Pivot-Zitat des Teils 1 |
Auf Genehmigung warten, bevor JSON geschrieben und gerendert wird.
7. Rendern und Importieren
(cd ../motion-design && npm ci) # einmal
python3 scripts/render-segments.py "/pfad/clip.mp4" # alles: Render + XML
python3 scripts/render-segments.py "/pfad/clip.mp4" --lower-thirds-only
python3 s
…
[für die Übersetzung gekürzt]