feat(wake): schnellere/empfindlichere Wake-Word-Defaults (E1)
Gegen 'traege': patience 2->1, STARTUP_SUPPRESSION_MS 1500->600, Foreground-Cooldown 3000->1000, Resume-Cooldown 1500->500, Threshold-Default 0.6->0.45. Fehlausloeser faengt die Speaker-ID (E3) ab. Wort bleibt 'computer'. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -59,7 +59,7 @@ class OpenWakeWordModule(reactContext: ReactApplicationContext) : ReactContextBa
|
|||||||
// Trigger eingestuft werden kann. Folge: App pausiert beim Oeffnen die Musik,
|
// Trigger eingestuft werden kann. Folge: App pausiert beim Oeffnen die Musik,
|
||||||
// weil der False-Positive die AudioFocus-Switch-Logik anwirft (Stefan-Bug 06/2026).
|
// weil der False-Positive die AudioFocus-Switch-Logik anwirft (Stefan-Bug 06/2026).
|
||||||
// Loesung: in dieser Phase keine Detections an JS weiterleiten.
|
// 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()
|
private val env: OrtEnvironment = OrtEnvironment.getEnvironment()
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ export async function savePassiveListenMs(ms: number): Promise<void> {
|
|||||||
export const WAKE_KEYWORD_STORAGE = 'aria_wake_keyword';
|
export const WAKE_KEYWORD_STORAGE = 'aria_wake_keyword';
|
||||||
|
|
||||||
// Wake-Word-Empfindlichkeit (openWakeWord-Threshold). Hoeher = strenger =
|
// Wake-Word-Empfindlichkeit (openWakeWord-Threshold). Hoeher = strenger =
|
||||||
// weniger Fehlauslösung (z.B. durch Musik/Radio ueber die Auto-Lautsprecher,
|
// weniger Fehlauslösung, aber man muss deutlicher/lauter sprechen (fuehlt sich
|
||||||
// die das Mikro mithoert — der App-Echo-Canceler kann nur ARIAs eigenes TTS
|
// "traege" an). Fehlausloeser werden ueber Speaker-ID (E3) ohnehin verworfen,
|
||||||
// rausrechnen, NICHT Spotify). Default 0.6 (war 0.5). 0..1.
|
// deshalb darf der Default empfindlicher sein. 0.45 (war 0.6/0.5). 0..1.
|
||||||
export const WAKE_THRESHOLD_DEFAULT = 0.6;
|
export const WAKE_THRESHOLD_DEFAULT = 0.45;
|
||||||
export const WAKE_THRESHOLD_MIN = 0.3;
|
export const WAKE_THRESHOLD_MIN = 0.3;
|
||||||
export const WAKE_THRESHOLD_MAX = 0.9;
|
export const WAKE_THRESHOLD_MAX = 0.9;
|
||||||
export const WAKE_THRESHOLD_STORAGE_KEY = 'aria_wake_threshold';
|
export const WAKE_THRESHOLD_STORAGE_KEY = 'aria_wake_threshold';
|
||||||
@@ -103,7 +103,9 @@ export const KEYWORD_LABELS: Record<WakeKeyword, string> = {
|
|||||||
// Detection-Tuning. Threshold ist ueber die Settings konfigurierbar
|
// Detection-Tuning. Threshold ist ueber die Settings konfigurierbar
|
||||||
// (loadWakeThreshold) — der Wert hier ist nur der Fallback.
|
// (loadWakeThreshold) — der Wert hier ist nur der Fallback.
|
||||||
const DEFAULT_THRESHOLD = WAKE_THRESHOLD_DEFAULT;
|
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;
|
const DEFAULT_DEBOUNCE_MS = 1500;
|
||||||
|
|
||||||
interface OpenWakeWordModule {
|
interface OpenWakeWordModule {
|
||||||
@@ -310,7 +312,7 @@ class WakeWordService {
|
|||||||
/** Cooldown setzen — alle Wake-Word-Detections in den naechsten ms ignorieren.
|
/** Cooldown setzen — alle Wake-Word-Detections in den naechsten ms ignorieren.
|
||||||
* Wird beim App-Resume gerufen weil AppState-Wechsel Audio-Spikes erzeugen
|
* Wird beim App-Resume gerufen weil AppState-Wechsel Audio-Spikes erzeugen
|
||||||
* die openWakeWord faelschlich als Trigger interpretiert. */
|
* die openWakeWord faelschlich als Trigger interpretiert. */
|
||||||
setResumeCooldown(ms: number = 1500): void {
|
setResumeCooldown(ms: number = 500): void {
|
||||||
this.cooldownUntilMs = Date.now() + ms;
|
this.cooldownUntilMs = Date.now() + ms;
|
||||||
console.log('[WakeWord] Cooldown aktiv fuer %dms', ms);
|
console.log('[WakeWord] Cooldown aktiv fuer %dms', ms);
|
||||||
}
|
}
|
||||||
@@ -323,13 +325,14 @@ class WakeWordService {
|
|||||||
console.log('[WakeWord] App im Hintergrund — Detections gesperrt');
|
console.log('[WakeWord] App im Hintergrund — Detections gesperrt');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** App im Vordergrund: Detections wieder freigeben, plus 3s Cooldown
|
/** App im Vordergrund: Detections wieder freigeben, plus kurzer Cooldown
|
||||||
* als Schutz gegen den AudioFocus-/AudioTrack-Spike der direkt nach
|
* als Schutz gegen den AudioFocus-/AudioTrack-Spike direkt nach dem Resume.
|
||||||
* dem Resume kommt. Ersetzt das alte setResumeCooldown(3000)-Pattern. */
|
* 1s statt 3s — 3s hat sich "traege" angefuehlt (Trigger direkt nach dem
|
||||||
|
* App-Oeffnen wurden verschluckt). */
|
||||||
setForeground(): void {
|
setForeground(): void {
|
||||||
this.inBackground = false;
|
this.inBackground = false;
|
||||||
this.cooldownUntilMs = Date.now() + 3000;
|
this.cooldownUntilMs = Date.now() + 1000;
|
||||||
console.log('[WakeWord] App im Vordergrund — Cooldown 3s aktiv');
|
console.log('[WakeWord] App im Vordergrund — Cooldown 1s aktiv');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Wake-Word getriggert: Native-Modul pausieren, Konversation starten. */
|
/** Wake-Word getriggert: Native-Modul pausieren, Konversation starten. */
|
||||||
|
|||||||
Reference in New Issue
Block a user