From 75675ed3aa06fb804e3ff711de3fe10b235b2158 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 15 Aug 2026 10:48:01 +0200 Subject: [PATCH] fix(settings): 'Stille-Toleranz' steuert aktiven Endpoint, dB-Regler raus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der sichtbare 'Stille-Toleranz'-Regler verstellte den toten Legacy-dB-VAD-Pfad; jetzt steuert er STT_ENDPOINT_MS (die echte Streaming-Pausen-Toleranz, 1-4s). Der obsolete 'Stille-Pegel (dB)'-Regler ist entfernt — der aktive STT nutzt adaptiven Rausch-Boden, Rauschen-als-Wort verhindert der no_speech_prob-Filter des Modells. Co-Authored-By: Claude Opus 4.8 --- android/src/screens/SettingsScreen.tsx | 91 +++++++++----------------- 1 file changed, 30 insertions(+), 61 deletions(-) diff --git a/android/src/screens/SettingsScreen.tsx b/android/src/screens/SettingsScreen.tsx index 55bb56d..04813bc 100644 --- a/android/src/screens/SettingsScreen.tsx +++ b/android/src/screens/SettingsScreen.tsx @@ -67,6 +67,10 @@ import { CONV_WINDOW_MIN_SEC, CONV_WINDOW_MAX_SEC, CONV_WINDOW_STORAGE_KEY, + STT_ENDPOINT_DEFAULT_MS, + STT_ENDPOINT_MIN_MS, + STT_ENDPOINT_MAX_MS, + STT_ENDPOINT_STORAGE_KEY, MAX_RECORDING_DEFAULT_SEC, MAX_RECORDING_MIN_SEC, MAX_RECORDING_MAX_SEC, @@ -195,6 +199,9 @@ const SettingsScreen: React.FC = () => { const [ttsEnabled, setTtsEnabled] = useState(true); const [ttsPrerollSec, setTtsPrerollSec] = useState(TTS_PREROLL_DEFAULT_SEC); const [vadSilenceSec, setVadSilenceSec] = useState(VAD_SILENCE_DEFAULT_SEC); + // Aktive Streaming-Pausen-Toleranz (STT_ENDPOINT) — der "Stille-Toleranz"-Regler + // steuert jetzt DIESEN Wert (der alte vadSilenceSec war der tote Legacy-dB-Pfad). + const [sttEndpointSec, setSttEndpointSec] = useState(STT_ENDPOINT_DEFAULT_MS / 1000); const [convWindowSec, setConvWindowSec] = useState(CONV_WINDOW_DEFAULT_SEC); const [maxRecordingSec, setMaxRecordingSec] = useState(MAX_RECORDING_DEFAULT_SEC); // null = automatisch (adaptive Baseline), sonst manueller dB-Override @@ -306,6 +313,14 @@ const SettingsScreen: React.FC = () => { } } }); + AsyncStorage.getItem(STT_ENDPOINT_STORAGE_KEY).then(saved => { + if (saved != null) { + const n = parseInt(saved, 10); + if (isFinite(n) && n >= STT_ENDPOINT_MIN_MS && n <= STT_ENDPOINT_MAX_MS) { + setSttEndpointSec(n / 1000); + } + } + }); AsyncStorage.getItem(MAX_RECORDING_STORAGE_KEY).then(saved => { if (saved != null) { const n = parseFloat(saved); @@ -1655,30 +1670,30 @@ const SettingsScreen: React.FC = () => { Wie lange du eine Sprechpause machen darfst, bevor die Aufnahme automatisch beendet und gesendet wird. Hoeher = mehr Zeit zum - Nachdenken; niedriger = schnelleres Senden. - Default: {VAD_SILENCE_DEFAULT_SEC.toFixed(1)}s. + Nachdenken (z.B. im Auto); niedriger = schnelleres Senden. + Default: {(STT_ENDPOINT_DEFAULT_MS / 1000).toFixed(1)}s. { - const next = Math.max(VAD_SILENCE_MIN_SEC, Math.round((vadSilenceSec - 0.5) * 10) / 10); - setVadSilenceSec(next); - AsyncStorage.setItem(VAD_SILENCE_STORAGE_KEY, String(next)); + const next = Math.max(STT_ENDPOINT_MIN_MS / 1000, Math.round((sttEndpointSec - 0.5) * 10) / 10); + setSttEndpointSec(next); + AsyncStorage.setItem(STT_ENDPOINT_STORAGE_KEY, String(Math.round(next * 1000))); }} - disabled={vadSilenceSec <= VAD_SILENCE_MIN_SEC} + disabled={sttEndpointSec <= STT_ENDPOINT_MIN_MS / 1000} > −0.5 - {vadSilenceSec.toFixed(1)} s + {sttEndpointSec.toFixed(1)} s { - const next = Math.min(VAD_SILENCE_MAX_SEC, Math.round((vadSilenceSec + 0.5) * 10) / 10); - setVadSilenceSec(next); - AsyncStorage.setItem(VAD_SILENCE_STORAGE_KEY, String(next)); + const next = Math.min(STT_ENDPOINT_MAX_MS / 1000, Math.round((sttEndpointSec + 0.5) * 10) / 10); + setSttEndpointSec(next); + AsyncStorage.setItem(STT_ENDPOINT_STORAGE_KEY, String(Math.round(next * 1000))); }} - disabled={vadSilenceSec >= VAD_SILENCE_MAX_SEC} + disabled={sttEndpointSec >= STT_ENDPOINT_MAX_MS / 1000} > +0.5 @@ -1749,56 +1764,10 @@ const SettingsScreen: React.FC = () => { - - Stille-Pegel (dB) - setShowVadInfo(true)} style={styles.infoBtn}> - i - - - - Welcher Mikro-Pegel als "Stille" gilt. Standard: automatisch (Baseline aus - den ersten 500ms). Manuell setzen wenn Auto nicht zuverlaessig greift. - - - { - const next = vadSilenceDb == null - ? VAD_SILENCE_DB_DEFAULT - 1 - : Math.max(VAD_SILENCE_DB_MIN, vadSilenceDb - 1); - setVadSilenceDb(next); - AsyncStorage.setItem(VAD_SILENCE_DB_OVERRIDE_KEY, String(next)); - }} - > - −1 - - - {vadSilenceDb == null ? 'auto' : `${vadSilenceDb} dB`} - - { - const next = vadSilenceDb == null - ? VAD_SILENCE_DB_DEFAULT + 1 - : Math.min(VAD_SILENCE_DB_MAX, vadSilenceDb + 1); - setVadSilenceDb(next); - AsyncStorage.setItem(VAD_SILENCE_DB_OVERRIDE_KEY, String(next)); - }} - > - +1 - - - {vadSilenceDb != null && ( - { - setVadSilenceDb(null); - AsyncStorage.removeItem(VAD_SILENCE_DB_OVERRIDE_KEY); - }} - style={{alignSelf: 'center', marginTop: 8, paddingVertical: 6, paddingHorizontal: 12}} - > - ↻ Auf automatisch zuruecksetzen - - )} + {/* "Stille-Pegel (dB)"-Regler entfernt: der aktive Streaming-STT nutzt + einen adaptiven Rausch-Boden (automatisch), ein manueller dB-Wert war + wirkungslos. Rauschen-als-Wort verhindert das STT-Modell selbst + (no_speech_prob-Filter), nicht die dB-Schwelle. */}