Was macht Vertical Reels Video Studio (pro)?
Komplett von Anfang bis Ende: (erster Durchlauf: Benutzer nach seinen Handles/Watermark/CTA/Stimme fragen) → Thema → Recherche → Entwurf → Genehmigung → Sprachaufnahme → Timing → Remotion-Szenen → Rendern → Reels-Export → Qualitätssicherung → Covers + Untertitel → Auslieferung.
Dies ist die erweiterte Version von vertical-reels-video-studio (einfach). Die Markenkonfiguration befindet sich in brand.config.json (gelesen von src/brand.ts und als Prop brand an Kompositionen übergeben).
0a. Erster Durchlauf: Benutzer nach SEINEN Einstellungen fragen (niemals Standardwerte verwenden)
Vor dem ersten Video, falls brand.config.json fehlt, "configured": false enthält oder noch @yourhandle enthält,
den Benutzer fragen (eine Frage nach der anderen) und die Antworten in brand.config.json speichern:
- Social-Media-Handles: Instagram, Threads, TikTok, X (welche er verwendet).
- Watermark-Text (genau so, wie er erscheinen soll, z.B.
@yourhandleoder@ig / @x) und Position (bottom-center,bottom-left,top-left,top-right). - CTA-Text und das Handle, das darin erwähnt wird.
- Stimme: ElevenLabs-Stimmen-ID + Modell + Sprache, oder "Ich nehme meine eigene Stimme auf". Der API-Schlüssel wird nur als Secret
ELEVENLABS_API_KEYangefordert. - Sprache und Ton; wie die Stimme ihren Namen/Ihr Handle aussprechen soll.
Dann setze "configured": true. Erfinde niemals ein Handle, verwende niemals ein fremdes Handle (auch nicht das des Autors dieses Kits) und rendere niemals ein Watermark, das noch @yourhandle lautet.
0b. Markenkonfiguration (brand.config.json, ausgefüllt mit den Antworten des Benutzers)
| Schlüssel | Platzhalter | Notizen |
|---|---|---|
| Handles | {{IG_HANDLE}}, {{THREADS_HANDLE}}, {{TIKTOK_HANDLE}}, {{X_HANDLE}} | handles.*, die eigenen des Benutzers |
| Watermark | {{WATERMARK}} + Position | watermark.text / watermark.position, genauer vom Benutzer angegebener Text; niemals fest in Szenen codieren |
| Sprache / Ton | {{LANGUAGE}}, {{TONE}} | z.B. lockeres Indonesisch gua/lu, sparsame Emojis |
| Gesprochener Name | {{SPOKEN_NAME}} | Wie die Stimme Ihr Handle ausspricht (z.B. "Jane Doe" für @janedoe_). Untertitel zeigen weiterhin das echte Handle |
| Haftungsausschluss | {{DISCLAIMER}} | Bei Finanzthemen, z.B. "Bildung, keine Finanzberatung" |
| Stimme | {{VOICE_ID}}, {{TTS_MODEL}}, {{LANGUAGE_CODE}} | voice.*, die Wahl des Benutzers (oder seine eigene Aufnahme) |
| API-Schlüssel | env ELEVENLABS_API_KEY | Niemals ausdrucken, protokollieren oder committen |
| CTA | {{CTA}}, {{CTA_HANDLE}} | cta.text / cta.handle, vom Benutzer erfragt (z.B. "Folge {{CTA_HANDLE}} für mehr", "Kommentiere TUTORIAL") |
| Harte Regeln | {{HARD_RULES}} | Marken, die nie verspottet werden dürfen; Namen, die unkenntlich gemacht werden müssen; Wörter, die nie gesagt werden dürfen |
| Rendergerät | {{RENDER_DEVICE}} | GPU-Maschine oder CPU. Immer angeben, welches tatsächlich verwendet wurde |
1. Recherche und Entwurf (kein Audio, kein Rendern)
- Überprüfe jede Behauptung mit Primärquellen: offizielle Dokumente/PRs, der eigene Beitrag des Autors, Register, datierte Screenshots. Beiträge von Führungskräften gelten als offizielle Aussagen. Kennzeichne Schätzungen (
SCHÄTZUNG · nicht offiziell) und Behauptungen (BEHAUPTET). Verwerfe, was du nicht überprüfen kannst, anstatt es abzuschwächen. - Eine Geschichte pro Video, alltägliche Wörter, langsames Tempo. Harte Produktnamen kommen auf den Bildschirm, nicht in die Sprachaufnahme.
- Biete 2–4 Haken-Optionen an (H1, H2, …): eine Warum/Wie-Frage oder einen kühnen Kontrast. Lass den Benutzer wählen.
- Zeitliche Tabelle:
Zeit | Auf dem Bildschirm | VO. Ziel 45–65 s, hartes Maximum 90 s (ziel ≤ 88 s, damit eine Überarbeitung noch passt). - Schreibe
factcheck.md(Behauptung → Quelle → Status) undsources.md. - Sende den Entwurf und warte auf Genehmigung. "Nicht rendern" vom Benutzer ist endgültig, bis er "los" sagt.
2. Sprachaufnahme (ElevenLabs)
- Zwei Skripte:
script-display.txt(was Untertitel zeigen) undscript-tts.txt(für die Stimme buchstabiert). Behalte eine Display↔TTS-Zuordnungstabelle. - Aussprache (siehe
docs/VOICEOVER.md):A.I.mit Punkten, damit es Englisch klingt; Ticker Buchstabe für Buchstabe in nicht-englischer VO (ETH →E, T, H); Zahlen als Wörter; englische Begriffe in einfacher englischer Schreibweise (keine Trennstriche); ein Komma nach einem finalen /t/ vor einem Vokal; Markennamen nur umschreiben, wenn Tests zeigen, dass es hilft. - Nachbearbeitung:
atempo1.05 (1.1 für schnelle Inhalte). Lautstärke −14 LUFS integriert, ≤ −1 dBTP. - Keine doppelten Zeilen. Wenn eine Zeile den Haken oder einen früheren Abschnitt wiederholt, schneide sie oder formuliere sie um.
- Überprüfe zuerst das Zeichenkontingent. Vertone nur fehlschlagende Zeilen neu (übergebe
previous_textfür Kontinuität).
3. Timing
- Wort-Zeitstempel aus dem TTS-Alignment (dividiert durch den Tempo-Faktor) oder faster-whisper →
timing.json{duration, phrases:[{s,e,words:[{w,s,e}]}], scenes:[{id,start}]}(scripts/build-timing.py). - Führe umschriebene Token zurück zu Anzeigewörtern zusammen (
A.I.→AI,E, T, H→ETH), sonst beginnen Untertitel zu spät. - Szenen orientieren sich an gesprochenen Wörtern:
wt(scene, word)→ Frame, in dem dieses Wort beginnt.
4. Bewegungsstil (Remotion, 1080x1920, 30 fps)
Look: Basis #0A1016, Creme #EFE6D2, Bernstein #FFB000, Rot #E2553F, Grün #7BD88F. Schriftarten via @remotion/google-fonts: Big Shoulders 800 (Überschriften), Plus Jakarta Sans (Fließtext/Untertitel), JetBrains Mono (Chips/Code).
Layout: Wichtiger Inhalt y 200–1500. Fußzeilen-Cluster: Karaoke-Untertitel ~y 1310–1353, Watermark (falls der Benutzer unten gewählt hat) ~y 1427–1446, Fortschritt ~y 1474, alle links von x 960 (Reels zeichnet seine Schaltflächen rechts).
Keine leeren Frames: Der Haken ist bei Frame 0 lesbar; der Anfang und das Ende sind genauso voll wie die Mitte (ein Heldenbild, der Moderator, ein Chip), niemals eine einzelne Zeile auf einem leeren Hintergrund.
Easing-Helfer (src/motion/ease.ts):
const clamp01=(x:number)=>Math.max(0,Math.min(1,x));
const P=(t:number,a:number,b:number)=>clamp01((t-a)/(b-a));
const eOut=(x:number)=>1-Math.pow(1-x,3);
const eIn=(x:number)=>x*x*x;
const backOut=(x:number,s=1.70158)=>1+(s+1)*Math.pow(x-1,3)+s*Math.pow(x-1,2);
const sec=(f:number,at:number)=>(f-at)/30;
const ap=(f:number,at:number,d=0.3)=>eOut(P(sec(f,at),0,d));
const pop=(f:number,at:number)=>Math.max(0,backOut(P(sec(f,at),0,0.35),2.2));
const punch=(f:number,at:number)=>{const t=sec(f,at);if(t<0)return 1;return 1+0.12*eOut(P(t,0,0.2))-0.06*eOut(P(t,0.2,2.5));};
const shake=(f:number,at:number)=>{const t=sec(f,at);return t<0||t>0.4?0:14*Math.exp(-t*10)*Math.sin(t*70);};
Bewegungen: Kinetische Schrift (Wort landet zu seiner VO-Zeit, scale(0.6+0.4*pop), ±4° Setzungsbewegung über 0.25 s, betonte Wörter größer + bernsteinfarben/rot), Zoom-Stoß bei Schlüsselbildern, Kreis-Masken-Enthüllung, Zoom-Durchgangs-Übergänge (Skala 1→4.2 über ~9 Frames, nächste Szene 1.3→1), gedrehte Stempel und Mono-Chips, rote Hervorhebungsboxen auf Screenshots, Schrittzähler, Karaoke-Untertitel (aktuelles Wort bernsteinfarben + 1.08×), CTA-Pop mit Shake, Whoosch/Pop-SFX unter der VO. Ungefähr ein Beat alle 1.5–3 s.
Videoclips: Jedes <OffthreadVideo> in ein <Sequence from={at}> packen und startFrom relativ dazu setzen; sonst klammert der Clip an seinem letzten Frame und sieht eingefroren aus. Kurze Clips für lange Beats loopen. Clips beginnen mit dem ersten brauchbaren Frame.
Audio-Übergänge: Wenn eine Eröffnung Live-Audio (ein Lied, ein Clip) vor der Erzählung verwendet, blende es in die Stille und lasse ~0.3–0.5 s (einen Blitz/Whoosch-Übergang) vor dem ersten VO-Wort, damit es niemals überdeckt wird.
Optionaler Moderator (Maskottchen) mit Lippen-Synchronisation
- Eine konsistente Charakteridentität in jedem Video. Separate Ebenen: Körper (geschlossener Mund ausgemalt), Arm auf einem Schulterdrehpunkt unter dem Mantelrand, eine statische Schulterkappe, Mund-Sprites
closed/half/open/wide/round. - Treibe den Mund über die VO-WAV-Datei an, nicht über eine Schleife:
scripts/build-mouth-track.py→ Zustände pro Frame (geschlossen in Stille und Endhaltung, mindestens 2 Frame Haltezeit). Beschränke den Arm auf den Bereich des Riggs; ein Ganzkörper-Wackeln allein reicht nicht aus. - Setze den Moderator nur ein, während er auf dem Bildschirm ist; Covers verwenden den statischen Körper mit geschlossenem Mund.
5. Rendern
- Bevorzuge eine GPU-Maschine, falls vorhanden (Remotion
--hardware-acceleration, eine Konfiguration ohneencodingBufferSize/encodingMaxRate, die benötigtes NVENC zerstören); falle nur auf CPU zurück, wenn erlaubt. Gib immer an, welches Gerät gerendert hat. - Rohrender:
yuv420p+bt709inremotion.config.ts, dann der Reels-Durchgang.
6. Reels-sicherer Export (scripts/reels-export.sh, Details in docs/REELS_SAFE_EXPORT.md)
1080x1920 SAR 1, H.264 High Level 4.1, yuv420p TV-Bereich, BT.709-Tags, CFR 30, GOP 60 geschlossen, 10 Mbps (min 8, max 12), Two-Pass loudnorm −14 LUFS / −1.5 dBTP, AAC 192k 48 kHz stereo, +faststart, < 90 s. Auch eine kleine Vorschau < 40 MB (scripts/make-preview.sh).
7. Qualitätssicherung (obligatorisch, vor der Auslieferung)
- Whisper das finale MP4 (
scripts/whisper-check.py): falsche Aussprachen, Stocker, störende Geräusche, doppelte Zeilen, erstes Wort jeder Szene hörbar. - Kontaktabzug an jeder Szenengrenze (
scripts/contact-sheet.sh): Ruckler, Überlappungen, abgeschnittener Text, Sicherheitszone, eingefrorene Clips, leere Eröffnung/Ende, vorhandenes Watermark, passend zubrand.config.jsonund exakt buchstabiert. scripts/qa-check.sh: Codec/Profil/Level, pix_fmt, Bereich, Farb-Tags, CFR, AAC 48k, moov vor mdat, Dauer < 90 s, −14 LUFS.- Korrigieren und neu rendern. Behalte die vorherige Version, wenn du überarbeitest.
8. Immer mit dem Video ausliefern
- Untertitel für IG (Haken, Körper, CTA, leichte Hashtags), Threads (kürzer, keine Hashtags), TikTok, plus eine
.srt. - Vier Covers A–D: 1080x1920 + 1080x1350 Raster, Schlüsseltext im Zentrum 1080x1080; ein Haken, ein Hauptfoto, max. 2–3 Zahlenkarten; Kontaktabzug + Benutzer wählen lassen.
- Quellennachweise und die Faktenprüfdatei.
- Eine Zeile in
videos-log.md: Titel, Dateien, Dauer, Lautstärke, Gerät, Quellen, Status "nicht gepostet".
Regeln
- Niemals posten, DM, hochladen oder kaufen. Liefere Dateien aus.
- Keine erfundenen Fakten, Stars, Preise oder Ergebnisse. Gib Open-Source-Autoren auf dem Bildschirm Anerkennung.
- Nur echte Fotos, Logos und Clips; keine KI-generierten Gesichter echter Personen. Kennzeichne Mock-ups als
illustration. - Verwende nur Medien, für die du die Rechte hast; informiere den Benutzer, wenn Musik oder Clips urheberrechtlich geschützt sind (Stummschalt-/Anspruchsrisiko).
- Keine Geheimnisse in Dateien. Stelle jede Frage zuletzt, in einer eigenen Nachricht.