# Projektplan: Artikel-Vorlese-Funktion (Pre-Generation)

**Stand:** 11. Juni 2026  
**Prinzip:** Audio wird EINMAL bei Artikel-Erstellung generiert, nicht bei jeder Anfrage.

---

## Übersicht

Jeder Artikel auf brettspiel-news.de bekommt automatisch:
- Deutsche Audioversion (Thorsten-Stimme, Piper TTS)
- Englische Audioversion (Joe-Stimme, Piper TTS, optional)
- Play-Button unter dem Artikel
- Download-Link für Offline-Hören

Der Chatbot nutzt dieselben Dateien — null Zusatzaufwand.

---

## Phase 1: TTS-Pipeline (Hermes-Seite)

### 1.1 Pipeline-Skript
- Input: Artikel-URL oder Artikel-ID
- Fetch: Artikeltext via Content-API
- Clean: HTML → Fließtext (parsbar für TTS)
- Generate DE: Piper Thorsten (de_DE-thorsten-medium)
- Generate EN: Piper Joe (en_US-joe-medium) — optional
- Output: MP3-Datei → Media-Ordner

### 1.2 Performance
- 2.000 Zeichen → ~3 min Audio → ~30s Generierung (0,15x Echtzeit)
- 5.000 Zeichen → ~8 min Audio → ~75s Generierung
- 10.000 Zeichen → ~15 min Audio → ~150s Generierung

### 1.3 API-Endpoint
- `POST /tts/generate` — nimmt Artikel-ID/URL, gibt Audio-Pfad zurück
- Status-Endpoint für Fortschritt (bei langen Artikeln)

---

## Phase 2: Joomla-Integration

### 2.1 Trigger
- Joomla-Plugin: `onContentAfterSave` → Webhook an Hermes
- Alternativ: Cron-Job, der alle X Minuten auf neue Artikel prüft
- Priorität: Webhook (sofort), Cron (Fallback)

### 2.2 Audio-Speicherung
- MP3-Dateien auf brettspiel-news.de Server
- Pfad-Schema: `/media/audio/articles/{article-id}-de.mp3`
- Auch als Download in Artikel-Metadaten hinterlegt

### 2.3 Artikel-Template
- Play-Button: `<audio>`-Element oder JavaScript-Player
- Text: "🔊 Artikel anhören (DE) | (EN)"
- Barrierefrei: ARIA-Labels, Keyboard-Navigation

---

## Phase 3: Chatbot-Integration

### 3.1 Vorlese-Befehl
- User: „Lies Artikel X vor"
- Chatbot: Holt `article_id` → sucht Audio-Datei → gibt Player zurück
- Keine Generation — Datei existiert bereits

### 3.2 Knowledge-Datenbank
- Tabelle `article_audio`: article_id, title, de_audio_path, en_audio_path, generated_at
- Schneller Lookup für Chatbot

---

## Phase 4: Batch-Verarbeitung (bestehende Artikel)

### 4.1 Bestandsaufnahme
- Alle Artikel-IDs via Content-API abrufen
- Prüfen, welche schon Audio haben

### 4.2 Batch-Lauf
- Parallele Verarbeitung (4 Worker = 4 parallele TTS-Generierungen)
- ~1.200 Artikel × 30s = ~10 Stunden Gesamtlaufzeit
- Priorisierung: Neueste zuerst, dann älteste

### 4.3 Fehlerbehandlung
- Retry bei Timeout
- Skip bei leeren Artikeln
- Logging pro Artikel

---

## Phase 5: Weitere Sprachen (Zukunft)

| Sprache | Piper-Stimme | Verfügbar |
|---------|-------------|-----------|
| Deutsch | Thorsten (medium) | ✅ |
| Englisch | Joe (medium) | ✅ |
| Französisch | fr_FR (medium) | ✅ Piper |
| Spanisch | es_ES (medium) | ✅ Piper |
| Niederländisch | nl (medium) | ✅ Piper |

- Pro Sprache: ~30s Generierung extra
- Speicher: ~1 MB MP3 pro Artikel pro Sprache
- 1.200 Artikel × 5 Sprachen × 1 MB = ~6 GB (vernachlässigbar)

---

## Infrastruktur (gemeinsam mit Chatbot)

| Komponente | Status |
|-----------|--------|
| Piper TTS (Thorsten DE) | ✅ Läuft |
| Piper TTS (Joe EN) | ✅ Läuft |
| Content-API (Joomla) | ⏳ Nach Migration |
| Joomla-Plugin (Trigger) | 🔜 Phase 2 |
| Artikel-Template | ⏳ Daniel |
| Speicherplatz | ✅ Ausreichend (50+ GB frei) |

---

## Nächste Schritte

1. Pipeline-Skript bauen (jetzt)
2. API-Endpoint für TTS-Generierung (jetzt)
3. Joomla-Plugin nach Migration (Daniel)
4. Template-Play-Button (Daniel)
5. Batch-Lauf für Archiv (nach Phase 1+2)
