homelab-brain/ki-video/PLAN.md

828 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# KI-Video — Lokale Produktionspipeline
**Stand: 16.03.2026**
## Ziel
Lokale, praktisch nutzbare Produktionsstrecke fuer YouTube-Videos im Commentary-/Erklaerstil.
Kein Spielzeug-Demo, kein Forschungsprojekt: Thema rein → fertiges Video raus.
## Videoformat
Referenz-Stil: **"Geld & Imperien"** / **"Money & People"** (YouTube, geopolitische Commentary-Kanaele)
Beispielvideos:
- https://youtu.be/4XfhrrbklbM (24 Min, "Irans Hyperschall-Schlag", Geld & Imperien)
- https://youtu.be/MIkAOwJYaP0 (19 Min, "Irans Machtuebernahme", Money & People)
| Eigenschaft | Beschreibung |
|---|---|
| **Typ** | Commentary, Erklaervideos, Meinungs-/Analyseformate |
| **Laenge** | 10-30 Minuten |
| **Stil** | Professionelle Erzaehlstimme + Bilder + Karten + Infografiken + Text-Overlays + Ken-Burns |
| **Avatar** | **Sprechender KI-Avatar als PiP-Overlay (~20% Bildschirm, unten rechts)** |
| **Kein** | Echte Face-Cam, Realfilm, Hollywood-VFX |
### Avatar-Konzept (Picture-in-Picture)
```
┌─────────────────────────────────────────────────────────┐
│ │
│ HAUPTBILD (80%) │
│ Karten, Infografiken, Szenenbilder │
│ Ken-Burns, Zoom, Ueberblendungen │
│ │
│ │
│ │
│ ┌─────────────┐ │
│ │ │ │
│ │ AVATAR │ │
│ │ (~20%) │ │
│ │ lip-sync │ │
│ │ sprechend │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
1920 x 1080 (Full HD)
Avatar-Overlay:
- Groesse: ~384 x 384 px (20% der Bildhoehe)
- Position: unten rechts, 40px Padding
- Hintergrund: halbtransparenter Kreis oder abgerundetes Rechteck
- Inhalt: Sprechende Person (SadTalker) synchron zum Voiceover
- Stil: professionell, Brustbild, neutraler Hintergrund
```
Der Avatar laeuft DURCHGEHEND waehrend des gesamten Videos.
Das Referenzbild fuer SadTalker ist ein einmalig generiertes Portraet (FLUX/SDXL).
Die Lippenbewegung wird aus dem XTTS-Voiceover-Audio abgeleitet.
### Anatomie eines 20-Min-Videos (Referenz)
| Element | Menge | Beschreibung |
|---|---|---|
| **Skript** | ~3500-5000 Woerter | Monolog, professioneller Ton, analytisch |
| **Szenenbilder** | 80-120 Stueck | Karten, Infografiken, Symbolbilder, Illustrationen |
| **Hero-Bilder** | 10-15 Stueck | Hochwertige Key-Visuals fuer Titelszenen/Kapitelwechsel |
| **Text-Overlays** | 20-40 Stueck | Zahlen, Namen, Fakten als Einblendung |
| **Avatar-Video** | 20 Min (durchgehend) | SadTalker lip-sync, PiP unten rechts, ~20% Bildschirm |
| **Voiceover** | 20 Min Audio | XTTS v2, natuerliche deutsche Maennerstimme |
| **Hintergrundmusik** | 1-2 Tracks | Ambient, dezent, lizenzfrei |
| **Uebergaenge** | ~80-120 | Ken-Burns, Ueberblendungen, Zoom-Ins |
## Produktions-Pipeline (5 GPUs parallel)
Kernidee: **Phase 1 = Cloud-LLM (Skript), Phase 2 = alle 5 lokale GPUs parallel, Phase 3 = Assembly.**
Skriptqualitaet ist der Flaschenhals — deshalb Cloud-LLM fuer Kreativarbeit, lokale GPUs fuer Massenproduktion.
```
PHASE 1 — SKRIPT + SZENENPLAN (~15-30 Min, Cloud + lokal)
═════════════════════════════════════════════════════════
Thema + Recherche-Notizen (manuell)
GPT-5.4 (OpenAI API) → Skript (~4000 Woerter, 20 Min Lesezeit)
│ Persoenlichkeit, Meinung, Storytelling, Stil
│ Kosten: ~0.10-0.50 EUR pro Skript
Menschliches Review (~20-30 Min) → Korrektur, Feinschliff, Faktencheck
Qwen 14B (lokal, vLLM, :8401) → Szenenplan aus fertigem Skript:
100 Szenen mit je:
- Bildprompt (EN, fuer FLUX/SDXL)
- Szenentyp (hero / standard / infografik / karte)
- Text-Overlay (falls noetig)
- Geschaetzte Dauer (Sekunden)
Skript + Szenenplan als JSON → Orchestrator
Warum hybrid?
- GPT-5.4 fuer Skripte: beste Qualitaet, Persoenlichkeit, deutsche Sprache auf Top-Niveau
- Qwen 14B lokal fuer Szenenplan: strukturierte JSON-Generierung, braucht keine Kreativitaet
- Kein Vendor-Lock: Skript kann auch mit Claude, Gemini o.ae. generiert werden
- Kosten pro Video: ~0.10-0.50 EUR (irrelevant vs. Stromkosten der GPUs)
PHASE 2a — TTS-VOICEOVER (3080 #0, ~15 Min, startet sofort)
═════════════════════════════════════════════════════════════
Orchestrator schickt Skript-Text an XTTS v2 Worker.
Output: 20 Min deutsches Voiceover als WAV-Datei.
Muss VOR SadTalker fertig sein (Avatar braucht Audio als Input).
PHASE 2b — PARALLEL-PRODUKTION (alle 5 GPUs, ~30-40 Min)
══════════════════════════════════════════════════════════
┌──────────────────────────────────────────────────────────────────┐
│ ORCHESTRATOR (ki-tower CPU) │
│ Verteilt Jobs, pollt Status, sammelt Ergebnisse │
└──────┬──────────┬──────────┬──────────┬──────────┬───────────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌──────────┐┌──────────┐┌──────────┐┌──────────┐┌──────────┐
│ 3090 ││ 3080 #0 ││ 3080 #1 ││ 3080 #2 ││ 3080 #3 │
│ ki-tower ││ Worker ││ Worker ││ Worker ││ Worker │
│ ││ ││ ││ ││ │
│ FLUX.1 ││ SDXL ││ SDXL ││ SadTalker││ ESRGAN │
│ Hero- ││ Standard-││ Standard-││ AVATAR ││ Upscale │
│ Bilder ││ Szenen ││ Szenen ││ lip-sync ││ + Whisper│
│ 15 Stk ││ ~50 Stk ││ ~50 Stk ││ 20 Min ││ Untertit.│
│ ~15 Min ││ ~25 Min ││ ~25 Min ││ ~25 Min ││ ~10 Min │
└──────────┘└──────────┘└──────────┘└──────────┘└──────────┘
Ablauf 3080 #0: XTTS v2 Voiceover (15 Min) → sobald fertig → SDXL Bilder (10 Min)
Ablauf 3080 #2: Wartet auf Voiceover → SadTalker Avatar (25 Min, GPU-intensivster Job)
Alle anderen starten sofort parallel.
Engpass = SadTalker Avatar-Rendering (~25 Min fuer 20 Min Video).
SadTalker-Details:
- Input: Referenz-Portraet (einmalig generiert) + Voiceover-Audio (aus Phase 2a)
- Output: 20 Min Video (384x384 px) mit synchroner Lippenbewegung
- Verarbeitung in ~30s-Clips, sequentiell auf 3080 #2
- ~6 GB VRAM (passt auf 10 GB 3080)
- Laengster Einzeljob → bestimmt Gesamtdauer Phase 2
PHASE 3 — ASSEMBLY + EXPORT (ki-tower, seriell, ~15-20 Min)
════════════════════════════════════════════════════════════
FFmpeg: Bilder + Ken-Burns + Zoom + Ueberblendungen → Hintergrund-Video
FFmpeg: Avatar-PiP compositen (unten rechts, 384x384, halbtransparenter Rahmen)
│ ┌─────────────────────────────────────────────┐
│ │ Hauptbild (Szene/Karte/Infografik) │
│ │ │
│ │ │
│ │ ┌──────────┐ │
│ │ │ Avatar │ │
│ │ │ lip-sync │ │
│ │ └──────────┘ │
│ └─────────────────────────────────────────────┘
FFmpeg: Audio-Mix (Voiceover + Hintergrundmusik + Lautstaerke-Normalisierung)
FFmpeg: Text-Overlays (Fakten, Zahlen, Namen) einbrennen
FFmpeg: Untertitel (SRT aus Whisper) einbetten
NVENC: H.264/H.265 Encoding → fertiges MP4 (1080p)
Export: Thumbnail (FLUX hero-Bild, upscaled) + Titel + Description + Tags
```
### Zeitschaetzung: 20-Minuten-Video mit Avatar
| Phase | Dauer | GPUs aktiv | Engpass |
|---|---|---|---|
| 1. Skript + Szenenplan | ~15 Min | 1 (3090) | LLM-Inferenz |
| 2a. TTS-Voiceover | ~15 Min | 1 (3080 #0) | XTTS v2 Inferenz |
| 2b. Parallel-Produktion | ~25 Min | 5 (alle) | **SadTalker Avatar** |
| 3. Assembly + Export | ~20 Min | 1 (3090 NVENC) | FFmpeg PiP-Compositing |
| **Gesamt** | **~75 Min** | | |
SadTalker ist jetzt der Engpass (statt Bildgenerierung).
20 Min Lip-Sync-Video auf 3080 = ~25 Min Renderzeit.
Zum Vergleich: Seriell auf nur 1 GPU = ~5-6 Stunden.
### GPU-Auslastung waehrend Phase 2
| GPU | Schritt 1 | Dauer | Schritt 2 (wenn fertig) | Dauer | Output |
|---|---|---|---|---|---|
| **3090** | FLUX.1-dev Hero-Bilder | ~15 Min | idle / Thumbnail-Varianten | ~5 Min | 15 Key-Visuals |
| **3080 #0** | **XTTS v2 Voiceover** | ~15 Min | **SDXL Restbilder** | ~10 Min | 20 Min Audio + ~20 Bilder |
| **3080 #1** | SDXL Standard-Szenen | ~25 Min | — | — | ~50 Szenenbilder |
| **3080 #2** | (wartet auf Audio) | — | **SadTalker Avatar** | ~25 Min | 20 Min Lip-Sync-Video (384x384) |
| **3080 #3** | Real-ESRGAN Upscaling | ~5 Min | Whisper → SRT | ~5 Min | Upscaled Bilder + Untertitel |
Ablauf-Kette: **TTS muss vor SadTalker fertig sein** (Audio → Lip-Sync).
Deshalb: 3080 #0 macht zuerst TTS, dann SDXL. 3080 #2 wartet auf Audio, dann SadTalker.
Alle anderen GPUs starten sofort.
## Konkretes Beispiel: "Irans Hyperschall-Schlag" (24 Min)
So wuerde ein Video im Stil von "Geld & Imperien" durch die Pipeline laufen:
```
INPUT:
Thema: "Irans neue Hyperschallrakete — geopolitische und wirtschaftliche Folgen"
Recherche: 3-4 Quellenlinks, eigene Stichpunkte
PHASE 1 — Skript + Szenenplan:
├── GPT-5.4 (Cloud): Skript ~4500 Woerter, 24 Min Lesezeit
│ "Was ich euch heute zeige, veraendert die Welt..."
│ Kapitel: Waffentechnik → Strategie → Oel → Europa → Fazit
│ → Mensch reviewt und korrigiert (~20 Min)
└── Qwen 14B (lokal): Szenenplan (JSON) aus fertigem Skript: 105 Szenen
Szene 001: { typ: "hero", prompt: "dramatic missile launch, night sky, photorealistic",
overlay: "Mach 15 — Irans Hyperschallwaffe", dauer: 8s }
Szene 002: { typ: "karte", prompt: "middle east map, iran highlighted, military bases marked",
overlay: null, dauer: 12s }
Szene 003: { typ: "standard", prompt: "patriot missile defense system, desert, realistic photo",
overlay: "Patriot-System: $3 Mio pro Abfangrakete", dauer: 10s }
...
Szene 105: { typ: "hero", prompt: "world map with shifting power balance, dramatic lighting",
overlay: "Die neue Weltordnung", dauer: 15s }
PHASE 2a — TTS zuerst (3080 #0, 15 Min):
3080 #0: XTTS v2 → 24 Min deutsches Voiceover (WAV)
PHASE 2b — Alles parallel (alle 5 GPUs, 25 Min):
3090: 15 Hero-Bilder (FLUX.1-dev) → Titel, Kapitelwechsel, Outro
3080 #0: (TTS fertig) → 30 Standardbilder (SDXL) → Militaer, Wirtschaft
3080 #1: 50 Standardbilder (SDXL) → Karten, Infografiken, Symbolbilder
3080 #2: SadTalker → 24 Min Avatar-Video (384x384, lip-sync aus Voiceover)
3080 #3: Upscaling aller Bilder auf 1920x1080 + Whisper → Untertitel-SRT
PHASE 3 — Assembly (20 Min):
FFmpeg: 105 Szenen × Ken-Burns/Zoom → Hintergrund-Videospur
FFmpeg: Avatar-PiP compositen (unten rechts, 20%, halbtransparenter Rahmen)
FFmpeg: Audio-Mix (Voiceover + Ambient-Musik)
FFmpeg: Text-Overlays + Untertitel einbrennen
NVENC: H.265 Encoding
Output: "irans-hyperschall-2026-03.mp4" (1080p, ~1.5 GB)
Bonus: Thumbnail + YouTube-Description + Tags
```
Gesamtzeit: **~75 Minuten** fuer ein 24-Minuten-Video mit sprechendem Avatar. Fertig zum Hochladen.
## Hardware
### ki-tower — Hauptmaschine (Muldenstein, geplant)
| Eigenschaft | Wert |
|---|---|
| **CPU** | AMD Ryzen 7 7700 (8C/16T) |
| **RAM** | 64 GB DDR5 |
| **GPU** | NVIDIA RTX 3090 (24 GB VRAM) |
| **Storage** | 1 TB NVMe |
| **OS** | Debian 12 + Docker + CUDA |
| **Logischer Name** | ki-tower |
| **Rolle** | Chef. Alle schweren Aufgaben, Orchestrierung, Hauptpfad. |
### gpu-worker — NVIDIA-Rig (Muldenstein, geplant) — PRIMAERER WORKER
| Eigenschaft | Wert |
|---|---|
| **GPUs** | 4x NVIDIA RTX 3080 (je 10 GB GDDR6X, PCIe 4.0 x16) |
| **CUDA** | Voll unterstuetzt, identischer Stack wie ki-tower |
| **OS** | Debian 12 + Docker + CUDA |
| **Logischer Name** | gpu-worker |
| **Rolle** | Produktiver Worker-Pool. CUDA-nativ, kein Workaround noetig. |
| **Vorteil** | Selber Code wie auf der 3090 — kein Portierungsaufwand. |
### gpu-reserve — AMD-Rig (Muldenstein, Reserve)
| Eigenschaft | Wert |
|---|---|
| **GPUs** | 8x AMD RX 6600 XT Dual (je 8 GB GDDR6, PCIe 4.0 x8) |
| **ROCm** | Inoffiziell (gfx1032, Workaround noetig) |
| **Logischer Name** | gpu-reserve |
| **Rolle** | Reserve/Nebenrolle. Nur Whisper + CPU-Batch wenn 3080-Rig ausgelastet. |
| **Status** | Zurueckgestellt. Entscheidung nach 3080-Rig-Aufbau. Alternative: verkaufen. |
## Rollenverteilung — Was laeuft wo
### Cloud — Skript-Generierung
| Aufgabe | Modell | Kosten | Anmerkung |
|---|---|---|---|
| **Skripte** | GPT-5.4 (OpenAI API) | ~0.10-0.50 EUR/Skript | Persoenlichkeit, Storytelling, Meinung |
Skriptqualitaet ist der Flaschenhals. Kein lokales Modell kommt an GPT-5.4 ran fuer
kreatives, meinungsstarkes, deutsches Storytelling. Cloud-Kosten sind vernachlaessigbar.
### ki-tower (RTX 3090) — Hauptpfad
| Aufgabe | Modell | VRAM | Anmerkung |
|---|---|---|---|
| **Szenenplan** | Qwen 2.5 14B (Q5) | ~12 GB | Strukturiertes JSON aus fertigem Skript. Braucht keine Kreativitaet. |
| **Hero-Bilder** | FLUX.1-dev | ~12 GB | Hochwertige Key-Visuals (Kapitelwechsel, Titel, Outro) |
| **Compositing** | FFmpeg | CPU | Ken-Burns + Avatar-PiP + Overlays + Audio-Mix |
| **Encoding** | FFmpeg + NVENC | ~1 GB | Hardware-beschleunigt |
| **Orchestrator** | Python | CPU | Steuert alle Schritte, verteilt Jobs an Worker |
3090 macht NUR: Szenenplan (Qwen) + Hero-Bilder (FLUX) + Assembly.
Skripte kommen fertig aus der Cloud. TTS + Avatar machen die 3080er.
### gpu-worker (4x RTX 3080) — Produktive Worker-Jobs
| 3080 | Primaeraufgabe | VRAM | Sekundaeraufgabe | Anmerkung |
|---|---|---|---|---|
| **#0** | **XTTS v2** (Voiceover) | ~4 GB | → SDXL Restbilder (~7 GB) | TTS zuerst, dann Bilder |
| **#1** | **SDXL** (Standard-Szenen) | ~7 GB | — | Bildgenerierung durchgehend |
| **#2** | **SadTalker** (Avatar) | ~6 GB | — | Lip-Sync, laengster Job, wartet auf Audio |
| **#3** | **Real-ESRGAN** + **Whisper** | ~3 GB | Thumbnail-Varianten | Upscaling + Untertitel |
Feste Zuordnung pro Video-Produktion. Kein dynamisches Scheduling.
Kernvorteil: Identischer CUDA-Stack wie ki-tower.
### gpu-reserve (8x RX 6600 XT) — Reserve/Nebenrolle
| Aufgabe | VRAM | Karten | Anmerkung |
|---|---|---|---|
| **Whisper** (whisper.cpp) | ~1.5 GB | 1-2 | Einziger gut getesteter AMD-Usecase |
| **CPU-Batch-Jobs** | — | — | Piper TTS, FFmpeg, Text-Vorverarbeitung |
Realistisch nutzbar: 1-2 Karten fuer Whisper, Rest bringt kaum Mehrwert.
Empfehlung: Erst aufbauen wenn 3080-Rig voll ausgelastet. Alternative: verkaufen.
### NICHT auf das AMD-Rig
| Aufgabe | Warum nicht |
|---|---|
| SDXL / Bildgenerierung | ROCm inoffiziell, CUDA-Version laeuft auf 3080 besser |
| XTTS v2 | PyTorch + ROCm ungetestet, auf 3080 CUDA-nativ |
| SadTalker | CUDA-only |
| Qwen / LLMs | PyTorch + ROCm + Textgen = Frust auf inoffizieller HW |
| Irgendwas Produktionskritisches | Workaround-basierte HW darf Produktion nicht blockieren |
## Hardware-Priorisierung: 3080 vs. 6600 XT
**Klare Rangfolge:**
| Rang | Hardware | Rolle | Begruendung |
|---|---|---|---|
| 1 | **RTX 3090** (ki-tower) | Chef | 24 GB VRAM, schwere Modelle, Orchestrierung |
| 2 | **4x RTX 3080** (gpu-worker) | Produktiver Worker | CUDA-nativ = selber Code wie ki-tower. 10 GB VRAM pro Karte reicht fuer SDXL, XTTS, SadTalker, Whisper. Kein Portierungsaufwand. |
| 3 | **8x RX 6600 XT** (gpu-reserve) | Reserve / ggf. verkaufen | ROCm inoffiziell. Jeder Usecase, den die 6600 XT kann, kann die 3080 besser + einfacher. Einziger Vorteil: Kartenanzahl fuer massiv-paralleles Whisper. Realistisch nicht gebraucht. |
**Warum 4x 3080 > 8x 6600 XT:**
- Gleicher Software-Stack wie ki-tower (CUDA). Code einmal schreiben, ueberall deployen.
- 10 GB VRAM vs. 8 GB VRAM. Klingt wenig, macht bei SDXL/SadTalker den Unterschied.
- PyTorch + CUDA ist getestet, stabil, dokumentiert. ROCm auf Navi 23 ist Kampf.
- Weniger Karten = weniger Strom, weniger Kuehlung, weniger moegliche Fehlerquellen.
- 4 parallele CUDA-Worker decken den gesamten Bedarf ab.
**Empfehlung AMD-Rig:**
Nicht aktiv aufbauen. Falls 3080-Rig irgendwann an Kapazitaetsgrenzen stoesst: 1-Karten-Test mit Whisper.
Wenn selbst das nicht lohnt: verkaufen und in NVMe-Storage oder RAM investieren.
## Produktions-Datenbank + Orchestrierung
Zentrale Steuerung: **eine SQLite-Datei** (`production.db`) auf ki-tower.
Alles passiert hier: Kanaele, Videos, Szenen, Jobs, Assets, Status.
### Datenbank-Schema
```sql
-- Kanaele (je einer pro YouTube-Kanal)
CREATE TABLE channels (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL, -- "Geld & Imperien Stil"
slug TEXT UNIQUE NOT NULL, -- "kanal-a"
avatar_path TEXT NOT NULL, -- "/data/channels/kanal-a/avatar.png"
voice_path TEXT NOT NULL, -- "/data/channels/kanal-a/voice-sample.wav"
style TEXT NOT NULL, -- "pip_20" oder "fullscreen"
prompt_template TEXT, -- System-Prompt fuer GPT-5.4 Skripte (Ton, Stil, Persoenlichkeit)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Videos (ein Eintrag pro Video)
CREATE TABLE videos (
id INTEGER PRIMARY KEY,
channel_id INTEGER REFERENCES channels(id),
title TEXT NOT NULL, -- "Irans Hyperschall-Schlag"
topic TEXT, -- Thema + Recherche-Notizen
status TEXT DEFAULT 'draft', -- draft → script → scenes → producing → assembly → review → published
script TEXT, -- Fertiges Skript (aus GPT-5.4 + Review)
scene_plan TEXT, -- JSON: Szenenplan (aus Qwen 14B)
voiceover_path TEXT, -- Pfad zur fertigen WAV
avatar_path TEXT, -- Pfad zum fertigen Avatar-Video
subtitle_path TEXT, -- Pfad zur SRT-Datei
final_path TEXT, -- Pfad zum fertigen MP4
thumbnail_path TEXT, -- Pfad zum Thumbnail
yt_title TEXT, -- YouTube-Titel
yt_description TEXT, -- YouTube-Description
yt_tags TEXT, -- YouTube-Tags (JSON array)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
published_at DATETIME
);
-- Szenen (aus dem Szenenplan, je eine Zeile pro Szene)
CREATE TABLE scenes (
id INTEGER PRIMARY KEY,
video_id INTEGER REFERENCES videos(id),
scene_nr INTEGER NOT NULL,
scene_type TEXT NOT NULL, -- "hero", "standard", "karte", "infografik"
prompt TEXT NOT NULL, -- Bildprompt (EN)
overlay TEXT, -- Text-Overlay (oder NULL)
duration_s REAL NOT NULL, -- Geschaetzte Dauer in Sekunden
image_path TEXT, -- Pfad zum generierten Bild (nach Produktion)
upscaled BOOLEAN DEFAULT 0,
status TEXT DEFAULT 'pending' -- pending → generating → done → failed
);
-- GPU-Jobs (jede Aufgabe die ein Worker erledigt)
CREATE TABLE jobs (
id INTEGER PRIMARY KEY,
video_id INTEGER REFERENCES videos(id),
job_type TEXT NOT NULL, -- "tts", "sdxl", "flux", "sadtalker", "whisper", "esrgan", "assembly"
gpu TEXT, -- "3090", "3080_0", "3080_1", "3080_2", "3080_3"
status TEXT DEFAULT 'queued', -- queued → running → done → failed → retry
input_data TEXT, -- JSON: was der Worker braucht
output_path TEXT, -- Pfad zum Ergebnis
error TEXT, -- Fehlermeldung falls failed
queued_at DATETIME DEFAULT CURRENT_TIMESTAMP,
started_at DATETIME,
finished_at DATETIME
);
```
### Verzeichnisstruktur
```
/data/ki-video/
├── production.db # SQLite — zentrale Steuerung
├── channels/ # Pro Kanal
│ ├── kanal-a/
│ │ ├── avatar.png # Referenz-Portraet (FLUX-generiert)
│ │ ├── voice-sample.wav # XTTS Voice-Cloning Referenz (~30s)
│ │ ├── style.json # { "avatar": "pip_20", "position": "bottom_right" }
│ │ └── prompt.md # GPT-5.4 System-Prompt (Persoenlichkeit, Ton, Stil)
│ └── kanal-b/
│ ├── avatar.png # Anderes Gesicht
│ ├── voice-sample.wav # Andere Stimme
│ ├── style.json # { "avatar": "fullscreen" }
│ └── prompt.md # Anderer Stil/Persoenlichkeit
├── videos/ # Pro Video ein Ordner
│ ├── 2026-03-16-iran-hyperschall/
│ │ ├── script.md # Fertiges Skript
│ │ ├── scenes.json # Szenenplan
│ │ ├── images/
│ │ │ ├── hero-001.png
│ │ │ ├── scene-002.png
│ │ │ ├── scene-003.png
│ │ │ └── ... # 80-120 Bilder
│ │ ├── audio/
│ │ │ ├── voiceover.wav # XTTS v2 Output
│ │ │ └── music.mp3 # Hintergrundmusik
│ │ ├── avatar/
│ │ │ ├── clip-001.mp4 # SadTalker 30s-Clips
│ │ │ ├── clip-002.mp4
│ │ │ └── full.mp4 # Zusammengefuegt
│ │ ├── subtitles.srt # Whisper → SRT
│ │ ├── thumbnail.png # FLUX hero + Text
│ │ └── final.mp4 # FERTIGES VIDEO
│ └── 2026-03-18-oelpreis-analyse/
│ └── ...
└── templates/
├── ffmpeg-pip20.sh # FFmpeg-Preset: 20% Avatar unten rechts
├── ffmpeg-fullscreen.sh # FFmpeg-Preset: 100% Avatar
├── ffmpeg-kenburns.sh # Ken-Burns-Effekt Presets
└── music/ # Lizenzfreie Hintergrundmusik
├── ambient-01.mp3
└── ambient-02.mp3
```
### Produktions-Ablauf (Statusmaschine)
```
┌──────────────────────────────────────────────────┐
│ │
┌─────────┐ │ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ draft │──────┼─►│ script │───►│ scenes │───►│ producing │ │
│ │ │ │ │ │ │ │ │ │
│ Thema │ │ │ GPT-5.4 │ │ Qwen 14B │ │ 5 GPUs │ │
│ anlegen │ │ │ + Review │ │ Szenen- │ │ parallel │ │
└─────────┘ │ └──────────┘ │ plan │ └─────┬─────┘ │
│ └──────────┘ │ │
│ ▼ │
│ ┌───────────┐ ┌──────────┐ ┌──────────┐ │
│ │ published │◄───│ review │◄──│ assembly │ │
│ │ │ │ │ │ │ │
│ │ YouTube │ │ Mensch │ │ FFmpeg │ │
│ │ Upload │ │ schaut │ │ PiP/Full │ │
│ └───────────┘ └──────────┘ └──────────┘ │
│ │
└──────────────────────────────────────────────────┘
Status-Uebergaenge:
draft → script : Mensch gibt Thema ein, startet GPT-5.4 Skript
script → scenes : Mensch reviewt Skript, bestaetigt, Qwen generiert Szenenplan
scenes → producing : Orchestrator erstellt Jobs fuer alle 5 GPUs
producing → assembly : Alle GPU-Jobs fertig (TTS + Avatar + Bilder + Untertitel)
assembly → review : FFmpeg Assembly fertig, Video liegt als MP4 vor
review → published : Mensch schaut Video, gibt frei, Upload
```
### Orchestrator-Logik (Python, laeuft auf ki-tower)
```
Alle 10 Sekunden:
1. Checke videos WHERE status = 'scenes'
→ Erstelle GPU-Jobs:
- 1x TTS-Job (3080 #0)
- N x SDXL-Jobs (3080 #0 nach TTS, #1)
- M x FLUX-Jobs (3090, nur hero-Szenen)
- 1x Whisper-Job (3080 #3, nach TTS)
- 1x ESRGAN-Job (3080 #3, nach Bilder)
- 1x SadTalker-Job (3080 #2, nach TTS)
2. Checke jobs WHERE status = 'queued'
→ Pruefe ob Abhaengigkeiten erfuellt:
- SadTalker wartet auf TTS (voiceover.wav muss existieren)
- Whisper wartet auf TTS
- ESRGAN wartet auf Bilder
→ Sende an Worker via HTTP REST
3. Checke jobs WHERE status = 'running'
→ Polle Worker-Status
→ Bei done: speichere output_path, update status
→ Bei failed: retry (max 3x), dann menschliche Aufmerksamkeit
4. Checke videos WHERE status = 'producing'
AND alle zugehoerigen jobs.status = 'done'
→ Starte Assembly-Job (FFmpeg)
→ Status → 'assembly'
5. Checke videos WHERE status = 'assembly'
AND assembly-job.status = 'done'
→ Status → 'review'
→ Benachrichtigung an Telegram (Hausmeister-Bot!)
```
### CLI fuer den Alltag
```bash
# Neues Video anlegen
./produce.py new --channel kanal-a --topic "Irans Hyperschall-Schlag"
# Status aller Videos
./produce.py status
# ID | Kanal | Thema | Status | Fortschritt
# 42 | kanal-a | Irans Hyperschall-Schlag | producing | 3/5 Jobs done
# 43 | kanal-b | Oelpreis-Analyse 2026 | script | Review pending
# Skript bestaetigen und Produktion starten
./produce.py approve-script 42
# Fertiges Video reviewen und freigeben
./produce.py publish 42 --yt-upload
# GPU-Auslastung
./produce.py gpus
# GPU | Status | Job | Video | Progress
# 3090 | busy | flux-hero | #42 | 8/15 images
# 3080 #0 | busy | sdxl-batch | #42 | 23/50 images
# 3080 #1 | busy | sdxl-batch | #42 | 31/50 images
# 3080 #2 | busy | sadtalker | #42 | 12:30/24:00
# 3080 #3 | idle | — | — | waiting for images
```
## Worker-Architektur
```
ki-tower (3090, Chef) gpu-worker (4x 3080, Worker) gpu-reserve (RX 6600 XT)
┌─────────────────────────┐ ┌──────────────────────────────┐ ┌──────────────────┐
│ Orchestrator (Python) │ │ Debian 12 + Docker + CUDA │ │ Reserve/Whisper │
│ ├── production.db │ Tailscale │ │
│ ├── /api/submit-job │◄────────────►│ GPU #0: xtts+sdxl :8501 │ │ Whisper :8601 │
│ ├── /api/job-status │ │ GPU #1: sdxl-worker :8502 │ │ CPU-Batch :8602 │
│ └── /api/get-result │ Tailscale │ GPU #2: sadtalker :8503 │ │ (nur bei Bedarf)│
│ │ │ GPU #3: esrgan+whisper :8504 │ └──────────────────┘
│ Qwen 14B (vLLM) :8401 │ │ │
│ FLUX.1 (ComfyUI):8402 │ │ 10 GB VRAM pro Karte │
│ FFmpeg (lokal) │ │ CUDA-nativ, kein Workaround │
└─────────────────────────┘ └──────────────────────────────┘
```
## VRAM-Budget (ki-tower, sequentiell)
```
Schritt 1: Skript → Qwen 14B → ~12 GB VRAM
Schritt 2: Bilder → FLUX.1-dev → ~12 GB VRAM
Schritt 3: TTS → Piper (CPU) → 0 GB VRAM
Schritt 4: Compositing → FFmpeg (CPU) → 0 GB VRAM
Schritt 5: Encoding → NVENC → ~1 GB VRAM
```
Mit Qwen 14B statt 32B: kein VRAM-Flush zwischen Schritt 1 und 2 noetig.
Geschaetzte Produktionszeit:
- v1 (nur ki-tower, seriell, ohne Avatar): ~2-3 Stunden pro 10-Min-Video
- v1.5 (5 GPUs parallel, mit Avatar): ~75 Min pro 20-Min-Video
- Langfristig mit Optimierung: ~60 Min pro 20-Min-Video
## Nicht-Ziele
- Kein Forschungsprojekt
- Keine Bastelwiese ohne Ergebnis
- Keine Dauerabhaengigkeit von Cloud-Abos
- Keine Architektur die nur auf dem Papier funktioniert
- Keine ueberkomplizierte Proxmox-/VM-Orgie auf dem Rig
- Kein Schoenreden von AMD-ROCm-Limitierungen
## v1 — Minimal Viable Pipeline (nur ki-tower)
v1 beweist: die Pipeline funktioniert auf einer Maschine. Schritte manuell anstossen.
```
v1 Pipeline (alles auf ki-tower, seriell):
Thema (manuell)
Qwen 14B → Skript + Szenenplan (vLLM, :8401)
FLUX.1-dev → 30-50 Bilder (ComfyUI, :8402) ← seriell, ~30-45 Min
Piper TTS → Voiceover (CPU, :8504) ← parallel moeglich
FFmpeg → Ken-Burns + Audio + Overlays → fertiges MP4
```
Was v1 NICHT hat:
- Kein 3080 Worker-Rig (alles seriell auf 3090)
- Keinen Avatar
- Keine XTTS v2 (Piper reicht fuer v1)
- Keine automatische Orchestrierung
- Geschaetzte Produktionszeit: ~2-3 Stunden pro 10-Min-Video
Erfolgskriterium v1: Ein 10-Minuten-Video komplett lokal produziert.
## v1.5 — 5-GPU-Parallelisierung + Avatar (ki-tower + 3080-Rig)
v1.5 ist der grosse Sprung: **5 GPUs parallel + sprechender Avatar.**
```
v1.5 Pipeline (5 GPUs parallel, mit Avatar):
Thema (manuell)
Qwen 14B → Skript + Szenenplan JSON (ki-tower)
Orchestrator Phase 2a (TTS zuerst):
└── 3080 #0: XTTS v2 → 20 Min deutsches Voiceover (WAV)
Orchestrator Phase 2b (alle 5 GPUs parallel):
├── 3090: FLUX.1-dev → Hero-Bilder
├── 3080 #0: (TTS fertig) → SDXL Restbilder
├── 3080 #1: SDXL → Standard-Szenen
├── 3080 #2: SadTalker → 20 Min Avatar-Video (lip-sync, 384x384)
└── 3080 #3: Real-ESRGAN + Whisper → Upscaling + Untertitel
FFmpeg → Assembly:
├── Hintergrund: Bilder + Ken-Burns + Zoom
├── Avatar-PiP: unten rechts, ~20% Bildschirm, halbtransparenter Rahmen
├── Audio-Mix: Voiceover + Hintergrundmusik
├── Text-Overlays + Untertitel
└── NVENC Export → MP4 + Thumbnail + YouTube-Metadaten
```
Was v1.5 bringt:
- **Sprechender Avatar** als PiP durchgehend im Video (~20% Bildschirm)
- XTTS v2 statt Piper (natuerlichere Stimme, Voice-Cloning)
- Produktionszeit: **~75 Min** statt ~5-6 Stunden fuer 20-Min-Video
- Automatische Untertitel
- Orchestrator verteilt und sammelt automatisch
Erfolgskriterium v1.5: 20-Min-Video mit Avatar in unter 90 Minuten produziert.
### Avatar-Referenzbild (einmalig)
Das Portraet fuer SadTalker wird EINMAL generiert und dann fuer alle Videos wiederverwendet.
So entsteht ein konsistenter "Sprecher" / "Moderator" fuer den Kanal.
```
Generierung (einmalig, auf 3090 mit FLUX.1-dev):
Prompt: "professional male news anchor, german, mid-30s, neutral expression,
chest up portrait, clean studio background, photorealistic, 8k"
Output: referenz-avatar.png (512x512)
Nachbearbeitung: ggf. manuelles Feintuning in GIMP/Photoshop
SadTalker nutzt dann:
- referenz-avatar.png (festes Bild)
- voiceover.wav (pro Video neu)
→ Output: avatar-video.mp4 (384x384, 25fps, lip-sync)
```
## v2 — Erweiterungen (nach funktionierender v1.5)
| Feature | Abhaengigkeit |
|---|---|
| **Avatar-Varianten** | Verschiedene Gesichtsausdruecke/Posen je Szene |
| **Mehrere Sprecher** | Zweiter Avatar fuer Interview-/Dialog-Format |
| **Qwen 32B** statt 14B | Nur wenn 14B-Skripte nachweislich zu schwach |
| **Batch-Produktion** | Mehrere Videos in Queue, automatisch nacheinander |
| **YouTube-Upload-API** | Automatischer Upload mit Metadaten |
## v3+ — Spaeter
| Feature | Anmerkung |
|---|---|
| YouTube-Upload-Automation | Manueller Upload = 2 Klicks. Lohnt erst bei >3 Videos/Woche |
| Multi-User / geklonte Instanzen | Erst ein funktionierendes Produkt haben |
| Prompt-Templates Bibliothek | Waechst organisch mit der Produktion |
| Research-Hub-Integration | Themenvorschlaege automatisch aus RSS/News |
## Umsetzungsreihenfolge
```
PHASE 1 — ki-tower Grundinstallation (Woche 1-2)
├── Debian 12 + NVIDIA-Treiber + CUDA 12 + Docker
├── vLLM + Qwen 2.5 14B → erster Skript-Test
└── Ergebnis: "Ich kann lokal ein Skript generieren"
PHASE 2 — Bildgenerierung (Woche 3-4)
├── ComfyUI + FLUX.1-dev in Docker
├── Workflow: Skript-Szene → Bildprompt → Bild
└── Ergebnis: "Ich kann passende Bilder zu einem Skript erzeugen"
PHASE 3 — TTS + Assembly (Woche 5)
├── Piper TTS in Docker (CPU)
├── FFmpeg-Pipeline: Bilder + Audio → Video mit Ken-Burns
└── Ergebnis: "Erstes komplettes Video, lokal produziert"
PHASE 4 — Polieren + erstes echtes Video (Woche 6)
├── Prompt-Templates fuer Skripte verfeinern
├── FFmpeg-Presets fuer verschiedene Szenentypen
├── Erstes Video auf YouTube hochladen
└── Ergebnis: "v1 steht und produziert"
PHASE 5 — 3080-Rig Aufbau + v1.5 mit Avatar (Woche 7-10)
├── Debian 12 + NVIDIA-Treiber + CUDA + Docker (selber Stack wie ki-tower)
├── 4 Worker: XTTS+SDXL, SDXL, SadTalker, ESRGAN+Whisper
├── Tailscale + Job-API anbinden
├── SadTalker Avatar einrichten:
│ ├── Referenz-Portraet generieren (FLUX auf 3090)
│ ├── SadTalker Docker-Container auf 3080 #2
│ ├── Lip-Sync Pipeline: Audio → 30s-Clips → zusammenfuegen
│ └── Test: 5-Min-Testvideo mit Avatar-PiP
├── XTTS v2 statt Piper (bessere Stimme, Voice-Cloning)
├── FFmpeg PiP-Compositing: Avatar unten rechts, ~20% Bildschirm
├── Python-Orchestrator: TTS → SadTalker → Bilder → Assembly
└── Ergebnis: "20-Min-Video mit Avatar in unter 90 Min, 5 GPUs parallel"
PHASE 6 — v2 Features (nach stabiler v1.5-Produktion)
├── Avatar-Varianten: verschiedene Ausdruecke/Posen je Kapitel
├── Automatische Thumbnail-Generierung (FLUX hero + Text-Overlay)
├── YouTube-Metadaten-Generator (Titel, Description, Tags aus Skript)
├── Batch-Produktion: mehrere Videos in Queue
└── Ergebnis: "Semi-automatische Videoproduktion mit Worker-Pool"
PHASE 7 — AMD-Rig Entscheidung (optional, spaeter)
├── Bewertung ob 3080-Rig Kapazitaet reicht
├── Falls nicht: 1-Karten-Test mit RX 6600 XT + Whisper
├── Falls ja: AMD-Rig verkaufen, Erloese in Storage investieren
└── Ergebnis: "Klare Entscheidung ueber AMD-Hardware"
```
## Entscheidungen (getroffen)
| Frage | Entscheidung | Begruendung |
|---|---|---|
| OS ki-tower | **Debian 12** | Einfacher fuer GPU, Docker, kein Hypervisor-Overhead |
| OS gpu-worker | **Debian 12** | Identisch mit ki-tower, CUDA-nativ, kein Sonderweg |
| Worker-Rig | **4x RTX 3080** | CUDA-nativ > 8x RX 6600 XT mit ROCm-Workarounds |
| Skript-LLM | **GPT-5.4** (Cloud) | Beste Qualitaet fuer Kreativarbeit. ~0.10-0.50 EUR/Skript. |
| Szenenplan-LLM | **Qwen 14B** (lokal) | Strukturiertes JSON aus Skript, braucht keine Kreativitaet. |
| LLM-Server (lokal) | **vLLM** | Schneller als llama.cpp bei Batch, Model-Unloading |
| Bildgenerierung | **ComfyUI + FLUX.1-dev** | Flexibel, Workflow-basiert, gute Qualitaet |
| TTS v1 | **Piper TTS** (CPU) | Kein GPU-Verbrauch, sofort einsatzbereit |
| TTS v2 | **XTTS v2** (3090 oder 3080) | Voice-Cloning, natuerlichere Stimme. 4 GB VRAM, passt auf 3080. |
| Avatar | **SadTalker, ab v1.5** | PiP ~20% unten rechts, durchgehend im Video. Kernbestandteil. |
| Job-Queue | **SQLite** | Ein User, kein Redis/RabbitMQ noetig |
| Netzwerk | **Tailscale** | Verbindet ki-tower + gpu-worker, fertig |
## Risiken
| # | Risiko | Wahrscheinlichkeit | Impact | Mitigation |
|---|---|---|---|---|
| 1 | **ROCm auf RX 6600 XT instabil** | Hoch | **Niedrig** | Betrifft nur Reserve-Rig. 3080-Worker ist CUDA-nativ. |
| 2 | **Piper TTS deutsch zu robotisch** | Mittel | Mittel | v1-only-Problem. XTTS v2 ab v1.5 loest das. OpenAI TTS als Bruecke (~0.50€/Video). |
| 3 | **VRAM-Tetris auf 3090** | Mittel | Mittel | 14B statt 32B. Sequentiell. vLLM Model-Unloading. |
| 4 | **Pipeline wird zu komplex vor v1** | Hoch | Hoch | v1 brutal einfach. Bash-Scripts, keine Frameworks. |
| 5 | **SadTalker Qualitaet/Artefakte** | Mittel | **Hoch** | Avatar ist Kernbestandteil. Wenn Lip-Sync schlecht: LivePortrait oder Wav2Lip als Alternative testen. Fallback: Avatar nur bei Kapitelwechseln (5-10% Screentime statt durchgehend). |
| 6 | **SadTalker Renderzeit 20+ Min** | Mittel | Mittel | 30s-Clips parallel auf 2 GPUs verteilen wenn noetig. Oder Resolution reduzieren (256x256). |
| 7 | **Stromkosten Rig vs. Nutzen** | Mittel | Niedrig | 3080-Rig nur bei Batch-Jobs einschalten. AMD-Rig im Zweifel verkaufen. |
## Kosten-Schaetzung
| Posten | Einmalig | Monatlich |
|---|---|---|
| ki-tower Hardware | vorhanden | — |
| gpu-worker Hardware | vorhanden | — |
| Strom ki-tower (24/7) | — | ~30-40 EUR |
| Strom gpu-worker (bei Bedarf) | — | ~10-30 EUR (nicht 24/7) |
| **GPT-5.4 API (Skripte)** | — | **~3-15 EUR** (6-24 Skripte/Monat) |
| Cloud-APIs (Fallback TTS) | — | ~5-10 EUR |
| **Gesamt** | 0 EUR | ~50-95 EUR |
Zum Vergleich: Vollstaendig cloud-basierte Videoproduktion (Runway, ElevenLabs, GPT-4) = 100-300 EUR/Monat.
Die GPT-5.4-Kosten fuer Skripte sind der beste ROI im ganzen Projekt: ~0.50 EUR fuer
ein Skript, das ein lokales 14B-Modell qualitativ nie erreichen wuerde.