diff --git a/android/android/app/src/main/java/com/ariacockpit/OpenWakeWordModule.kt b/android/android/app/src/main/java/com/ariacockpit/OpenWakeWordModule.kt index 5919df2..0fab6fd 100644 --- a/android/android/app/src/main/java/com/ariacockpit/OpenWakeWordModule.kt +++ b/android/android/app/src/main/java/com/ariacockpit/OpenWakeWordModule.kt @@ -59,7 +59,7 @@ class OpenWakeWordModule(reactContext: ReactApplicationContext) : ReactContextBa // Trigger eingestuft werden kann. Folge: App pausiert beim Oeffnen die Musik, // weil der False-Positive die AudioFocus-Switch-Logik anwirft (Stefan-Bug 06/2026). // Loesung: in dieser Phase keine Detections an JS weiterleiten. - private const val STARTUP_SUPPRESSION_MS = 1500L + private const val STARTUP_SUPPRESSION_MS = 600L } private val env: OrtEnvironment = OrtEnvironment.getEnvironment() diff --git a/android/src/services/wakeword.ts b/android/src/services/wakeword.ts index 1e3cee5..b3071bd 100644 --- a/android/src/services/wakeword.ts +++ b/android/src/services/wakeword.ts @@ -54,10 +54,10 @@ export async function savePassiveListenMs(ms: number): Promise { export const WAKE_KEYWORD_STORAGE = 'aria_wake_keyword'; // Wake-Word-Empfindlichkeit (openWakeWord-Threshold). Hoeher = strenger = -// weniger Fehlauslösung (z.B. durch Musik/Radio ueber die Auto-Lautsprecher, -// die das Mikro mithoert — der App-Echo-Canceler kann nur ARIAs eigenes TTS -// rausrechnen, NICHT Spotify). Default 0.6 (war 0.5). 0..1. -export const WAKE_THRESHOLD_DEFAULT = 0.6; +// weniger Fehlauslösung, aber man muss deutlicher/lauter sprechen (fuehlt sich +// "traege" an). Fehlausloeser werden ueber Speaker-ID (E3) ohnehin verworfen, +// deshalb darf der Default empfindlicher sein. 0.45 (war 0.6/0.5). 0..1. +export const WAKE_THRESHOLD_DEFAULT = 0.45; export const WAKE_THRESHOLD_MIN = 0.3; export const WAKE_THRESHOLD_MAX = 0.9; export const WAKE_THRESHOLD_STORAGE_KEY = 'aria_wake_threshold'; @@ -103,7 +103,9 @@ export const KEYWORD_LABELS: Record = { // Detection-Tuning. Threshold ist ueber die Settings konfigurierbar // (loadWakeThreshold) — der Wert hier ist nur der Fallback. const DEFAULT_THRESHOLD = WAKE_THRESHOLD_DEFAULT; -const DEFAULT_PATIENCE = 2; +// patience=1 statt 2: nur EIN Frame ueber Threshold noetig → deutlich schneller. +// Speaker-ID filtert Fehlausloeser, also ist das vertretbar. +const DEFAULT_PATIENCE = 1; const DEFAULT_DEBOUNCE_MS = 1500; interface OpenWakeWordModule { @@ -310,7 +312,7 @@ class WakeWordService { /** Cooldown setzen — alle Wake-Word-Detections in den naechsten ms ignorieren. * Wird beim App-Resume gerufen weil AppState-Wechsel Audio-Spikes erzeugen * die openWakeWord faelschlich als Trigger interpretiert. */ - setResumeCooldown(ms: number = 1500): void { + setResumeCooldown(ms: number = 500): void { this.cooldownUntilMs = Date.now() + ms; console.log('[WakeWord] Cooldown aktiv fuer %dms', ms); } @@ -323,13 +325,14 @@ class WakeWordService { console.log('[WakeWord] App im Hintergrund — Detections gesperrt'); } - /** App im Vordergrund: Detections wieder freigeben, plus 3s Cooldown - * als Schutz gegen den AudioFocus-/AudioTrack-Spike der direkt nach - * dem Resume kommt. Ersetzt das alte setResumeCooldown(3000)-Pattern. */ + /** App im Vordergrund: Detections wieder freigeben, plus kurzer Cooldown + * als Schutz gegen den AudioFocus-/AudioTrack-Spike direkt nach dem Resume. + * 1s statt 3s — 3s hat sich "traege" angefuehlt (Trigger direkt nach dem + * App-Oeffnen wurden verschluckt). */ setForeground(): void { this.inBackground = false; - this.cooldownUntilMs = Date.now() + 3000; - console.log('[WakeWord] App im Vordergrund — Cooldown 3s aktiv'); + this.cooldownUntilMs = Date.now() + 1000; + console.log('[WakeWord] App im Vordergrund — Cooldown 1s aktiv'); } /** Wake-Word getriggert: Native-Modul pausieren, Konversation starten. */