diff --git a/README.md b/README.md
index 9f838ac..64a269e 100644
--- a/README.md
+++ b/README.md
@@ -34,13 +34,21 @@ ARIA hat zwei Rollen:
└───────────┬───────────────────────────┬─────────────────┘
│ WebSocket Tunnel │ WebSocket Tunnel
▼ ▼
-┌───────────────────────────┐
-│ Gaming-PC (optional) │
-│ RTX 3060, Docker+WSL2 │
-│ XTTS v2 (natuerliche │
-│ Stimmen, Voice Cloning) │
-│ xtts/docker-compose.yml │
-└───────────────────────────┘
+┌─────────────────────────────────┐
+│ Gamebox (Windows + WSL2) │
+│ RTX 3060, Docker Desktop │
+│ ┌──────────────────────────┐ │
+│ │ aria-f5tts-bridge │ │
+│ │ F5-TTS Voice Cloning │ │
+│ │ PCM-Streaming an die App │ │
+│ ├──────────────────────────┤ │
+│ │ aria-whisper-bridge │ │
+│ │ Faster-Whisper CUDA │ │
+│ │ STT in fast-Echtzeit │ │
+│ └──────────────────────────┘ │
+│ Beide teilen ./voices Volume │
+│ xtts/docker-compose.yml │
+└─────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ ARIA-VM (Proxmox, Debian 13) — ARIAs Wohnung │
│ Basissystem + Docker. Rest richtet ARIA selbst ein. │
@@ -57,8 +65,10 @@ ARIA hat zwei Rollen:
│ │ Liest BOOTSTRAP.md + AGENT.md │ │
│ │ │ │
│ │ [bridge] ARIA Voice Bridge Container │ │
-│ │ Whisper STT · Wake-Word │ │
-│ │ TTS remote via XTTS v2 auf Gaming-PC │ │
+│ │ Wake-Word (lokales Mikro auf VM) │ │
+│ │ STT primaer remote (Gamebox-Whisper) │ │
+│ │ Fallback: lokales faster-whisper (CPU) │ │
+│ │ TTS via F5-TTS auf Gamebox │ │
│ │ Bruecke: App <> RVS <> Bridge <> ARIA │ │
│ │ │ │
│ │ [diagnostic] Selbstcheck-UI + Einstellungen │ │
@@ -79,9 +89,12 @@ ARIA hat zwei Rollen:
|-----|----|-----|
| RVS | Rechenzentrum | `cd rvs && docker compose up -d` |
| ARIA Core | Debian 13 VM | `docker compose up -d && ./aria-setup.sh` |
-| XTTS v2 (optional) | Gaming-PC (GPU) | `cd xtts && docker compose up -d` |
+| Gamebox-Stack (F5-TTS + Whisper) | Gamebox (GPU) | `cd xtts && docker compose up -d` |
| Android App | Stefans Handy | APK installieren (Auto-Update via RVS) |
+> Der Gamebox-Stack ist optional: ohne ihn faellt STT auf lokales Whisper (CPU,
+> langsamer) zurueck; TTS bleibt aus (ARIA antwortet dann nur als Text).
+
---
## Installation — Schritt fuer Schritt
@@ -147,11 +160,12 @@ in den Proxy gemountet. Die Credentials ueberleben Container-Restarts.
```bash
cp aria-data/config/aria.env.example aria-data/config/aria.env
-# Bei Bedarf anpassen (Whisper-Modell, Sprache, Wake-Word)
+# Bei Bedarf anpassen (Whisper-Modell als Fallback, Sprache, Wake-Word)
```
-TTS laeuft ausschliesslich ueber XTTS v2 auf dem Gaming-PC — siehe Abschnitt
-"XTTS v2 — High-Quality TTS" weiter unten.
+STT laeuft primaer auf der Gamebox (faster-whisper auf GPU), TTS ausschliesslich
+ueber F5-TTS auf der Gamebox — siehe Abschnitt "Gamebox-Stack — F5-TTS + Whisper"
+weiter unten.
### 5. RVS-Token generieren & Container starten
@@ -284,25 +298,34 @@ braucht ARIA mehrere API-Roundtrips.
## Voice Bridge
-Die Bridge verbindet die Android App mit ARIA und bietet lokale Sprachverarbeitung.
+Die Bridge verbindet die Android App mit ARIA und orchestriert die GPU-Services
+auf der Gamebox.
**Nachrichtenfluss:**
```
Text: App → RVS → Bridge → chat.send → aria-core
-Audio: App → RVS → Bridge → FFmpeg → Whisper STT → chat.send → aria-core
+Audio: App → RVS → Bridge → stt_request (RVS) → whisper-bridge (Gamebox)
+ → stt_response → Bridge → chat.send → aria-core
+ Fallback bei Timeout: lokales faster-whisper (CPU)
Datei: App → RVS → Bridge → /shared/uploads/ → chat.send (mit Pfad) → aria-core
aria-core → Antwort → Gateway → Diagnostic → RVS → App
- → Bridge → XTTS (PCM-Stream) → RVS → App AudioTrack
+ → Bridge → xtts_request (RVS) → f5tts-bridge
+ → audio_pcm Stream → RVS → App AudioTrack
```
### Features
-- **STT**: faster-whisper (lokal, offline, 16kHz mono)
-- **TTS**: XTTS v2 (remote auf Gaming-PC, GPU, Voice Cloning) — Streaming ueber PCM-Chunks
-- **Text-Cleanup**: `...` Tag bevorzugt, Markdown/Code/Einheiten/URLs werden TTS-gerecht aufbereitet
-- **Wake-Word**: openwakeword (lokales Mikrofon auf der VM)
-- **App-Audio**: Base64 Audio von App → FFmpeg → Whisper STT → Text an aria-core
+- **STT primaer remote**: aria-bridge sendet `stt_request` an die Gamebox-Whisper
+ (faster-whisper CUDA, fast Echtzeit). 45s Timeout, dann Fallback auf lokales
+ CPU-Whisper. Modell-Wahl in Diagnostic, Hot-Swap via config-Broadcast.
+- **TTS via F5-TTS**: aria-f5tts-bridge auf der Gamebox. Voice Cloning mit
+ Referenz-Audio + automatisch transkribiertem Referenz-Text.
+- **Text-Cleanup**: `...` Tag bevorzugt; Markdown, Code,
+ Einheiten und URLs werden TTS-gerecht aufbereitet. Dezimalzahlen werden
+ ausgeschrieben (`0,1` → "null komma eins"). Acronyme bis 5 Buchstaben werden
+ buchstabiert (`USB` → "U S B", `XTTS` → "X T T S").
+- **Wake-Word**: openwakeword (lokales Mikrofon auf der VM, optional)
- **Modi**: Normal, Nicht stoeren, Fluestern, Hangar, Gaming
### Betriebsmodi
@@ -324,14 +347,16 @@ Erreichbar unter `http://:3001`. Teilt das Netzwerk mit aria-core.
### Features
- **Status-Karten**: Gateway (Handshake), RVS (TLS-Fallback), Proxy (Auth)
+- **Disk-Voll Banner**: Rotes Overlay wenn die VM-Disk knapp wird, mit copy-baren Cleanup-Befehlen (safe + aggressiv)
- **Chat-Test**: Nachrichten direkt an ARIA senden (Gateway oder via RVS), Vollbild-Modus
- **"ARIA denkt..." Indikator**: Zeigt live was ARIA gerade tut (Denken, Tool, Schreiben)
- **Abbrechen-Button**: Stoppt laufende Anfragen + doctor --fix
- **Session-Verwaltung**: Sessions auflisten, wechseln, erstellen, loeschen, als Markdown exportieren (⬇ Button)
- **Chat-History**: Wird beim Laden und Session-Wechsel angezeigt (read-only aus JSONL)
- **TTS-Diagnose Tab**: Stimmen testen, Status pruefen, Fehler anzeigen
-- **Einstellungen**: TTS aktiv-Toggle, XTTS-Voice (gecloned), Betriebsmodi, Whisper-Modell (tiny…large-v3, Hot-Reload)
-- **XTTS Voice Cloning**: Audio-Samples hochladen, eigene Stimme erstellen
+- **Einstellungen**: TTS aktiv-Toggle, F5-TTS-Voice (gecloned), Betriebsmodi, Whisper-Modell (tiny…large-v3, Hot-Reload auf der Gamebox)
+- **Voice-Status**: Beim Wechsel der globalen Stimme zeigt ein Status-Text "Lade…" → "bereit (X.Ys)" — getriggert ueber `voice_preload`/`voice_ready`
+- **Voice Cloning**: Audio-Samples hochladen, Referenz-Text wird automatisch via Whisper transkribiert
- **Claude Login**: Browser-Terminal zum Einloggen in den Proxy
- **Core Terminal**: Shell in aria-core (openclaw CLI)
- **Container-Logs**: Echtzeit-Logs aller Container (gefiltert nach Tab + Pipeline)
@@ -354,18 +379,21 @@ API-Endpoint fuer andere Services: `GET http://localhost:3001/api/session`
- Text-Chat mit ARIA
- **Sprachaufnahme**: Push-to-Talk (halten) oder Tap-to-Talk (tippen, Auto-Stop bei Stille)
-- **Gespraechsmodus** (Ohr-Button): Nach jeder ARIA-Antwort startet automatisch die Aufnahme — wie ein natuerliches Gespraech hin und her, ohne Buttons druecken
-- **VAD (Voice Activity Detection)**: Erkennt 1.8s Stille und stoppt automatisch
-- **Speech Gate**: Aufnahme wird verworfen wenn keine Sprache erkannt (kein Rauschen an Whisper)
-- **STT (Speech-to-Text)**: Audio wird als 16kHz mono aufgenommen und in der Bridge per Whisper transkribiert, transkribierter Text erscheint im Chat
+- **Gespraechsmodus** (Ohr-Button): Nach jeder ARIA-Antwort startet automatisch die Aufnahme — wie ein natuerliches Gespraech hin und her
+- **VAD (Voice Activity Detection)**: Konfigurierbare Stille-Toleranz (1.0–8.0s, Default 2.8s) bevor Auto-Stop greift. Max-Aufnahme 120s.
+- **Speech Gate**: Aufnahme wird verworfen wenn keine Sprache erkannt
+- **STT (Speech-to-Text)**: 16kHz mono → Bridge → Gamebox-Whisper (CUDA) → Text im Chat. Fast in Echtzeit.
- **"ARIA denkt..." Indicator**: Zeigt live den Status vom Core (Denken, Tool, Schreiben) + Abbrechen-Button
-- **TTS-Wiedergabe**: ARIA antwortet per Lautsprecher — XTTS v2 PCM-Streaming direkt in AudioTrack, keine Wait-Gaps
-- **Play-Button**: Jede ARIA-Nachricht kann nochmal vorgelesen werden
+- **TTS-Wiedergabe**: F5-TTS PCM-Streaming direkt in AudioTrack mit konfigurierbarem Pre-Roll-Buffer (1.0–6.0s, Default 3.5s) gegen Gaps bei Render-Pausen
+- **Audio-Pause**: Andere Apps (Spotify, YouTube etc.) pausieren komplett waehrend ARIA spricht und kommen erst wieder nach echtem Wiedergabe-Ende
+- **Lokale Voice-Wahl**: Pro Geraet eigene Stimme moeglich (in Settings). Diagnostic-Wechsel ueberschreibt alle App-Wahlen.
+- **Voice-Ready Toast**: Beim Wechsel zeigt die App "Stimme X bereit (X.Ys)" sobald der Preload durch ist
+- **Play-Button**: Jede ARIA-Nachricht kann nochmal vorgelesen werden (aus Cache wenn vorhanden, sonst neu rendern)
- **Chat-Suche**: Lupe in der Statusleiste filtert Nachrichten live
- **Mehrere Anhaenge**: Bilder + Dateien sammeln, Text hinzufuegen, dann zusammen senden
- **Paste-Support**: Bilder aus Zwischenablage einfuegen (Diagnostic)
- **Anhaenge**: Bridge speichert in Shared Volume, ARIA kann darauf zugreifen, Re-Download ueber RVS
-- **Einstellungen**: TTS aktiv, XTTS-Voice, Speicherort, Auto-Download, GPS
+- **Einstellungen**: TTS-aktiv, F5-TTS-Voice, Pre-Roll-Buffer, Stille-Toleranz, Speicherort, Auto-Download, GPS
- **Auto-Update**: Prueft beim Start + per Button auf neue Version, Download + Installation ueber RVS (FileProvider)
- GPS-Position (optional)
- QR-Code Scanner fuer Token-Pairing
@@ -540,7 +568,7 @@ cp ARIA-v0.0.3.0.apk ~/ARIA-AGENT/rvs/updates/
---
-## XTTS v2 — GPU TTS Server (optional)
+## Gamebox-Stack — F5-TTS + Whisper (GPU-Services)
Laeuft auf einem separaten Rechner mit NVIDIA GPU (z.B. Gaming-PC mit RTX 3060).
Verbindet sich ueber RVS mit der ARIA-Infrastruktur — kein VPN noetig, funktioniert
@@ -549,22 +577,27 @@ ueber verschiedene Netze hinweg.
### Architektur
```
-Gaming-PC (Windows, RTX 3060, Docker Desktop + WSL2)
-├── aria-xtts XTTS v2 GPU Server (Port 8020 intern)
-└── aria-xtts-bridge RVS-Relay (empfaengt Requests, sendet Audio)
- └── Beide teilen ./voices/ Volume fuer Voice Cloning
+Gamebox (Windows, RTX 3060, Docker Desktop + WSL2)
+├── aria-f5tts-bridge F5-TTS Voice Cloning + RVS-Relay
+│ Hoert auf xtts_request, streamt audio_pcm
+├── aria-whisper-bridge faster-whisper auf CUDA (float16)
+│ Hoert auf stt_request, antwortet mit stt_response
+└── ./voices/ Geteilt zwischen beiden:
+ {name}.wav — Referenz-Audio (~6-10s)
+ {name}.txt — Referenz-Text (auto via Whisper)
↕ RVS (Rechenzentrum, WebSocket Relay)
ARIA-VM
-└── aria-bridge: tts_engine="xtts" → xtts_request via RVS → wartet auf xtts_response
+└── aria-bridge: STT primaer remote (45s Timeout, dann lokaler CPU-Fallback)
+ TTS via xtts_request → audio_pcm Stream
```
### Voraussetzungen
- Docker Desktop mit WSL2 (Windows) oder Docker mit NVIDIA Runtime (Linux)
- NVIDIA Container Toolkit
-- GPU mit mindestens 4GB VRAM (6GB+ empfohlen)
+- GPU mit mindestens 6GB VRAM (Whisper-large + F5-TTS gemeinsam)
- **Gleicher RVS_TOKEN wie auf der ARIA-VM!**
### Setup
@@ -574,34 +607,45 @@ cd xtts
cp .env.example .env
# .env mit RVS-Verbindungsdaten fuellen (gleicher Token wie ARIA-VM!)
docker compose up -d
-# Erster Start laedt ~2GB Model herunter (danach gecacht)
+# Erster Start laedt die Modelle (Whisper ~1-3GB je nach Groesse, F5-TTS ~1GB)
```
-**Wichtig:** Der XTTS-Server laeuft intern auf Port **8020** (nicht 8000).
-Das Model wird im Volume `xtts-models` gecacht und muss nur einmal geladen werden.
+Die Modelle werden in den Volumes `f5tts-models` und `whisper-models` gecacht
+und muessen nur einmal geladen werden.
### Features
-- **Natuerliche Stimmen**: Deutlich bessere Qualitaet als TTS der alten Generation
-- **Voice Cloning**: Eigene Stimme mit 6-10s Audio-Sample (~2s Latenz auf RTX 3060)
-- **Streaming**: PCM-Chunks alle ~170ms → App spielt ohne Warten nahtlos
-- **16 Sprachen**: Deutsch, Englisch, Franzoesisch, etc.
+**F5-TTS (Sprachausgabe):**
+- Hochqualitatives Voice Cloning auf Basis von 6-10s Referenz-Audio
+- Renderzeit ~0.3x Realtime auf RTX 3060 (RTF ≈ 0.3)
+- Satzweises Streaming, fade-in auf erstem Chunk gegen Warmup-Glitches
+- Sequentielle Queue gegen GPU-OOM bei parallelen Requests
+
+**Whisper (Spracherkennung):**
+- faster-whisper mit CUDA + float16 — fast Echtzeit-Transkription
+- Modelle: tiny / base / small / medium / large-v3 (Hot-Swap via Diagnostic)
+- Wird zusaetzlich von der f5tts-bridge intern genutzt um den Referenz-Text
+ beim Voice-Upload automatisch zu erzeugen
### TTS-Config
In der Diagnostic unter Einstellungen → Sprachausgabe:
- **TTS aktiv**: Global An/Aus
-- **XTTS Stimme**: Default oder gecloned (Maia, etc.)
+- **F5-TTS Stimme**: Default oder gecloned (Maia etc.)
-> XTTS ist die einzige Engine — wenn der Gaming-PC offline ist, bleibt ARIA stumm.
+> F5-TTS ist die einzige Engine — wenn die Gamebox offline ist, bleibt ARIA stumm.
> Chat-Antworten kommen weiter an (nur kein Audio).
### Stimme klonen
-1. "Stimme klonen" → Audio-Dateien hochladen (WAV/MP3, 1-10 Dateien, min. 6-10s gesamt)
+1. App oder Diagnostic → "Stimme klonen" → Audio-Dateien hochladen
+ (WAV/MP3, 1-10 Dateien, ~6-10s gesamt)
2. Name vergeben → "Stimme erstellen"
-3. "Laden" klicken → neue Stimme in der Auswahl
-4. Stimme auswaehlen → Config wird automatisch gespeichert
+3. f5tts-bridge speichert das WAV, schickt einen `stt_request` an die
+ whisper-bridge, legt die Transkription als `.txt` daneben ab und meldet
+ `xtts_voice_saved` zurueck. Der Toast in der App zeigt "Stimme bereit".
+4. Stimme auswaehlen → ein Voice-Preload (stiller Mini-Render) waermt die
+ Latents auf, "voice_ready" Toast bestaetigt es.
> **Tipp:** Fuer beste Ergebnisse: saubere Aufnahme, eine Stimme, kein Hintergrund,
> 10-30 Sekunden Gesamtlaenge. Mehrere kurze Dateien werden zusammengefuegt.
@@ -720,6 +764,15 @@ docker exec aria-core ssh aria-wohnung hostname
- [x] "ARIA denkt..."-Indicator + Abbrechen-Button in App (via Bridge → RVS)
- [x] Whisper-Modell waehlbar in Diagnostic (tiny…large-v3, Hot-Reload)
- [x] App-Aufnahme explizit 16kHz mono (optimal fuer Whisper, kein Resample)
+- [x] Streaming TTS Pre-Roll-Buffer + Wartezeit auf playbackHeadPosition (kein Cutoff mid-Satz mehr)
+- [x] Pre-Roll-Buffer einstellbar in App-Settings
+- [x] Decimal-zu-Worte fuer TTS + generisches Acronym-Buchstabieren
+- [x] voice_preload/voice_ready: visueller Status-Indikator beim Stimmen-Wechsel
+- [x] Whisper STT auf die Gamebox ausgelagert (CUDA float16, fast Echtzeit)
+- [x] **F5-TTS ersetzt XTTS** — bessere Voice-Cloning-Qualitaet, Whisper-auto-transkribierter Referenz-Text
+- [x] Audio-Pause statt Ducking (TRANSIENT statt MAY_DUCK) + release-Timing fix
+- [x] VAD-Stille-Toleranz und Max-Aufnahme einstellbar (1-8s, 120s)
+- [x] Disk-Voll Banner in Diagnostic mit copy-baren Cleanup-Befehlen
### Phase 2 — ARIA wird produktiv
diff --git a/issue.md b/issue.md
index 563df6b..8b69eda 100644
--- a/issue.md
+++ b/issue.md
@@ -5,7 +5,7 @@
- [x] Bildupload funktioniert (Shared Volume /shared/uploads/)
- [x] Sprachnachrichten werden als Text angezeigt (STT → Chat-Bubble)
- [x] Cache leeren + Auto-Download von Anhaengen
-- [x] ARIA liest Nachrichten vor (TTS via Piper)
+- [x] ARIA liest Nachrichten vor (TTS via Piper, später ersetzt)
- [x] Autoscroll zur letzten Nachricht (inverted FlatList)
- [x] Bilder im Chat groesser + Vollbild-Vorschau
- [x] Ohr-Button → Gespraechsmodus (Auto-Aufnahme nach ARIA-Antwort)
@@ -16,11 +16,11 @@
- [x] Nachrichten Backup on-the-fly (/shared/config/chat_backup.jsonl)
- [x] Grosse Nachrichten satzweise aufteilen fuer TTS
- [x] RVS Nachrichten vom Smartphone gehen durch
-- [x] Stimmen-Einstellungen (Ramona/Thorsten, Speed pro Stimme)
+- [x] Stimmen-Einstellungen (Ramona/Thorsten, Speed pro Stimme — durch XTTS/F5-TTS ersetzt)
- [x] Highlight-Trigger konfigurierbar in Diagnostic
-- [x] XTTS v2 Integration (Gaming-PC, GPU, Voice Cloning)
+- [x] XTTS v2 Integration (Gaming-PC, GPU, Voice Cloning) — durch F5-TTS ersetzt
- [x] XTTS Voice Cloning (Audio-Samples hochladen, eigene Stimme)
-- [x] TTS Engine waehlbar (Piper/XTTS) in Diagnostic + App
+- [x] TTS Engine waehlbar (Piper/XTTS) — Piper raus, XTTS raus, jetzt nur F5-TTS
- [x] Auto-Update System (APK via RVS WebSocket)
- [x] Auto-Update: APK-Installation via FileProvider
- [x] Auto-Update: "Auf Updates pruefen" Button in App-Einstellungen
@@ -31,49 +31,66 @@
- [x] Markdown-Bereinigung fuer TTS (fett, kursiv, code, links, etc.)
- [x] SSH Volume read-write fuer Proxy (kein -F Workaround mehr)
- [x] Diagnostic: Sessions als Markdown exportieren (Download-Button)
-- [x] Speech Gate: Aufnahme wird verworfen wenn keine Sprache erkannt (verhindert dass Umgebungsgeraeusche an Whisper gehen)
-- [x] Session-Persistenz: Gewaehlte Session bleibt ueber Container-Restarts erhalten (sessionFromFile-Flag, atomic write)
-- [x] Diagnostic: "ARIA denkt..." bleibt nicht mehr stehen (pipelineEnd broadcastet immer idle, auch bei Timeout/Fehler/Disconnect)
+- [x] Speech Gate: Aufnahme wird verworfen wenn keine Sprache erkannt
+- [x] Session-Persistenz: Gewaehlte Session bleibt ueber Container-Restarts erhalten
+- [x] Diagnostic: "ARIA denkt..." bleibt nicht mehr stehen
- [x] App: "ARIA denkt..." Indicator + Abbrechen-Button (Bridge spiegelt agent_activity via RVS)
-- [x] Whisper STT: Model-Auswahl in Diagnostic (tiny/base/small/medium/large-v3), Hot-Reload in Bridge, Default auf medium
+- [x] Whisper STT: Model-Auswahl in Diagnostic (tiny/base/small/medium/large-v3), Hot-Reload
- [x] App: Audio-Aufnahme explizit 16kHz mono (spart Resample, optimal fuer Whisper)
-- [x] Streaming TTS (Weg A): XTTS → PCM-Stream → aria-bridge → App AudioTrack MODE_STREAM, keine WAV-Gaps mehr
-- [x] Piper komplett entfernt: nur noch XTTS v2 als TTS-Engine (remote, GPU auf Gaming-PC). Wenn XTTS offline ist, ist ARIA stumm — bewusst akzeptiert.
-- [x] Gespraechsmodus: Speech-Gate strenger (-28dB / 500ms) — keine Umgebungsgeraeusche mehr
-- [x] Gespraechsmodus: Max-Dauer 30s pro Aufnahme, Cache-Cleanup alter Files, Messages-Array gekappt (500)
-- [x] Diagnostic: Archivierte Session-Versionen (.reset.*) werden angezeigt + exportierbar — OpenClaw resettet Sessions bei erster Nutzung nach Container-Restart, Inhalt ist aber in .reset. Dateien gesichert
-- [x] tools/export-jsonl-to-md.js: CLI-Konverter fuer beliebige Session-JSONL zu Markdown
-- [x] NO_REPLY-Filter in Bridge + Diagnostic — still verworfen (kein Chat, kein TTS)
-- [x] Audio-Ducking + Exklusiv-Focus (Kotlin AudioFocusModule): andere Apps leiser bei TTS, pausiert bei Aufnahme
-- [x] TTS-Cleanup serverseitig: Code-Bloecke raus, Einheiten ausgeschrieben (22GB → Gigabyte), Abkuerzungen buchstabiert (CPU), URLs zu "ein Link". `` Tag wird bevorzugt wenn ARIA ihn liefert.
-- [x] QR-Code Onboarding: Diagnostic generiert QR, App scannt (bestehender QRScanner funktioniert out of the box)
-- [x] TTS-Audio-Cache im Filesystem: Piper-Audio wird mit messageId verknuepft, als WAV in DocumentDirectory/tts_cache gespeichert, Play-Button spielt aus Cache statt regenerieren
-- [x] Config via Diagnostic: RVS-Credentials + Aria-Auth-Token via /api/runtime-config, persistiert in /shared/config/runtime.json, Bridge liest beim Start (Overrides der ENV)
+- [x] Streaming TTS: PCM-Stream → AudioTrack MODE_STREAM, keine WAV-Gaps
+- [x] Piper komplett entfernt
+- [x] Gespraechsmodus: Speech-Gate strenger (-28dB / 500ms)
+- [x] Diagnostic: Archivierte Session-Versionen (.reset.*) angezeigt + exportierbar
+- [x] tools/export-jsonl-to-md.js: CLI-Konverter fuer Session-JSONL zu Markdown
+- [x] NO_REPLY-Filter in Bridge + Diagnostic
+- [x] Audio-Ducking + Exklusiv-Focus (Kotlin AudioFocusModule)
+- [x] TTS-Cleanup serverseitig: Code-Bloecke raus, Einheiten ausgeschrieben, Abkuerzungen buchstabiert, URLs zu "ein Link"
+- [x] QR-Code Onboarding: Diagnostic generiert QR, App scannt
+- [x] TTS-Audio-Cache im Filesystem: WAV pro messageId, Play-Button spielt aus Cache
+- [x] Config via Diagnostic: RVS-Credentials + Auth-Token persistiert in /shared/config/runtime.json
+- [x] Disk-Voll Banner in Diagnostic: rotes Overlay + copy-baren Cleanup-Befehlen (safe + aggressiv)
+- [x] cleanup.sh: kombinierter Docker-Aufraeum-Befehl (safe / --full)
+- [x] Streaming TTS Pre-Roll: AudioTrack play() startet erst wenn 2.5s gepuffert sind
+- [x] Streaming TTS Stop-Race: Writer wartet auf playbackHeadPosition vor stop()/release() — keine abgeschnittenen Saetze mehr
+- [x] Leading-Silence (200ms) am Stream-Anfang — AudioTrack faehrt sauber an
+- [x] Pre-Roll-Buffer einstellbar in App-Settings (1.0-6.0s, Default 3.5s)
+- [x] Fade-In auf erstem PCM-Chunk (120ms) — versteckt XTTS/F5-TTS Warmup-Glitches
+- [x] Decimal-zu-Worte fuer TTS (0.1 → null komma eins, mit IP-Schutz-Lookahead)
+- [x] Generic Acronym-Buchstabieren (XTTS → X T T S, USB → U S B, ueber expliziter Liste)
+- [x] Voice-Auswahl funktioniert wieder: speaker_wav als Basename statt Pfad fuer daswer123 local-Mode
+- [x] Diagnostic-Voice-Wechsel resettet alle App-lokalen Voice-Overrides via type "config"
+- [x] voice_preload/voice_ready: Stille Mini-Render bei Voice-Wechsel + Toast/Status "bereit"
+- [x] Whisper STT auf die Gamebox ausgelagert (faster-whisper CUDA, float16) — neuer aria-whisper-bridge Container
+- [x] aria-bridge: STT primaer remote (Gamebox), Fallback lokal nach 45s Timeout
+- [x] Whisper-Modell hot-swap auf Gamebox via config-Broadcast aus Diagnostic
+- [x] **F5-TTS ersetzt XTTS komplett** — neuer aria-f5tts-bridge Container, Voice Cloning, satzweises Streaming
+- [x] Voice-Upload mit Whisper-Auto-Transkription — User muss keinen Referenz-Text eintippen
+- [x] Audio-Pause statt Ducking: Spotify/YouTube pausieren komplett waehrend TTS (TRANSIENT statt MAY_DUCK)
+- [x] AudioFocus.release wartet auf echten Playback-Ende — kein Volume-Hochfahren mehr mid-Antwort
+- [x] VAD-Stille einstellbar in App-Settings (1.0-8.0s, Default 2.8s)
+- [x] MAX_RECORDING auf 120s — laengere Erklaerungen moeglich
+- [x] App: Audioausgabe hoert nicht mehr mitten im Satz auf (playbackHeadPosition wait + Stop-Race fix)
## Offen
-### Bugs (Prioritaet)
-- [ ] App: Audioausgabe hoert ab und zu einfach auf (mitten im Satz oder zwischen Chunks)
+### Bugs
- [ ] NO_REPLY wird als "NO" im Chat angezeigt — sollte still verworfen werden (Token nicht gesaeubert)
### App Features
- [ ] Wake Word on-device (Porcupine "ARIA" Keyword, Phase 2 — passives Lauschen)
- [ ] Chat-History zuverlaessiger laden (AsyncStorage Race Condition)
- [ ] Background Audio Service (TTS auch bei minimierter App)
-- [ ] Audio-Ducking: andere App-Audio-Ausgaben leiser stellen waehrend ARIA spricht (AudioFocus API)
-- [ ] Audio-Muten waehrend Aufnahme/Ohr-Modus: andere Audio stumm (wie WhatsApp-Sprachaufnahme)
-- [ ] Spracheingabe-Timeout erhoehen fuer laengere Texte
-- [ ] Generierte TTS-Audiodaten in der Chat-Nachricht einbetten (oder lokal cachen), Play-Button spielt aus Cache statt Regenerierung via XTTS. Base64 im Tag (invisible) oder lokaler Datei-Cache mit Referenz in der Message.
-- [ ] QR-Code Onboarding: Diagnostic generiert QR mit RVS-Credentials, App scannt — keine manuelle Eingabe mehr
### TTS / Audio
-- [ ] Audio-Normalisierung (Lautstaerke zwischen Chunks angleichen)
+- [ ] Audio-Normalisierung (Lautstaerke zwischen Saetzen/Chunks angleichen)
+- [ ] F5-TTS: Streaming-Inferenz testen (nativ statt satzweise) wenn ein passendes Backend kommt
+- [ ] F5-TTS: Optional Deepspeed-Beschleunigung pruefen
### Architektur
- [ ] Bilder: Claude Vision direkt nutzen (aktuell nur Dateipfad an ARIA)
- [ ] Auto-Compacting und Memory/Brain Verwaltung (SQLite?)
- [ ] Diagnostic: System-Info Tab (Container-Status, Disk, RAM, CPU)
- [ ] RVS Zombie-Connections endgueltig loesen
-- [ ] Alle .env-Variablen ueber Diagnostic konfigurierbar machen (kein File-Sync mehr noetig, da alle ARIA-Container auf der gleichen VM laufen). Fallback .env bleibt fuer initialen Bootstrap.
-- [ ] XTTS-Container: kleine Web-Oberflaeche fuer Credentials/Server-Config, oder zentral aus Diagnostic per RVS push
-- [ ] Root-Cause OpenClaw Session-Reset: Herausfinden warum Sessions beim ersten chat.send nach Container-Restart verworfen werden (abortedLastRun / systemSent Theorie pruefen, ggf. Flag preemptiv patchen)
+- [ ] Alle .env-Variablen ueber Diagnostic konfigurierbar machen (Fallback .env bleibt fuer initialen Bootstrap)
+- [ ] Gamebox: kleine Web-Oberflaeche fuer Credentials/Server-Config oder zentral aus Diagnostic per RVS push
+- [ ] Root-Cause OpenClaw Session-Reset: Herausfinden warum Sessions beim ersten chat.send nach Container-Restart verworfen werden