Talking-Head → fertiges 9:16 Kurzvideo
Die Pipeline wandelt eine einzelne Rohaufnahme (plus optionale saubere Audiodatei) in edit/final.mp4 (1080×1920, 60 fps, H.264 + AAC 48 kHz). Sie erstellt außerdem vier vollständige Stems und einen Bericht. Alles geschieht im Code, lokal im Projekt installiert: ffmpeg, Python, Node und HyperFrames. Keine systemweiten Installationen und keine Editor-Apps.
- Der Standard:
references/brief.mdist das vollständige Briefing, mit allen Zahlen zu Pegeln, Geometrie, Timing, Typografie und Farbe. Wenn diese Datei und das Briefing bei einer Zahl nicht übereinstimmen, gewinnt das Briefing. - Vor dem Start lesen:
references/lessons.mdbeschreibt die Fallstricke, die beim ersten Durchlauf Stunden kosten. - Sound-Profil:
references/sound-profile.mdenthält den Soundeffekt-Stil und die Pegel des Erstellers, gemessen an seinem eigenen Schnitt. - Bewegungsbibliothek:
references/motion-library.mdenthält die kuratierten Bewegungsreferenzen des Benutzers, den Haus-Stil, dem die Grafiken folgen. - Beispiele:
references/examples/enthält die Grafiken des ersten Kurzvideos (r1–r9 plus cta).references/example-report.mdist ein fertiger Bericht.
Stellen Sie dem Redakteur zuerst die Fragen zum Stil-Intake (Schritt 0b), arbeiten Sie dann autonom, abgesehen von einem bewussten Stopp: der Storyboard-Genehmigung in Schritt 7. Fragen Sie den Benutzer zwischen diesen beiden Punkten nichts: treffen Sie jede Entscheidung (Take-Auswahl, Layout, sachliche Meinungsverschiedenheit, nicht erreichbare UI), machen Sie weiter und protokollieren Sie es für den Bericht. Die Storyboard-Genehmigung ist der einzige Punkt, an dem Sie auf den Benutzer warten. Stoppen Sie nur, wenn die Eingabedateien fehlen oder nicht lesbar sind.
Layout eines Projekts
<projekt>/RAW.MP4 (+ sauberes Audio, falls vorhanden)
<projekt>/edit/
project.json # alle entscheidungen pro video leben hier (takes, runs, captions, cover...)
tools/ # bin/ffmpeg, bin/ffprobe, venv/, node_modules/ (setup.sh)
work/ # alle zwischenstufen (gfx/ ist das HyperFrames-Projekt)
stems/ final.mp4 final_master.wav REPORT.md
Alle Skripte werden aus edit/ ausgeführt mit export PATH="$PWD/tools/bin:$PATH" und PY=tools/venv/bin/python. $S unten ist der scripts/-Ordner dieser Fähigkeit.
Schritte
0. Einrichtung und Sondierung
bash $S/setup.sh <projekt>. Dann ffprobe -show_streams der Kameradatei und notieren:
- die Größe und die Rotation (Hochformat-Quellen kommen oft als Querformat mit einer -90°-Flagge an);
- die fps;
- das Audio-Layout.
Einmalig in ein ausgerichtetes Zwischenformat dekodieren. 4K nicht für jeden Schritt neu dekodieren:
ffmpeg -i RAW.MP4 -an -vf scale=1080:-2 -c:v libx264 -crf 13 -g 15 work/cam1080.mp4
scale=-2:1080 für eine Querformat-Quelle verwenden. Lange Befehle im Hintergrund ausführen: etwa 6 Minuten pro 90 s 4K auf einem 8 GB Mac.
0b. Stil-Intake (einmalig fragen, vor jeglicher Arbeit)
Fragen Sie die Person, die das Video bearbeitet, in EINER Fragerunde (verwenden Sie das Frage-Tool, wenn Sie es haben), nach den Entscheidungen, die nur sie treffen kann. Überspringen Sie alles, was sie bereits angegeben hat, und notieren Sie die Antworten in project.json → "intake":
- Captions: der alltägliche kleine Stil,
"small_style": "pill"(ruhig, allgemeine Videos) oder"mono"(Schreibmaschine, Tech/AI/Dev-Videos); plus ob Hero-Momente verwendet werden sollen (Hook und Schlüsselsätze mit nur ihnen auf dem Bildschirm). - Akzentfarbe: aus dem Thema (die Markenfarbe des Hauptprodukts; Sie recherchieren sie), passend zu ihrer Kleidung, oder ein Hex-Code, den sie nennen →
"accent". - CTA:
"cta_style": "box"oder"pill", das Kommentar-Keyword und der Link-Chip-Text für die Pill (z. B. "Kostenlos auf GitHub · owner/repo"). - Musik:
"music": {"mode": "synth" | "file" | "none"}(+ der Dateipfad). - Titelbild: ihrs, oder aus dem Hook geschrieben.
Bieten Sie sinnvolle Standardwerte in den Optionen an (z. B. die Markenfarbe des Themas; Pill + Hero für allgemeine Videos, Mono + Hero für Tech-Videos; den anderen CTA-Stil aus ihrem letzten Video), sodass die Antwort Sekunden dauert. Wenn niemand antworten kann (ein unbeaufsichtigter Durchlauf), verwenden Sie diese Standardwerte und geben Sie dies im Bericht an.
1. Synchronisieren und Transkribieren
$PY $S/analyze_audio.py <kamera> [clean_audio]kreuzkorreliert bei 16 kHz und meldet den Offset und das Spitzenverhältnis. Es schreibt die Sprachquelle auf der Kamera-Zeitachse, die 10 ms RMS-Hüllkurve, die Anzahl der beschnittenen Samples und den Grundrauschpegel. Ohne saubere Datei verwendet es die Kamera-Spur, und Sie müssen dies im Bericht angeben.$PY $S/transcribe.py medium.en "Produktnamen, Personen, @handles"listet jedes Wort mit Lücken über 250 ms auf.analyze_audio.pyerneut ausführen, sodass die Liste der ruhigen Passagen die benachbarten Wörter zeigt.- Gruppieren Sie die Wörter in Takes pro Zeile. Behalten Sie für jede Zeile den letzten vollständigen Take. Verwenden Sie einen früheren nur, wenn der letzte einen hörbaren Fehler hat (Stottern, beschnittene oder falsche Wörter, Neustart). Entfernen Sie Neustarts, Selbstkorrekturen, "okay", einzelne Silben und Gemurmel nach Takes sowie tote Luft an beiden Enden.
2. Der Schnitt
Schreiben Sie project.json → "lines": [[label, src_start, src_end], …] mit groben Kanten um jeden behaltenen Take, in Lieferreihenfolge. Benachbarte Zeilen können einen Bereich teilen. Dann:
$PY $S/cut.pybehandelt Einsätze/echte Enden (−35 dB / −32 dB für 150 ms), Pausen über 250 ms → 120 ms, einen 40 ms Vorlauf, einen 50 ms Audio-J-Cut-Vorlauf, Ausläufer, die innerhalb der Lücke ausklingen, bildquantisierte Bildschnitte und ENDE.$PY $S/check_joins.py: Jede Verbindung mit einer ruhigen Strecke von mehr als 150 ms erhält einen negativen"gap_overrides": {"<segment>": -0.0333}.cut.pyerneut ausführen. Niemals Stille hinzufügen.
3. Blickkontakt
Erstellen Sie einen kleinen Proxy (scale=-2:540), dann $PY $S/eyesheet.py work/proxy.mp4 und schauen Sie auf work/eye/*.jpg. Fügen Sie 100 ms Schritte um jede Kopfdrehung hinzu. Die Kamera zeigt nur, während der Sprecher auf die Linse blickt. Wenn er während einer Zeile wegschaut, teilen Sie die Zeile an der Wortgrenze vor der Drehung und machen Sie den Rest zu einem vollständigen visuellen Element.
4. Planen der Runs (vor jeder Grafik)
$PY $S/plan.py gibt die Bildausschnittszeiten aus. Schreiben Sie "runs": [[start_ms, end_ms, layout, "R1 hook"], …], die [0, ENDE] kacheln (verwenden Sie "ENDE" für das letzte Ende), und führen Sie es dann erneut aus. Es validiert die Regeln:
- der Hook ist ein Split und der Outro (CTA onwards) ist Vollbild Kamera;
- kein Run ist länger als etwa 8 s und benachbarte Runs teilen nie ein Layout;
- alle drei Layouts werden verwendet.
Wählen Sie Layouts nach Inhalt:
- Direkt-zur-Kamera Meinungen und Geschichten → cam;
- ein Screenshot, eine Karte, eine Logoreihe oder eine kurze Liste → split;
- Bildschirmaufnahmen, Nachrichtenseiten, Produkt-UI, die Vergrößerung benötigt → visual.
Setzen Sie Grenzen an Bildschnitte. plan.py gibt dann die Wörter jedes Runs mit laufrelativen Zeiten aus; timen Sie die Grafiken darauf ab.
5. Recherche und Aufnahmen
Für jedes genannte Produkt und jede Behauptung (Veröffentlichung, Zitat, Zahl) finden Sie die tatsächliche Quelle und überprüfen Sie die Zahlen anhand von zwei oder mehreren seriösen Quellen. Notieren Sie jede Unstimmigkeit für den Bericht.
- Erfassen Sie echte Seiten mit
node $S/shot.mjs <url> <out.png> 1280 1400 0, ausgeführt vonedit/. Es findet HyperFrames' chrome-headless-shell selbst. Respektieren Sie robots.txt und die Bedingungen jeder Website: Erfassen Sie die Seiten, die Sie zitieren, führen Sie keinen Crawl durch. - Repos enthalten oft ein UI-GIF oder Screenshots in
docs/; bauen Sie die UI daraus neu auf. - Eine hinter einer Login-Wand verborgene UI wird aus öffentlichen Screenshots oder Dokumentation neu aufgebaut und im Bericht vermerkt.
- "Claude Code" bedeutet die Claude Desktop-App-UI, es sei denn, der Sprecher spricht über das Terminal.
6. Captions und Cover (jetzt geplant, weil das Storyboard sie zeigt)
$PY $S/captions.py work/cam1080.mp4 (das Kameravideo dient für die Hero-Farbe). Setzen Sie "small_style": "mono" für Tech-/AI-Tool-/Entwickler-/Produkterklärer-Videos (alles mit Terminals, Code oder App-Bildschirmen) oder "pill" für allgemeine und Lifestyle-Videos. Ohne "captions.chunks" druckt es einen automatischen Entwurf (der kleine Stil überall, ein Hero im Hook entworfen). Bearbeiten Sie ihn und fügen Sie ihn wieder ein. Es gibt drei Stile:
- mono
[a, b, "mono", [akzentwort]]: 1–3 Wörter, eine Terminal-Schreibmaschine. Großbuchstaben in VT323 auf einer fast schwarzen Box, die wächst, während die Buchstaben eingetippt werden (30 Buchstaben/s), ein bedeutungsvolles Keyword auf einem soliden Akzentblock und ein Akzentblock-Cursor (stetig während des Tippens, blinkend danach).assemble.pytippt es Frame für Frame. - pill
[a, b, "pill"]: 1–3 Wörter, klein, Poppins Bold auf einer durchscheinenden dunklen abgerundeten Box: der ruhigere kleine Stil für Nicht-Tech-Videos. - hero
[a, b, "hero", [große Wort-Indizes]]: 2–5 Wörter mit 1–2 RIESIGEN, soliden Wörtern (Archivo Black) zwischen kleinen Wörtern oben und unten, die dem kleinen Stil des Videos folgen (Pills oder statische Mono-Boxen). Die Farbe des großen Wortes passt zur Kleidung des Sprechers:captions.py work/cam1080.mp4tastet den Oberkörper im ersten Hero-Frame ab und gibt die ausgewählte Farbe aus. Es hat einen tiefen, gleichfarbigen Umriss, sodass es über dieser Kleidung lesbar ist. Überschreiben mit"hero_color": "#RRGGBB", wenn die Auswahl daneben liegt (bunte Prints, eine Jacke über einem Hemd). Verwenden Sie es im Hook und bei wichtigen Zeilen, bei denen nur der Sprecher auf dem Bildschirm ist (Vollbild Kamera oder die Karte in einem Split), niemals über einer Grafik und niemals zweimal hintereinander. Wählen Sie Wörter, die die Bedeutung tragen (die Behauptung, Zahl oder der Nutzen), niemals Funktionswörter.
Setzen Sie "cover": [zeile1, zeile2] (schreiben Sie es aus dem Hook, wenn der Benutzer keines angegeben hat, etwa 14 Zeichen pro Zeile bei 110 px). Setzen Sie das Pill-Zentrum pro Layout in "y" und das Hero-Block-Zentrum in "hero_y".
- Captions dürfen niemals auf dem Gesicht, der Kartenkante oder einem Visuellen liegen.
- Bei einer Hochformat-Quelle ist der Split-Spalt das Gesicht, platzieren Sie Pills daher etwa bei y 1660 auf dem Oberkörper und überprüfen Sie das Outro auf einem echten Frame.
assemble.pykomponiert beide Stile.
7. Storyboard und Beat-Tabelle: STOP für Genehmigung
Nichts wird gerendert, bis der Benutzer den Plan gesehen und genehmigt hat.
- Wählen Sie Bewegungsreferenzen für jeden Grafik-Beat aus
references/motion-library.md(den kuratierten Hausstil des Benutzers). Inreferences/motion-prompts.mdstehen die vollständigen Prompt-Texte (mit Quellenangabe); lesen Sie den Block für jede zitierte ID. Kratzen Sie niemals Galerien von Drittanbietern. Die Bibliothekseinträge wurden vom Benutzer hinzugefügt, und einige Websites, z. B. prompt-motion.com, blockieren KI-Crawler. - Wählen Sie die Akzentfarbe des Videos basierend auf dem, was gelehrt wird: die Markenfarbe des Hauptprodukts (Logo, primärer Button), andernfalls eine Farbe, die zum Thema passt. Schreiben Sie
"accent": {"color": "#RRGGBB", "why": "..."}und führen Sie$PY $S/accent.pyaus. Es schreibtwork/gfx/assets/accent.css(Akzentfüllung, eine 4,5:1 Textabstufung und einen hellen Band-Ton), das jede Komposition überbase.cssaufnimmt. Hartcodieren Sie niemals Akzent-Hex-Werte in Kompositionen: Verwenden Sievar(--clay),var(--clayText)undvar(--band). Die Hero-Caption-Farbe ist separat (sie kommt von der Kleidung). - Schreiben Sie
"beats"in project.json, einen oder mehrere pro Run:{"run": "R1", "t": 0.0, "visual": "...", "camera": "...", "sfx": "...", "refs": ["id"], "source": "echte aufnahme / wiederaufgebaute UI / logo"}. Optional"storyboard_notes": {"R1": "warum dieses layout"}hinzufügen. $PY $S/storyboard.py work/cam1080.mp4schreibtwork/storyboard.html: eine 9:16 Skizze pro Run (Layout-Zonen, der Frame des Sprechers, die Grafik, Caption-Stil und -Position) und die Beat-Tabelle (Zeit, Run, Layout, genaue Wörter, Aktion auf dem Bildschirm, Kamerabewegung, SFX, Caption-Stil mit jedem Hero-Moment, Bewegungsreferenzen, Quelle).- Zeigen Sie es dem Benutzer (die Seite zeigt das Akzent-Muster und warum es gewählt wurde): veröffentlichen Sie es als Artefakt oder senden Sie die Datei und geben Sie einen Hinweis, worauf zu achten ist. Dann beenden Sie Ihren Zug und warten Sie. Wenden Sie die Änderungen des Benutzers auf project.json an, generieren Sie es neu und zeigen Sie es erneut. Fahren Sie nur nach einer eindeutigen Genehmigung fort.
8. Grafiken (HyperFrames)
- Kopieren Sie
assets/engine.js,assets/base.css,assets/accent.css,assets/fonts/undassets/motion/inwork/gfx/assets/(führen Sie dannaccent.pyerneut aus, damit der pro-Video-Akzent den Standard ersetzt), plushyperframes.jsonvonhyperframes init. - Schreiben Sie eine
work/gfx/compositions/<run key lowercase>.htmlpro Split/Visual-Run. Seindata-durationmuss exakt dem Run entsprechen. - Bauen Sie genau das, was das genehmigte Storyboard zeigt, und entsprechen Sie den Bewegungsreferenzen jedes Beats. Beginnen Sie mit dem nächsten Beispiel in
references/examples/:r1,r3,r5,r7: Split-Welten mit Schritten und Schüben;r2: Logo-Lockup, dann eine Peitsche zu einer echten Aufnahme im festen Rahmen auf seiner gewaschenen Kopie;r4,r6,r9: Produktfenster, in denen sich nur die innere Kamera bewegt;cta: die transparente Kommentarkarte (CTA-Stil A);cta_pill.html: die Kommentar-Pill (CTA-Stil B);motion/*.html: eine Demo pro Bewegungskomponente (Cursor, Glas, Morph, Flut + Iris, Maskrise, Kinetik, Wand, Peitsche; Explain-Flow, Explain-Callout, Explain-Status, Explain-Loop); siehe "Bewegungskomponenten" und "Erklärerkomponenten" unten.
So funktioniert die Engine und die Regeln, die wichtig sind:
E.run(id, dur, render)registriert eine pausierte Zeitleiste.render(t)muss eine reine Funktion von t sein.E.pathgibt die Weltkamera-Keyframes.E.camerawendet sie an und verwischt den Viewport entlang der Bildschirmgeschwindigkeit (σ = 0,29·v·0,75/60, ≤ 40 px, null im Ruhezustand und bei t = 0).E.trackundE.landanimieren objektbezogene Eigenschaften (Opazität, x, y, Skalierung, Unschärfe). Tiefenschärfe: Nachbarn bis zu 14 px Unschärfe und 70 % Opazität; der alte Hero 9 px und 40 %.- Kamerabewegungen:
- Gleiten: sine.inOut, Skalierungsänderung ≤ 0,04;
- Schritt: 0,5 s power3.inOut, beginnend 0,25 s vor dem Wort, das das nächste Element benennt;
- Schub: 1,2–2 s power2.inOut, bis zu etwa 1,6×;
- Rückzug: 1–2 s;
- Peitsche: höchstens eine pro Run, 0,45 s out power3.in, 0,6 s in power3.out.
- Frame 0 ist der Landezustand, scharf, mit der Kamera in Ruhe.
- Während ein Produktfenster das Subjekt ist, bewegt sich nur die Kamera innerhalb des Fensters (1,15–1,4×, 0,4–0,7 s power2.inOut).
- Inhaltszonen:
- Splits halten Inhalt in y 40–900, und die Welt blendet ab y 900 aus;
- Visuals halten Inhalt über y 1230;
- auf Frame 0 bleibt die Intro-Grafik unter y 620 (das Cover sitzt darüber).
- Visueller Stil:
- ein spärliches Subjekt pro Szene;
- Poppins und nichts unter 30 px;
- fast weißer radialer Boden und der dreischichtige Schatten;
- nichts Dunkles, kein Raster;
- animieren Sie die Aktion, beschriften Sie sie nie.
- Jedes sichtbare, Sound-würdige Ereignis geht in das
<script type="application/json" id="events">der Komposition (pop / click / chime / thud für Icons, die landen / flash für weiße Blitze / whoosh am Peitschen-Mittelpunkt / keys / ticks, run-relativ). Der Audio-Schritt liest diese, sodass SFX immer auf ihrem ... landen
… (abgeschnitten für Übersetzung)