127 lines
3.6 KiB
Markdown
127 lines
3.6 KiB
Markdown
# 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)
|