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