feat(vad): Stille-Pegel manuell in Settings + Info-Modal
Wenn die adaptive Baseline-Logik in einer Umgebung nicht zuverlaessig greift (Stefan: "manchmal funktioniert die Stille-Erkennung nicht"), kann der User die Schwelle jetzt manuell setzen. Settings → Spracheingabe: - "Stille-Pegel (dB)" mit −1/+1 Buttons + "Auf automatisch zuruecksetzen" - Range −55 bis −15 dB, default "auto" (= adaptive Baseline) - Info-Icon (i) oeffnet Modal mit Erklaerung: • dB-Skala (negativ, naeher 0 = lauter) • Faustregel-Pegel mit Farb-Code (−45 sensibel, −38 ausgewogen, −25 robust) • Klarstellung "niedrigere Zahl = sensibler" audio.ts: - VAD_SILENCE_DB_OVERRIDE_KEY in AsyncStorage - loadVadSilenceDbOverride() liefert null oder Zahl - startRecording: wenn Override gesetzt, Adaptive-Baseline uebersteuert. Speech-Schwelle wird auf Override + 10 dB gesetzt. Toast zeigt "VAD: manuell stille>-XX dB" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,29 @@ const VAD_SPEECH_OFFSET_DB = 12; // sicheres Speech = Baseline + 12dB
|
||||
const VAD_BASELINE_SAMPLES = 5; // 5 × 100ms = 500ms Baseline
|
||||
const VAD_SPEECH_MIN_MS = 500; // ms Sprache bevor Aufnahme zaehlt — laenger = keine Huestler/Klopfer mehr
|
||||
|
||||
// Override fuer die Stille-Schwelle — wenn gesetzt, wird die adaptive Baseline
|
||||
// ignoriert. Nuetzlich wenn die adaptive Logik in spezifischen Umgebungen
|
||||
// nicht zuverlaessig greift. Range -55..-15 dB. Speech-Schwelle wird auf
|
||||
// override+10 dB gesetzt (Speech muss klar lauter als Stille sein).
|
||||
export const VAD_SILENCE_DB_DEFAULT = -38; // wenn User Manuell-Modus waehlt
|
||||
export const VAD_SILENCE_DB_MIN = -55; // sehr empfindlich, fast jeder Pegel ist "Sprache"
|
||||
export const VAD_SILENCE_DB_MAX = -15; // sehr unempfindlich, nur lautes Reden gilt
|
||||
export const VAD_SILENCE_DB_OVERRIDE_KEY = 'aria_vad_silence_db_override';
|
||||
|
||||
/** Liefert den manuellen Override-Wert oder null wenn "automatisch". */
|
||||
export async function loadVadSilenceDbOverride(): Promise<number | null> {
|
||||
try {
|
||||
const raw = await AsyncStorage.getItem(VAD_SILENCE_DB_OVERRIDE_KEY);
|
||||
if (raw == null || raw === '') return null;
|
||||
const n = parseFloat(raw);
|
||||
if (!isFinite(n)) return null;
|
||||
if (n < VAD_SILENCE_DB_MIN || n > VAD_SILENCE_DB_MAX) return null;
|
||||
return n;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// VAD-Stille (in Sekunden) — wie lange Sprechpause toleriert wird, bevor
|
||||
// die Aufnahme automatisch beendet wird. Einstellbar in den App-Settings.
|
||||
export const VAD_SILENCE_DEFAULT_SEC = 2.8;
|
||||
@@ -443,11 +466,22 @@ class AudioService {
|
||||
this.speechDetected = false;
|
||||
this.speechStartTime = 0;
|
||||
// VAD-Adaptive zurueckgesetzt: Baseline wird in den ersten 500ms neu
|
||||
// gemessen. Bis dahin gelten die Fallback-Schwellen — die sind etwas
|
||||
// empfindlicher als die alten Werte (-38 statt -45 fuer Stille).
|
||||
// gemessen. Bis dahin gelten die Fallback-Schwellen.
|
||||
this.vadBaselineSamples = [];
|
||||
this.vadAdaptiveSilenceDb = VAD_SILENCE_FALLBACK_DB;
|
||||
this.vadAdaptiveSpeechDb = VAD_SPEECH_FALLBACK_DB;
|
||||
|
||||
// Manueller Override aus Settings — wenn gesetzt, wird die adaptive
|
||||
// Baseline-Messung uebersteuert. User-Wahl gewinnt vor Auto-Magic.
|
||||
const dbOverride = await loadVadSilenceDbOverride();
|
||||
if (dbOverride != null) {
|
||||
this.vadAdaptiveSilenceDb = dbOverride;
|
||||
this.vadAdaptiveSpeechDb = dbOverride + 10; // Speech klar ueber Stille
|
||||
this.vadBaselineSamples = new Array(VAD_BASELINE_SAMPLES).fill(0); // Baseline-Sammeln deaktivieren
|
||||
const msg = `VAD: manuell stille>${dbOverride}dB`;
|
||||
console.log('[Audio] %s', msg);
|
||||
try { ToastAndroid.show(msg, ToastAndroid.SHORT); } catch {}
|
||||
}
|
||||
this.setState('recording');
|
||||
|
||||
// Andere Apps waehrend der Aufnahme pausieren (Musik, Videos etc.)
|
||||
|
||||
Reference in New Issue
Block a user