fix(settings): 'Stille-Toleranz' steuert aktiven Endpoint, dB-Regler raus
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 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,10 @@ import {
|
|||||||
CONV_WINDOW_MIN_SEC,
|
CONV_WINDOW_MIN_SEC,
|
||||||
CONV_WINDOW_MAX_SEC,
|
CONV_WINDOW_MAX_SEC,
|
||||||
CONV_WINDOW_STORAGE_KEY,
|
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_DEFAULT_SEC,
|
||||||
MAX_RECORDING_MIN_SEC,
|
MAX_RECORDING_MIN_SEC,
|
||||||
MAX_RECORDING_MAX_SEC,
|
MAX_RECORDING_MAX_SEC,
|
||||||
@@ -195,6 +199,9 @@ const SettingsScreen: React.FC = () => {
|
|||||||
const [ttsEnabled, setTtsEnabled] = useState(true);
|
const [ttsEnabled, setTtsEnabled] = useState(true);
|
||||||
const [ttsPrerollSec, setTtsPrerollSec] = useState<number>(TTS_PREROLL_DEFAULT_SEC);
|
const [ttsPrerollSec, setTtsPrerollSec] = useState<number>(TTS_PREROLL_DEFAULT_SEC);
|
||||||
const [vadSilenceSec, setVadSilenceSec] = useState<number>(VAD_SILENCE_DEFAULT_SEC);
|
const [vadSilenceSec, setVadSilenceSec] = useState<number>(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<number>(STT_ENDPOINT_DEFAULT_MS / 1000);
|
||||||
const [convWindowSec, setConvWindowSec] = useState<number>(CONV_WINDOW_DEFAULT_SEC);
|
const [convWindowSec, setConvWindowSec] = useState<number>(CONV_WINDOW_DEFAULT_SEC);
|
||||||
const [maxRecordingSec, setMaxRecordingSec] = useState<number>(MAX_RECORDING_DEFAULT_SEC);
|
const [maxRecordingSec, setMaxRecordingSec] = useState<number>(MAX_RECORDING_DEFAULT_SEC);
|
||||||
// null = automatisch (adaptive Baseline), sonst manueller dB-Override
|
// 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 => {
|
AsyncStorage.getItem(MAX_RECORDING_STORAGE_KEY).then(saved => {
|
||||||
if (saved != null) {
|
if (saved != null) {
|
||||||
const n = parseFloat(saved);
|
const n = parseFloat(saved);
|
||||||
@@ -1655,30 +1670,30 @@ const SettingsScreen: React.FC = () => {
|
|||||||
<Text style={styles.toggleHint}>
|
<Text style={styles.toggleHint}>
|
||||||
Wie lange du eine Sprechpause machen darfst, bevor die Aufnahme
|
Wie lange du eine Sprechpause machen darfst, bevor die Aufnahme
|
||||||
automatisch beendet und gesendet wird. Hoeher = mehr Zeit zum
|
automatisch beendet und gesendet wird. Hoeher = mehr Zeit zum
|
||||||
Nachdenken; niedriger = schnelleres Senden.
|
Nachdenken (z.B. im Auto); niedriger = schnelleres Senden.
|
||||||
Default: {VAD_SILENCE_DEFAULT_SEC.toFixed(1)}s.
|
Default: {(STT_ENDPOINT_DEFAULT_MS / 1000).toFixed(1)}s.
|
||||||
</Text>
|
</Text>
|
||||||
<View style={styles.prerollRow}>
|
<View style={styles.prerollRow}>
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={styles.prerollButton}
|
style={styles.prerollButton}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
const next = Math.max(VAD_SILENCE_MIN_SEC, Math.round((vadSilenceSec - 0.5) * 10) / 10);
|
const next = Math.max(STT_ENDPOINT_MIN_MS / 1000, Math.round((sttEndpointSec - 0.5) * 10) / 10);
|
||||||
setVadSilenceSec(next);
|
setSttEndpointSec(next);
|
||||||
AsyncStorage.setItem(VAD_SILENCE_STORAGE_KEY, String(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}
|
||||||
>
|
>
|
||||||
<Text style={styles.prerollButtonText}>−0.5</Text>
|
<Text style={styles.prerollButtonText}>−0.5</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<Text style={styles.prerollValue}>{vadSilenceSec.toFixed(1)} s</Text>
|
<Text style={styles.prerollValue}>{sttEndpointSec.toFixed(1)} s</Text>
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={styles.prerollButton}
|
style={styles.prerollButton}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
const next = Math.min(VAD_SILENCE_MAX_SEC, Math.round((vadSilenceSec + 0.5) * 10) / 10);
|
const next = Math.min(STT_ENDPOINT_MAX_MS / 1000, Math.round((sttEndpointSec + 0.5) * 10) / 10);
|
||||||
setVadSilenceSec(next);
|
setSttEndpointSec(next);
|
||||||
AsyncStorage.setItem(VAD_SILENCE_STORAGE_KEY, String(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}
|
||||||
>
|
>
|
||||||
<Text style={styles.prerollButtonText}>+0.5</Text>
|
<Text style={styles.prerollButtonText}>+0.5</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
@@ -1749,56 +1764,10 @@ const SettingsScreen: React.FC = () => {
|
|||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={{flexDirection: 'row', alignItems: 'center', marginTop: 24, gap: 8}}>
|
{/* "Stille-Pegel (dB)"-Regler entfernt: der aktive Streaming-STT nutzt
|
||||||
<Text style={styles.toggleLabel}>Stille-Pegel (dB)</Text>
|
einen adaptiven Rausch-Boden (automatisch), ein manueller dB-Wert war
|
||||||
<TouchableOpacity onPress={() => setShowVadInfo(true)} style={styles.infoBtn}>
|
wirkungslos. Rauschen-als-Wort verhindert das STT-Modell selbst
|
||||||
<Text style={styles.infoBtnText}>i</Text>
|
(no_speech_prob-Filter), nicht die dB-Schwelle. */}
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
|
||||||
<Text style={styles.toggleHint}>
|
|
||||||
Welcher Mikro-Pegel als "Stille" gilt. Standard: automatisch (Baseline aus
|
|
||||||
den ersten 500ms). Manuell setzen wenn Auto nicht zuverlaessig greift.
|
|
||||||
</Text>
|
|
||||||
<View style={styles.prerollRow}>
|
|
||||||
<TouchableOpacity
|
|
||||||
style={styles.prerollButton}
|
|
||||||
onPress={() => {
|
|
||||||
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));
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Text style={styles.prerollButtonText}>−1</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
<Text style={styles.prerollValue}>
|
|
||||||
{vadSilenceDb == null ? 'auto' : `${vadSilenceDb} dB`}
|
|
||||||
</Text>
|
|
||||||
<TouchableOpacity
|
|
||||||
style={styles.prerollButton}
|
|
||||||
onPress={() => {
|
|
||||||
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));
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Text style={styles.prerollButtonText}>+1</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
|
||||||
{vadSilenceDb != null && (
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={() => {
|
|
||||||
setVadSilenceDb(null);
|
|
||||||
AsyncStorage.removeItem(VAD_SILENCE_DB_OVERRIDE_KEY);
|
|
||||||
}}
|
|
||||||
style={{alignSelf: 'center', marginTop: 8, paddingVertical: 6, paddingHorizontal: 12}}
|
|
||||||
>
|
|
||||||
<Text style={{color: '#0096FF', fontSize: 13}}>↻ Auf automatisch zuruecksetzen</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
)}
|
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
Reference in New Issue
Block a user