29 KiB
KI-Video — Lokale Produktionspipeline
Stand: 16.03.2026
Ziel
Lokale, produktiv nutzbare Pipeline fuer YouTube-Videos im Commentary-/Erklaerstil. Thema rein → fertiges Video raus. Kein Forschungsprojekt, kein Proof-of-Concept.
Videoformat
Referenz-Stil: "Geld & Imperien" / "Money & People" (YouTube)
- https://youtu.be/4XfhrrbklbM (24 Min, Geld & Imperien)
- https://youtu.be/MIkAOwJYaP0 (19 Min, Money & People)
| Eigenschaft | v1 |
|---|---|
| Typ | Commentary, Erklaervideo, Analyse |
| Laenge | 10-30 Minuten |
| Visuell | Mixed Media: KI-Bilder + Stock-Fotos + echte Karten + Daten-Charts + Text-Overlays + Ken-Burns |
| Stimme | XTTS v2, natuerliche deutsche Maennerstimme, Voice-Cloning |
| Untertitel | Automatisch (faster-whisper → SRT) |
| Avatar | Nein. Erst ab v1.5 als optionaler PiP-Test. |
| Kein | Face-Cam, Realfilm, Vollbild-Avatar, Piper TTS |
Das fertige Video besteht aus: Mixed Media (KI-Bilder + Stock-Fotos + Karten + Charts) mit Ken-Burns-Effekten + Voiceover + Hintergrundmusik + Text-Overlays + eingebrannte Untertitel. Entscheidend: KI-Bilder nur dort wo sie stark sind (Symbolik, Stimmung, Thumbnails). Reale Fotos, Karten und Diagramme dort wo Fakten gezeigt werden.
Anatomie eines 20-Min-Videos
| Element | Menge | Quelle |
|---|---|---|
| Skript | ~3500-5000 Woerter | GPT-5.4 (Cloud) + menschliches Review |
| Szenenplan | ~100 Szenen (JSON) | Qwen 14B (lokal) |
| Hero-Bilder | 10-15 Stueck | FLUX.1-dev (3090), fuer Thumbnails + Kapitelwechsel |
| Konzept-Bilder | 30-40 Stueck | SDXL (3080), symbolisch/abstrakt wo KI stark ist |
| Stock-Fotos | 20-30 Stueck | Pexels/Pixabay API (CPU), reale Orte/Personen/Ereignisse |
| Karten | 5-10 Stueck | MapLibre/OSM (CPU), echte Geografie statt KI-Karten |
| Daten-Charts | 5-10 Stueck | matplotlib (CPU), Oelpreis/BIP/Inflation aus echten Daten |
| Voiceover | 20 Min WAV | XTTS v2 (3080) |
| Untertitel | SRT-Datei | faster-whisper (3080) |
| Hintergrundmusik | 1-2 Tracks | Lizenzfrei, manuell gewaehlt |
| Text-Overlays | 20-40 Stueck | FFmpeg (aus Szenenplan) |
Bildmix-Logik: Der Szenenplan bestimmt pro Szene den Typ. Nicht alles KI-generiert. KI fuer Stimmung/Symbolik, Stock fuer Realitaet, Karten fuer Geografie, Charts fuer Daten.
v1 — Produktions-Pipeline
Prinzip
GPT-5.4 (Cloud) → Qwen 14B (lokal) → 5 GPUs parallel → FFmpeg → MP4
Skript Szenenplan Bilder + Voice Assembly
Kein Avatar. Kein dynamisches Scheduling. Kein Service-Mesh. 5 GPUs feste Zuordnung + CPU-Module (Stock/Chart/Map), SQLite als Zustand, Python als Orchestrator.
Pipeline-Schritte
PHASE 1 — SKRIPT + SZENENPLAN (~30 Min, Cloud + lokal + Mensch)
═══════════════════════════════════════════════════════════════
Thema + Recherche-Notizen (manuell)
│
▼
GPT-5.4 (OpenAI API) → Skript (~4000 Woerter)
│ Kosten: ~0.10-0.50 EUR
▼
Mensch reviewt, korrigiert, gibt frei (~20 Min)
│
▼
Qwen 14B (vLLM, :8401) → Szenenplan (JSON):
100 Szenen mit je:
- Szenentyp: hero | concept | stock | map | chart | person
- Bildprompt (EN, fuer hero/concept) ODER Suchbegriff (fuer stock/person)
ODER Geodaten (fuer map) ODER Datenquelle+Range (fuer chart)
- Text-Overlay (oder null)
- Dauer in Sekunden
│
▼
Orchestrator uebernimmt
PHASE 2 — PARALLEL-PRODUKTION (GPUs + CPU, ~15-20 Min)
══════════════════════════════════════════════════════
┌──────────────────────────────────────────────────────────┐
│ ORCHESTRATOR (ki-tower, Python) │
│ Verteilt Jobs, pollt Status, sammelt Ergebnisse │
└──────┬──────────┬──────────┬──────────┬──────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐┌──────────┐┌──────────┐┌──────────────────────┐
│ 3090 ││ 3080 #0 ││ 3080 #1 ││ 3080 #2 + #3 │
│ ki-tower ││ Worker ││ Worker ││ Worker │
│ ││ ││ ││ │
│ FLUX.1 ││ XTTS v2 ││ SDXL ││ SDXL │ Whisper │
│ Hero- ││ Voice ││ Konzept- ││ Konzept-│ + ESRGAN │
│ Bilder ││ → SDXL ││ Bilder ││ Bilder │ Untertit. │
│ 10-15 St ││ → Rest ││ ~20 Stk ││ ~20 Stk │ + Upscale │
│ ~10 Min ││ ~15 Min ││ ~10 Min ││ ~10 Min │ ~5 Min │
└──────────┘└──────────┘└──────────┘└──────────────────────┘
┌──────────────────────────────────────────────────────────┐
│ CPU-PARALLEL (ki-tower, laueft gleichzeitig mit GPUs) │
│ │
│ Stock-Fetcher → Pexels/Pixabay API → 20-30 Fotos ~30s │
│ Chart-Gen → matplotlib/plotly → 5-10 Charts ~10s │
│ Map-Renderer → MapLibre/OSM → 5-10 Karten ~30s │
│ Person-Fetcher → Wikimedia Commons → Portraits ~10s │
│ │
│ Gesamt CPU-Media: <60 Sekunden (parallel zu GPU-Jobs) │
└──────────────────────────────────────────────────────────┘
Alle GPUs + CPU starten SOFORT. Keine Abhaengigkeitskette.
3080 #0: XTTS v2 Voiceover (~15 Min), danach SDXL Restbilder.
3080 #3: Whisper (braucht Audio, wartet auf #0) + ESRGAN parallel.
CPU-Module brauchen <60 Sek und sind fertig bevor die erste GPU-Szene steht.
Engpass = XTTS v2 Voiceover (~15 Min). Bildgenerierung ist jetzt schneller
weil nur noch ~50 KI-Bilder statt ~100 (Rest = Stock/Karten/Charts).
PHASE 3 — ASSEMBLY (ki-tower, ~10-15 Min)
══════════════════════════════════════════
FFmpeg: Bilder + Ken-Burns + Zoom + Ueberblendungen → Videospur
FFmpeg: Audio-Mix (Voiceover + Hintergrundmusik)
FFmpeg: Text-Overlays einbrennen
FFmpeg: Untertitel (SRT) einbetten
NVENC: H.265 Encoding → fertiges MP4 (1080p)
Export: Thumbnail (FLUX hero-Bild) + Titel + Description + Tags
Zeitschaetzung: 20-Min-Video (ohne Avatar)
| Phase | Dauer | GPUs/CPU | Engpass |
|---|---|---|---|
| 1. Skript + Szenenplan | ~30 Min | 1 (3090) + Cloud | Mensch (Review) |
| 2. Parallel-Produktion | ~15 Min | 5 GPUs + CPU | XTTS v2 Voiceover |
| 3. Assembly | ~10 Min | 1 (3090 NVENC) | FFmpeg Compositing |
| Gesamt (Maschine) | ~25 Min | ||
| Gesamt (inkl. Mensch) | ~55 Min |
Mixed Media verschiebt den Engpass: Statt ~100 KI-Bilder auf GPU nur noch ~50. CPU-Module (Stock/Karten/Charts) liefern den Rest in <60 Sekunden. Neuer Engpass = XTTS v2 (~15 Min fuer 20 Min Audio), nicht mehr Bildgenerierung.
GPU-Zuordnung v1
| GPU | Aufgabe | VRAM | Dauer | Output |
|---|---|---|---|---|
| 3090 | Qwen 14B (Szenenplan) → FLUX.1-dev (Hero-Bilder) | 12 GB | ~10 Min | 10-15 hochwertige Key-Visuals |
| 3080 #0 | XTTS v2 (Voiceover) → SDXL (Restbilder) | 4→7 GB | ~15 Min | 20 Min Audio + ~10 Bilder |
| 3080 #1 | SDXL (Konzept-Szenen) | 7 GB | ~10 Min | ~20 Bilder |
| 3080 #2 | SDXL (Konzept-Szenen) | 7 GB | ~10 Min | ~20 Bilder |
| 3080 #3 | faster-whisper (Untertitel) + Real-ESRGAN (Upscaling) | 3 GB | ~5 Min | SRT + upscaled Thumbnails |
| CPU | Stock-Fetcher + Chart-Gen + Map-Renderer + Person-Fetcher | 0 | <1 Min | 30-50 Medien-Dateien |
KI-Bilder: ~50 Stueck in ~10-15 Minuten (3x SDXL + 1x FLUX). CPU-Medien: ~50 Stueck in <60 Sekunden (Stock/Karten/Charts, parallel). 3080 #3 ist nach ~5 Min fertig und idle — kann bei Bedarf auch SDXL uebernehmen.
Hardware
ki-tower (RTX 3090, 24 GB)
| 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 |
| Rolle | Chef: Szenenplan (Qwen), Hero-Bilder (FLUX), Assembly (FFmpeg), Orchestrator |
gpu-worker (4x RTX 3080, je 10 GB)
| Eigenschaft | Wert |
|---|---|
| GPUs | 4x NVIDIA RTX 3080 (je 10 GB GDDR6X) |
| OS | Debian 12 + Docker + CUDA (identisch mit ki-tower) |
| Rolle | Worker: XTTS v2, SDXL-Batch, Whisper, ESRGAN |
| Vorteil | Selber CUDA-Stack — Code einmal schreiben, ueberall deployen |
gpu-reserve (8x RX 6600 XT) — NICHT in v1
Zurueckgestellt. Kein Aufbau, keine Planung, keine Ressourcen. Entscheidung nach 3 Monaten produktiver v1: behalten oder verkaufen.
Rollenverteilung
Cloud: GPT-5.4 → Skripte
Skriptqualitaet ist der Flaschenhals. Kein lokales Modell liefert Persoenlichkeit, Meinung und natuerliches deutsches Storytelling auf diesem Niveau. Kosten: ~0.10-0.50 EUR/Skript. Irrelevant vs. Stromkosten.
ki-tower (3090): Szenenplan + Hero-Bilder + Assembly
| Dienst | Tool | Port | VRAM |
|---|---|---|---|
| Szenenplan-LLM | Qwen 2.5 14B (vLLM) | :8401 | ~12 GB |
| Hero-Bilder | FLUX.1-dev (ComfyUI) | :8402 | ~12 GB |
| Assembly | FFmpeg + NVENC | — | ~1 GB |
| Orchestrator | Python | — | CPU |
Schritte laufen sequentiell auf der 3090. Erst Qwen (Szenenplan), dann FLUX (Bilder), dann FFmpeg (Assembly). Kein VRAM-Flush noetig (14B = 12 GB, FLUX = 12 GB).
gpu-worker (3080): Voice + Bilder + Untertitel
| GPU | Dienst | Tool | Port | VRAM |
|---|---|---|---|---|
| #0 | TTS → Bilder | XTTS v2 → SDXL | :8501 | 4 → 7 GB |
| #1 | Bilder | SDXL | :8502 | 7 GB |
| #2 | Bilder | SDXL | :8503 | 7 GB |
| #3 | Untertitel + Upscaling | faster-whisper + Real-ESRGAN | :8504 | 3 GB |
1 Container pro GPU. HTTP-API pro Worker. Orchestrator auf ki-tower pollt Status. Tailscale verbindet ki-tower und gpu-worker.
Produktions-Datenbank
Zentrale Steuerung: production.db (SQLite) auf ki-tower.
Schema
CREATE TABLE channels (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
voice_path TEXT NOT NULL, -- XTTS Voice-Cloning Referenz
prompt_template TEXT, -- GPT-5.4 System-Prompt (Persoenlichkeit)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE videos (
id INTEGER PRIMARY KEY,
channel_id INTEGER REFERENCES channels(id),
title TEXT NOT NULL,
topic TEXT,
status TEXT DEFAULT 'draft', -- draft→script→scenes→producing→assembly→review→published
script TEXT,
scene_plan TEXT, -- JSON
voiceover_path TEXT,
subtitle_path TEXT,
final_path TEXT,
thumbnail_path TEXT,
yt_title TEXT,
yt_description TEXT,
yt_tags TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
published_at DATETIME
);
CREATE TABLE scenes (
id INTEGER PRIMARY KEY,
video_id INTEGER REFERENCES videos(id),
scene_nr INTEGER NOT NULL,
scene_type TEXT NOT NULL, -- hero | concept | stock | map | chart | person
prompt TEXT, -- Bildprompt (hero/concept) oder null
query TEXT, -- Suchbegriff (stock/person) oder null
data_source TEXT, -- Datenquelle (chart) oder Geodaten (map) oder null
overlay TEXT,
duration_s REAL NOT NULL,
image_path TEXT,
status TEXT DEFAULT 'pending' -- pending→generating→done→failed
);
CREATE TABLE jobs (
id INTEGER PRIMARY KEY,
video_id INTEGER REFERENCES videos(id),
job_type TEXT NOT NULL, -- tts | sdxl | flux | whisper | esrgan | assembly
-- | stock_fetch | chart_gen | map_render | person_fetch
gpu TEXT,
status TEXT DEFAULT 'queued', -- queued→running→done→failed
input_data TEXT,
output_path TEXT,
error TEXT,
queued_at DATETIME DEFAULT CURRENT_TIMESTAMP,
started_at DATETIME,
finished_at DATETIME
);
Verzeichnisstruktur
/data/ki-video/
├── production.db
├── channels/
│ └── kanal-a/
│ ├── voice-sample.wav # XTTS Referenz (~30s)
│ └── prompt.md # GPT-5.4 Persoenlichkeits-Prompt
├── videos/
│ └── 2026-03-16-iran-hyperschall/
│ ├── script.md
│ ├── scenes.json
│ ├── images/
│ │ ├── hero/ # FLUX Hero-Bilder (10-15)
│ │ ├── concept/ # SDXL Konzept-Bilder (30-40)
│ │ ├── stock/ # Pexels/Pixabay Fotos (20-30)
│ │ ├── map/ # MapLibre/OSM Karten (5-10)
│ │ ├── chart/ # matplotlib Charts (5-10)
│ │ └── person/ # Wikimedia Portraits
│ ├── audio/
│ │ ├── voiceover.wav
│ │ └── music.mp3
│ ├── subtitles.srt
│ ├── thumbnail.png
│ └── final.mp4
└── templates/
├── ffmpeg-kenburns.sh
└── music/
Statusmaschine
draft → script → scenes → producing → assembly → review → published
draft : Thema angelegt
script : GPT-5.4 Skript + menschliches Review
scenes : Qwen generiert Szenenplan
producing : 5 GPUs arbeiten parallel (Bilder + Voice + Untertitel)
assembly : FFmpeg baut Video zusammen
review : Mensch schaut fertiges Video
published : YouTube-Upload
Orchestrator (Python, ki-tower)
Alle 10 Sekunden:
1. videos WHERE status = 'scenes'
→ Jobs erstellen nach Szenentyp:
hero/concept → GPU-Jobs (FLUX/SDXL)
stock/person → CPU-Jobs (stock_fetch/person_fetch)
map → CPU-Jobs (map_render)
chart → CPU-Jobs (chart_gen)
+ 1x TTS, 1x Whisper, 1x ESRGAN
2. jobs WHERE status = 'queued'
→ GPU-Jobs: Abhaengigkeiten pruefen → An Worker senden (HTTP REST)
→ CPU-Jobs: Sofort lokal ausfuehren (Stock/Chart/Map-Module)
3. jobs WHERE status = 'running'
→ GPU-Worker pollen, Status updaten
→ CPU-Jobs sind synchron, Status sofort done/failed
4. Alle Jobs eines Videos done?
→ Assembly-Job starten (FFmpeg)
5. Assembly done?
→ Status → 'review'
→ Telegram-Benachrichtigung (Hausmeister-Bot)
CLI
./produce.py new --channel kanal-a --topic "Oelpreis-Krise 2026"
./produce.py status
./produce.py approve-script 42
./produce.py publish 42
./produce.py gpus
Worker-Architektur
ki-tower (3090) gpu-worker (4x 3080)
┌─────────────────────────┐ ┌──────────────────────────────┐
│ Orchestrator (Python) │ │ Debian 12 + Docker + CUDA │
│ ├── production.db │ Tailscale │ │
│ ├── /api/submit-job │◄────────────►│ #0: xtts+sdxl :8501 │
│ ├── /api/job-status │ │ #1: sdxl :8502 │
│ └── /api/get-result │ │ #2: sdxl :8503 │
│ │ │ #3: whisper+esrgan :8504 │
│ Qwen 14B (vLLM) :8401 │ │ │
│ FLUX.1 (ComfyUI):8402 │ │ 10 GB VRAM pro Karte │
│ FFmpeg (lokal) │ │ CUDA-nativ │
└─────────────────────────┘ └──────────────────────────────┘
Media-Module (CPU, ki-tower)
Vier Python-Module die der Orchestrator lokal ausfuehrt. Kein GPU, kein externer Service. Laufen parallel zu GPU-Jobs, brauchen <60 Sekunden fuer alle Szenen zusammen.
Stock-Fetcher (~50 Zeilen)
# Pexels API (kostenlos, 200 Requests/Std)
def fetch_stock(query: str, output_path: str) -> str:
resp = requests.get("https://api.pexels.com/v1/search",
params={"query": query, "per_page": 3, "orientation": "landscape"},
headers={"Authorization": PEXELS_KEY})
url = resp.json()["photos"][0]["src"]["large2x"] # 1920px
download(url, output_path)
return output_path
- Fallback: Pixabay API (ebenfalls kostenlos) wenn Pexels kein Ergebnis
- Bildgroesse: 1920x1280 (wird per ffmpeg auf 1920x1080 zugeschnitten)
- Lizenz: Pexels-Lizenz erlaubt kommerzielle Nutzung ohne Attribution
Chart-Generator (~80 Zeilen)
# matplotlib + yfinance/FRED fuer echte Wirtschaftsdaten
def generate_chart(data_source: str, date_range: str, title: str, output_path: str) -> str:
data = fetch_data(data_source, date_range)
fig, ax = plt.subplots(figsize=(19.2, 10.8), dpi=100)
ax.plot(data.index, data.values, color="#e63946", linewidth=2.5)
ax.set_title(title, fontsize=32, fontweight="bold", color="white")
fig.patch.set_facecolor("#1a1a2e")
ax.set_facecolor("#1a1a2e")
fig.savefig(output_path, dpi=100, bbox_inches="tight")
return output_path
- Datenquellen: yfinance (Aktien, Oel, Gold), FRED API (BIP, Inflation), World Bank
- Stil: Dunkler Hintergrund, passend zum Video-Look (konfigurierbar pro Kanal)
- Output: 1920x1080 PNG, direkt als Szene verwendbar
Map-Renderer (~60 Zeilen)
# Statische Karte via Mapbox Static API (kostenlos bis 50k/Monat)
def render_map(center: list, zoom: int, markers: list, style: str, output_path: str) -> str:
marker_str = ",".join([f"pin-s+e63946({m['lon']},{m['lat']})" for m in markers])
url = (f"https://api.mapbox.com/styles/v1/mapbox/{style}/static/"
f"{marker_str}/{center[0]},{center[1]},{zoom}/1920x1080@2x"
f"?access_token={MAPBOX_TOKEN}")
download(url, output_path)
return output_path
- Stile:
dark-v11(Standard),satellite-v9(Satellit),light-v11(hell) - Marker: Rote Pins mit Labels fuer Staedte, Militaerbasen, Routen
- Alternative: OpenStreetMap + Leaflet-Screenshot (komplett kostenlos, etwas aufwaendiger)
Person-Fetcher (~40 Zeilen)
# Wikimedia Commons API fuer Portraits realer Personen
def fetch_person(name: str, output_path: str) -> str:
resp = requests.get("https://en.wikipedia.org/api/rest_v1/page/summary/" +
name.replace(" ", "_"))
image_url = resp.json().get("originalimage", {}).get("source")
if image_url:
download(image_url, output_path)
return output_path
- Quelle: Wikipedia/Wikimedia (CC-lizenziert, Attribution noetig)
- Fallback: Pexels-Suche nach Name wenn kein Wikipedia-Bild
- Hinweis: Nur fuer oeffentliche Personen (Politiker, CEOs). Keine Privatpersonen.
Szenentyp-Routing im Orchestrator
SCENE_HANDLERS = {
"hero": lambda s: submit_gpu_job("flux", s), # 3090
"concept": lambda s: submit_gpu_job("sdxl", s), # 3080 #1/#2
"stock": lambda s: fetch_stock(s["query"], ...), # CPU, <2 Sek
"map": lambda s: render_map(s["data_source"],...),# CPU, <3 Sek
"chart": lambda s: generate_chart(s["data_source"],...), # CPU, <1 Sek
"person": lambda s: fetch_person(s["query"], ...), # CPU, <2 Sek
}
Konkretes Beispiel: "Irans Hyperschall-Schlag" (24 Min)
INPUT:
Thema: "Irans Hyperschallrakete — geopolitische Folgen"
Recherche: 3-4 Quellenlinks
PHASE 1 (~30 Min):
GPT-5.4 → Skript (4500 Woerter)
Mensch reviewt (~20 Min)
Qwen 14B → Szenenplan: 105 Szenen (JSON), davon:
12x hero — dramatische Key-Visuals, Thumbnail
35x concept — symbolische Szenen (Rakete, Explosion, Diplomatie)
25x stock — echte Fotos (Khamenei, Pentagon, Oeltanker, Staedte)
8x map — Strait of Hormuz, Flugbahnen, Militaerbasen
5x chart — Oelpreis, Ruestungsausgaben, Handelsvolumen
20x person — Politiker, Militaerfuehrer, Analysten
PHASE 2 (~15 Min, 5 GPUs + CPU parallel):
GPU:
3090: 12 Hero-Bilder (FLUX.1-dev) ~10 Min
3080 #0: XTTS v2 → 24 Min Voiceover → danach 10 SDXL ~15 Min
3080 #1: 18 Konzept-Bilder (SDXL) ~10 Min
3080 #2: 17 Konzept-Bilder (SDXL) ~10 Min
3080 #3: Whisper → Untertitel-SRT + ESRGAN ~5 Min
CPU (parallel, <60 Sek):
Stock-Fetcher: 25 Fotos von Pexels
Person-Fetcher: 20 Portraits von Wikipedia
Map-Renderer: 8 Karten von Mapbox
Chart-Generator: 5 Charts (Oelpreis via yfinance, etc.)
PHASE 3 (~10 Min):
FFmpeg: 105 Szenen × Ken-Burns → Videospur
FFmpeg: Audio-Mix (Voiceover + Ambient-Musik)
FFmpeg: Text-Overlays + Untertitel
NVENC: H.265 → final.mp4 (1080p)
Gesamtzeit Maschine: ~25 Min
Gesamtzeit inkl. Mensch: ~55 Min
Bildmix im fertigen Video:
~45% KI-generiert (hero + concept) → Stimmung, Symbolik
~25% Stock-Fotos → Realitaet, Glaubwuerdigkeit
~20% Portraits → Personen, Gesichter
~8% Karten → Geografie, Routen
~5% Charts → Daten, Fakten
Nicht-Ziele (v1)
- Kein Avatar (kommt spaeter als Test)
- Kein Vollbild-Avatar
- Kein Piper TTS (zu robotisch, XTTS v2 direkt)
- Kein AMD-Rig
- Kein Multi-Kanal (erst ein Kanal stabil betreiben)
- Keine YouTube-Upload-Automation
- Keine Batch-Produktion (ein Video nach dem anderen)
- Kein Kubernetes, kein Service-Mesh, kein Proxmox
- Keine eigene Bild-Datenbank (Stock wird live per API geholt)
- Kein CLIP-Scoring (kommt spaeter fuer automatische Bildauswahl)
Umsetzungsreihenfolge
PHASE 1 — ki-tower Grundinstallation (Woche 1-2)
├── Debian 12 + NVIDIA 550+ Treiber + CUDA 12.x + Docker
├── vLLM + Qwen 2.5 14B → Szenenplan-Test
├── GPT-5.4 API anbinden → erster Skript-Test
└── Ergebnis: "Skript + Szenenplan funktionieren"
PHASE 2 — Bildgenerierung + Media-Module (Woche 3-4)
├── ComfyUI + FLUX.1-dev in Docker → Hero-Bilder testen
├── SDXL in Docker (gleicher ComfyUI oder A1111)
├── Media-Module: Stock-Fetcher, Chart-Gen, Map-Renderer, Person-Fetcher
├── Pexels API-Key + Mapbox Token einrichten (beides kostenlos)
├── Szenentyp-Routing: hero/concept → GPU, stock/map/chart/person → CPU
└── Ergebnis: "Mixed Media (50 KI + 50 Stock/Charts/Karten) in <15 Min"
PHASE 3 — 3080-Rig parallel aufbauen (Woche 3-5)
├── Debian 12 + CUDA + Docker (identischer Stack)
├── SDXL-Worker auf #1, #2 (sofort produktiv)
├── Tailscale + Worker-API anbinden
└── Ergebnis: "3 SDXL-Worker generieren Bilder parallel"
PHASE 4 — Voice + Untertitel (Woche 5-6)
├── XTTS v2 auf 3080 #0 → Voice-Cloning mit eigener Referenz testen
├── Deutsche Stimme tunen (Sprechstil, Tempo, Betonung)
├── faster-whisper auf 3080 #3 → SRT-Untertitel
└── Ergebnis: "Natuerliches deutsches Voiceover + Untertitel"
PHASE 5 — FFmpeg Assembly + erstes Video (Woche 6-7)
├── Ken-Burns-Presets (Schwenk, Zoom, statisch je Szenentyp)
├── Audio-Mix (Voiceover + Musik, Lautstaerke-Normalisierung)
├── Text-Overlay-Pipeline (aus Szenenplan-JSON)
├── Untertitel einbetten
├── Thumbnail-Generierung (FLUX hero-Bild)
├── NVENC Encoding
└── Ergebnis: "Erstes komplettes 10-Min-Video"
PHASE 6 — Orchestrator + Produktionsbetrieb (Woche 7-8)
├── Python-Orchestrator: production.db + Job-Verteilung
├── CLI (produce.py)
├── Telegram-Benachrichtigung bei fertigem Video
├── Erstes Video auf YouTube hochladen
└── Ergebnis: "v1 laeuft produktiv"
PHASE 7 — Stabilisierung + Tempo (Woche 9-10)
├── Prompt-Templates fuer Skripte verfeinern
├── FFmpeg-Presets fuer verschiedene Szenentypen
├── XTTS-Stimme weiter tunen
├── 3-5 Videos produzieren und Workflow optimieren
└── Ergebnis: "v1 ist stabil, 2-3 Videos/Woche moeglich"
Spaeter (v1.5+)
Erst nach mindestens 10 produzierten Videos und stabilem Workflow.
v1.5 — Avatar-Test (optional)
| Feature | Beschreibung |
|---|---|
| SadTalker PiP (~20%) | Sprechender Avatar unten rechts, 384x384 |
| Laeuft auf 3080 #2 | SDXL wird auf #1 und #0 (nach TTS) konzentriert |
| Abhaengigkeit | TTS muss vorher fertig sein (Audio → Lip-Sync) |
| Risiko | Qualitaet moeglicherweise nicht ausreichend. Alternativen: LivePortrait, MuseTalk |
| Entscheidung | Erst testen, dann entscheiden ob es im Kanal bleibt |
Avatar-Layout (nur v1.5):
┌─────────────────────────────────────────────┐
│ │
│ HAUPTBILD (Bilder, Karten) │
│ │
│ ┌─────────┐ │
│ │ Avatar │ │
│ │ ~20% │ │
│ └─────────┘ │
└─────────────────────────────────────────────┘
v2 — Erweiterungen
| Feature | Voraussetzung |
|---|---|
| Multi-Kanal | v1 stabil, erster Kanal hat >20 Videos |
| Avatar-Varianten | SadTalker/LivePortrait qualitativ validiert |
| Batch-Produktion | Mehrere Videos in Queue |
| YouTube-Upload-API | Manueller Upload nervt (>3 Videos/Woche) |
| Vollbild-Avatar | Nur wenn Qualitaet stimmt. Aktuell unrealistisch mit SadTalker. |
AMD-Rig
Nicht in der Planung. Entscheidung nach 3 Monaten v1:
- Wenn 3080-Rig Kapazitaetsgrenze erreicht: 1-Karten-Test (Whisper)
- Sonst: verkaufen, Erloese in Storage investieren
Entscheidungen
| Frage | Entscheidung | Begruendung |
|---|---|---|
| Skript-LLM | GPT-5.4 (Cloud) | Kreativitaet > lokale Inferenz. ~0.50 EUR/Skript. |
| Szenenplan-LLM | Qwen 14B (lokal) | Strukturiertes JSON, keine Kreativitaet noetig |
| Hero-Bilder | FLUX.1-dev (3090) | Beste Qualitaet fuer Thumbnails, Titel, Kapitelwechsel |
| Konzept-Bilder | SDXL (3x 3080) | Symbolik, Stimmung — dort wo KI stark ist |
| Reale Medien | Stock + Karten + Charts (CPU) | Fakten, Personen, Geografie — dort wo KI schwach ist |
| Stimme (v1) | XTTS v2 (3080 #0) | Voice-Cloning, natuerlich, deutsch. Keine Uebergangsloesung. |
| Untertitel | faster-whisper (3080 #3) | CUDA-nativ, schnell |
| Avatar (v1) | Nein | Fragil, Qualitaetsrisiko, unnoetige Komplexitaet |
| Assembly | FFmpeg + NVENC | Stabil, flexibel, hardware-beschleunigt |
| DB | SQLite | Ein User, eine Datei. |
| Netzwerk | Tailscale | ki-tower ↔ gpu-worker, fertig |
| OS | Debian 12 | Beide Maschinen identisch. Docker + CUDA. |
| AMD-Rig | Nicht in v1 | Kein Aufwand, keine Planung |
Risiken
| # | Risiko | Impact | Mitigation |
|---|---|---|---|
| 1 | XTTS v2 deutsche Stimme klingt unnatuerlich | Hoch | Voice-Cloning mit guter Referenz. Fallback: OpenAI TTS als Bruecke (~0.50 EUR/Video). |
| 2 | VRAM-Tetris auf 3090 (Qwen + FLUX) | Mittel | Sequentiell, nicht parallel. vLLM Model-Unloading. 14B statt 32B. |
| 3 | Pipeline wird zu komplex vor erstem Video | Hoch | Erste 3 Videos manuell (Bash-Scripts). Orchestrator erst in Phase 6. |
| 4 | SDXL-Bilder stilistisch inkonsistent | Niedrig | Weniger KI-Bilder (~50 statt ~100). Feste Style-Presets + Negativprompts. |
| 5 | FFmpeg-Assembly hat Artefakte | Mittel | Ken-Burns-Presets manuell testen. Ueberblendungen standardisieren. |
| 6 | Stock-API liefert unpassende Bilder | Niedrig | 3 Ergebnisse abrufen, bestes per CLIP-Score auswaehlen. Fallback: SDXL-Concept. |
| 7 | Pexels/Mapbox API-Limits | Niedrig | Pexels: 200 Req/Std (reicht fuer ~6 Videos/Std). Mapbox: 50k/Monat. Weit ueber Bedarf. |
Kosten
| Posten | Monatlich |
|---|---|
| Strom ki-tower (24/7) | ~30-40 EUR |
| Strom gpu-worker (bei Bedarf) | ~10-30 EUR |
| GPT-5.4 API (Skripte) | ~3-15 EUR |
| Cloud-TTS Fallback | ~0-10 EUR |
| Pexels API | kostenlos |
| Mapbox API | kostenlos (bis 50k Req/Monat) |
| yfinance/FRED | kostenlos |
| Gesamt | ~45-85 EUR |
Keine zusaetzlichen Kosten durch Mixed Media. Alle APIs haben kostenlose Tiers die fuer die geplante Produktionsmenge (8-12 Videos/Monat) weit ausreichen.