Files
ARIA-AGENT/issue.md
T
duffyduck ead28cf09a feat(audio): Foreground-Service haelt TTS am Leben bei minimierter App
ARIAs Antwort wird jetzt auch dann fertig vorgelesen wenn der User die
App im Hintergrund schickt. Vorher hat Android den Prozess kurz nach
dem Minimieren eingefroren — TTS verstummte mitten im Satz.

Native:
- AriaPlaybackService.kt: Service mit foregroundServiceType=mediaPlayback,
  zeigt persistente Notification "ARIA spricht — antippen oeffnet die App"
  (channel low-priority, ongoing, tap → MainActivity)
- BackgroundAudioModule.kt: RN-Bridge mit start()/stop()
- AndroidManifest: FOREGROUND_SERVICE + FOREGROUND_SERVICE_MEDIA_PLAYBACK
  + POST_NOTIFICATIONS Permissions, Service deklariert

JS:
- backgroundAudio.ts: idempotenter Wrapper (active-Flag verhindert
  doppelte start/stop calls)
- ChatScreen onPlaybackStarted → startBackgroundAudio
- ChatScreen onPlaybackFinished → stopBackgroundAudio
- audio.ts stopPlayback ruft auch stopBackgroundAudio damit die
  Notification bei Cancel/Barge-In/Anruf nicht haengen bleibt

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:37:46 +02:00

12 KiB

ARIA Issues & Features

Erledigt

  • Bildupload funktioniert (Shared Volume /shared/uploads/)
  • Sprachnachrichten werden als Text angezeigt (STT → Chat-Bubble)
  • Cache leeren + Auto-Download von Anhaengen
  • ARIA liest Nachrichten vor (TTS via Piper, später ersetzt)
  • Autoscroll zur letzten Nachricht (inverted FlatList)
  • Bilder im Chat groesser + Vollbild-Vorschau
  • Ohr-Button → Gespraechsmodus (Auto-Aufnahme nach ARIA-Antwort)
  • Play-Button in ARIA-Nachrichten fuer Sprachwiedergabe
  • Chat-Suche in der App (Lupe in Statusleiste)
  • Watchdog mit Container-Restart (2min Warnung → 5min doctor --fix → 8min Restart)
  • Abbrechen-Button im Diagnostic Chat
  • Nachrichten Backup on-the-fly (/shared/config/chat_backup.jsonl)
  • Grosse Nachrichten satzweise aufteilen fuer TTS
  • RVS Nachrichten vom Smartphone gehen durch
  • Stimmen-Einstellungen (Ramona/Thorsten, Speed pro Stimme — durch XTTS/F5-TTS ersetzt)
  • Highlight-Trigger konfigurierbar in Diagnostic
  • XTTS v2 Integration (Gaming-PC, GPU, Voice Cloning) — durch F5-TTS ersetzt
  • XTTS Voice Cloning (Audio-Samples hochladen, eigene Stimme)
  • TTS Engine waehlbar (Piper/XTTS) — Piper raus, XTTS raus, jetzt nur F5-TTS
  • Auto-Update System (APK via RVS WebSocket)
  • Auto-Update: APK-Installation via FileProvider
  • Auto-Update: "Auf Updates pruefen" Button in App-Einstellungen
  • Audio-Queue (sequentielle Wiedergabe, kein Ueberlappen)
  • Textnachrichten werden von ARIA beantwortet (Bridge chat handler fix)
  • Mehrere Anhaenge + Text vor dem Senden (Pending-Vorschau)
  • Paste-Support fuer Bilder in Diagnostic Chat
  • Markdown-Bereinigung fuer TTS (fett, kursiv, code, links, etc.)
  • SSH Volume read-write fuer Proxy (kein -F Workaround mehr)
  • Diagnostic: Sessions als Markdown exportieren (Download-Button)
  • Speech Gate: Aufnahme wird verworfen wenn keine Sprache erkannt
  • Session-Persistenz: Gewaehlte Session bleibt ueber Container-Restarts erhalten
  • Diagnostic: "ARIA denkt..." bleibt nicht mehr stehen
  • App: "ARIA denkt..." Indicator + Abbrechen-Button (Bridge spiegelt agent_activity via RVS)
  • Whisper STT: Model-Auswahl in Diagnostic (tiny/base/small/medium/large-v3), Hot-Reload
  • App: Audio-Aufnahme explizit 16kHz mono (spart Resample, optimal fuer Whisper)
  • Streaming TTS: PCM-Stream → AudioTrack MODE_STREAM, keine WAV-Gaps
  • Piper komplett entfernt
  • Gespraechsmodus: Speech-Gate strenger (-28dB / 500ms)
  • Diagnostic: Archivierte Session-Versionen (.reset.*) angezeigt + exportierbar
  • tools/export-jsonl-to-md.js: CLI-Konverter fuer Session-JSONL zu Markdown
  • NO_REPLY-Filter in Bridge + Diagnostic
  • Audio-Ducking + Exklusiv-Focus (Kotlin AudioFocusModule)
  • TTS-Cleanup serverseitig: Code-Bloecke raus, Einheiten ausgeschrieben, Abkuerzungen buchstabiert, URLs zu "ein Link"
  • QR-Code Onboarding: Diagnostic generiert QR, App scannt
  • TTS-Audio-Cache im Filesystem: WAV pro messageId, Play-Button spielt aus Cache
  • Config via Diagnostic: RVS-Credentials + Auth-Token persistiert in /shared/config/runtime.json
  • Disk-Voll Banner in Diagnostic: rotes Overlay + copy-baren Cleanup-Befehlen (safe + aggressiv)
  • cleanup.sh: kombinierter Docker-Aufraeum-Befehl (safe / --full)
  • Streaming TTS Pre-Roll: AudioTrack play() startet erst wenn 2.5s gepuffert sind
  • Streaming TTS Stop-Race: Writer wartet auf playbackHeadPosition vor stop()/release() — keine abgeschnittenen Saetze mehr
  • Leading-Silence (200ms) am Stream-Anfang — AudioTrack faehrt sauber an
  • Pre-Roll-Buffer einstellbar in App-Settings (1.0-6.0s, Default 3.5s)
  • Fade-In auf erstem PCM-Chunk (120ms) — versteckt XTTS/F5-TTS Warmup-Glitches
  • Decimal-zu-Worte fuer TTS (0.1 → null komma eins, mit IP-Schutz-Lookahead)
  • Generic Acronym-Buchstabieren (XTTS → X T T S, USB → U S B, ueber expliziter Liste)
  • Voice-Auswahl funktioniert wieder: speaker_wav als Basename statt Pfad fuer daswer123 local-Mode
  • Diagnostic-Voice-Wechsel resettet alle App-lokalen Voice-Overrides via type "config"
  • voice_preload/voice_ready: Stille Mini-Render bei Voice-Wechsel + Toast/Status "bereit"
  • Whisper STT auf die Gamebox ausgelagert (faster-whisper CUDA, float16) — neuer aria-whisper-bridge Container
  • aria-bridge: STT primaer remote (Gamebox), Fallback lokal nach 45s Timeout
  • Whisper-Modell hot-swap auf Gamebox via config-Broadcast aus Diagnostic
  • F5-TTS ersetzt XTTS komplett — neuer aria-f5tts-bridge Container, Voice Cloning, satzweises Streaming
  • Voice-Upload mit Whisper-Auto-Transkription — User muss keinen Referenz-Text eintippen
  • Audio-Pause statt Ducking: Spotify/YouTube pausieren komplett waehrend TTS (TRANSIENT statt MAY_DUCK)
  • AudioFocus.release wartet auf echten Playback-Ende — kein Volume-Hochfahren mehr mid-Antwort
  • VAD-Stille einstellbar in App-Settings (1.0-8.0s, Default 2.8s)
  • MAX_RECORDING auf 120s — laengere Erklaerungen moeglich
  • App: Audioausgabe hoert nicht mehr mitten im Satz auf (playbackHeadPosition wait + Stop-Race fix)
  • F5-TTS: Referenz-WAV-Preprocessing — Loudness-Normalisierung -16 LUFS + Silence-Trim + 10s Clip fuer konsistente Cloning-Quali
  • F5-TTS: deutsches Fine-Tune (aihpi/F5-TTS-German, Vocos-Variante) via hf:// Pfad in Diagnostic konfigurierbar
  • Whisper transkribiert Voice-Uploads nicht mehr mit hardcoded "small" — aktuelles Modell wird behalten, kein unnoetiger Modell-Swap
  • RVS/WebSocket maxPayload 50MB: voice_upload mit WAV als base64 sprengt kein Frame-Limit mehr
  • Dynamischer STT-Timeout in aria-bridge: 300s waehrend whisper-bridge 'loading', 45s wenn 'ready'
  • service_status Broadcasts: f5tts/whisper melden Lade-Status, Banner in Diagnostic (unten rechts) + App (oben)
  • config_request Pattern: Bridges fragen beim Connect die aktuelle Voice-Config an, aria-bridge antwortet
  • F5-TTS Tuning via Diagnostic (Modell-ID, Checkpoint, cfg_strength, nfe_step) statt ENV-Vars — Hot-Reload bei Modell-Wechsel
  • Conversation-Window: Gespraechsmodus endet nach X Sekunden Stille (1.0-20.0s, Default 8s, einstellbar in Settings)
  • Porcupine Wake-Word-Integration in der App (Built-In Keywords + Custom spaeter, per Geraet einstellbar)
  • HF-Cache als Bind-Mount statt Docker Volume — kein .vhdx-Bloat auf Docker Desktop / Windows
  • cleanup-windows.ps1 / .bat: VHDX-Cleanup via diskpart (ohne Hyper-V) mit Self-Elevation
  • App Mute-/Auto-Playback-Bug: Closure-Bug geloest (ttsCanPlayRef live-gespiegelt, nicht mehr stale)
  • App Zombie-Recording: Ohr-aus kill laufende Aufnahme damit der Aufnahme-Button weiter funktioniert
  • App Text-Rendering: Nachrichten selektierbar + Autolink fuer URLs/E-Mails/Telefonnummern (Browser/Mail/Dialer)
  • TTS-Wiedergabegeschwindigkeit pro Geraet einstellbar (Settings → 0.5-2.0x in 0.1-Schritten, Default 1.0)
  • Diagnostic: Voice-Preview-Modal (Play-Icon vor Delete-X, Textfeld mit Default, WAV im Browser abspielen)
  • Wake-Word komplett on-device via openWakeWord (ONNX Runtime) — Porcupine raus, kein API-Key/keine Lizenzgebuehren mehr. Mitgelieferte Keywords: hey_jarvis, computer, alexa, hey_mycroft, hey_rhasspy
  • Wake-Word Embedding rank-4 Fix (Pipeline-Bug der das Triggern verhinderte) + Frame-Count aus Modell-Metadaten lesen
  • APK ABI-Split auf arm64-v8a — von ~136 MB auf ~35 MB, Auto-Update-Downloads aufs Phone deutlich kleiner
  • PCM-Underrun-Schutz: Stille-Fill in Render-Pausen verhindert Spotify-Auto-Resume nach 10s Stillstand
  • Conversation-Focus-Lifecycle: AudioFocus haengt am Wake-Word-State 'conversing' statt an einzelnen Streams — Spotify bleibt durchgehend gepaust, auch zwischen mehreren Antworten
  • PhoneStateListener: TTS pausiert bei eingehendem Anruf (READ_PHONE_STATE Permission)
  • Voice-Override behaelt Stimme ueber alle TTS-Calls einer Antwort (vorher: nach erstem TTS-Call zurueck auf Default)
  • Sprachnachricht-Bubble defensiv: STT-Result fuegt neue Bubble hinzu wenn Placeholder fehlt (Race-Schutz)
  • Bild + Text als EINE Anfrage: Bridge buffert files 800ms, merged mit folgendem chat-Text zu einem send_to_core (statt zwei getrennten ARIA-Antworten)
  • Diagnostic-Chat: bubblige Formatierung, mehrzeiliges Eingabefeld (textarea, Enter sendet, Shift+Enter neue Zeile)
  • Diagnostic→App: persistente RVS-Connection statt frische pro Send (Race-Probleme mit Zombie-WS geloest)
  • Adaptive VAD-Schwelle: Baseline aus den ersten 500ms Mic-Pegel, Stille = baseline+6dB / Sprache = baseline+12dB. Funktioniert in lauten wie leisen Umgebungen
  • Max-Aufnahmedauer konfigurierbar in Settings (1-30 min, Default 5 min) — laengere Diktate moeglich
  • Barge-In: User kann ARIA waehrend Antwort/Tool-Use unterbrechen, alte Aktivitaet wird abgebrochen, Bridge gibt aria-core einen Kontext-Hint dass es eine Korrektur ist
  • Push-to-Talk raus, nur noch Tap-to-Talk (verhinderte Touch-Race-Probleme)
  • Settings-Sub-Screens: 8 Kategorien (Verbindung, Allgemein, Spracheingabe, Wake-Word, Sprachausgabe, Speicher, Protokoll, Ueber) statt langer Liste
  • Textauswahl in Bubbles wieder funktional (nested Text+onPress raus, dataDetectorType="all" macht Links automatisch klickbar)
  • Placeholder-Race bei parallelen Sprachnachrichten geloest: jede Aufnahme bekommt eine eindeutige audioRequestId, Bridge gibt sie ans STT-Result zurueck — App matcht jetzt punktgenau die richtige Bubble statt per Substring "Spracheingabe wird verarbeitet"
  • Mikro-Offen-Toast "🎤 sprich jetzt" erscheint erst wenn audioService.startRecording wirklich erfolgreich war (statt ~400ms vorher beim Wake-Word-Detect)
  • Bereit-Sound (Airplane Ding-Dong) wenn Mikro nach Wake-Word offen — akustische Bestaetigung statt nur Toast. Toggle in Settings → Wake-Word, default aktiv
  • Wake-Word parallel zu TTS mit AcousticEchoCanceler: User sagt "Computer" waehrend ARIA spricht → TTS verstummt sofort, neue Aufnahme startet. Native AEC verhindert dass ARIAs eigene Stimme das Wake-Word triggert. Audio-Source ist VOICE_COMMUNICATION + zusaetzlich AEC/NS/AGC-Effekte aktiviert
  • GPS-Position mitsenden: Toggle in Settings → Allgemein → Standort, persistiert in AsyncStorage, ChatScreen pollt den Wert. Wenn aktiv wird lat/lon mit jeder chat/audio-Message mitgegeben. Bridge prefixed den Text fuer aria-core mit GPS-Hint (mit Anweisung dass die Position nur bei Bedarf erwaehnt wird, nicht automatisch). Im App-Chat sieht man die Position nicht, nur ARIAs Antwort kann darauf eingehen
  • Background Audio Service: TTS laeuft auch bei minimierter App weiter. Foreground-Service mit foregroundServiceType=mediaPlayback haelt den Prozess am Leben, persistente Notification "ARIA spricht — antippen oeffnet die App". Service startet bei TTS-Beginn, stoppt bei Ende oder Cancel/Barge-In/Anruf
  • Manueller Mikro-Stop beendet Wake-Word-Konversation: Tap auf Mikro-Knopf waehrend conversing → audio raus + zurueck zu armed (= Wake-Word lauscht wieder, kein Auto-Mikro nach ARIAs Antwort). VAD-Auto-Stop bleibt bei Multi-Turn
  • Sprachnachrichten ohne STT-Result werden nach 60s+Aufnahmedauer automatisch entfernt (sicher genug fuer 5-30min-Aufnahmen, schnell genug fuer leere Wake-Word-Echos)
  • VAD adaptive Baseline robuster: minimum statt avg + Cap auf -50dB bis -28dB (Stille) / -40dB bis -18dB (Speech) — keine "tote" VAD-Konfiguration mehr bei lauter Umgebung oder Wake-Word-Echo

Offen

Bugs

App Features

  • Chat-History zuverlaessiger laden (AsyncStorage Race Condition)
  • Custom-Wake-Word-Upload via Diagnostic (eigene .onnx-Files ohne App-Rebuild)
  • Pause+Resume bei Anruf: aktuell wird der TTS-Stream bei Klingeln hart gestoppt, schoener waere Pause + Resume nach Auflegen

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 (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