From 7ee2757afeb058d29eb05b57bf92d38cbd3e07c9 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Thu, 2 Jul 2026 16:09:15 -0400 Subject: [PATCH] fix(#5435): preserve zero TTS pitch in settings --- static/panels.js | 4 ++-- tests/test_issue5435_tts_voice_preferences.py | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/static/panels.js b/static/panels.js index 79c1532d..093672a8 100644 --- a/static/panels.js +++ b/static/panels.js @@ -8776,7 +8776,7 @@ async function loadSettingsPanel(){ const ttsRateValue=$('settingsTtsRateValue'); if(ttsRateSlider){ const savedRate=_speechSetting('tts_rate','hermes-tts-rate',1); - ttsRateSlider.value=savedRate||'1'; + ttsRateSlider.value=(savedRate===null||savedRate===undefined)?'1':String(savedRate); if(ttsRateValue) ttsRateValue.textContent=parseFloat(ttsRateSlider.value).toFixed(1)+'x'; localStorage.setItem('hermes-tts-rate',ttsRateSlider.value); ttsRateSlider.oninput=function(){if(ttsRateValue)ttsRateValue.textContent=parseFloat(this.value).toFixed(1)+'x';localStorage.setItem('hermes-tts-rate',this.value);_schedulePreferencesAutosave();}; @@ -8785,7 +8785,7 @@ async function loadSettingsPanel(){ const ttsPitchValue=$('settingsTtsPitchValue'); if(ttsPitchSlider){ const savedPitch=_speechSetting('tts_pitch','hermes-tts-pitch',1); - ttsPitchSlider.value=savedPitch||'1'; + ttsPitchSlider.value=(savedPitch===null||savedPitch===undefined)?'1':String(savedPitch); if(ttsPitchValue) ttsPitchValue.textContent=parseFloat(ttsPitchSlider.value).toFixed(1); localStorage.setItem('hermes-tts-pitch',ttsPitchSlider.value); ttsPitchSlider.oninput=function(){if(ttsPitchValue)ttsPitchValue.textContent=parseFloat(this.value).toFixed(1);localStorage.setItem('hermes-tts-pitch',this.value);_schedulePreferencesAutosave();}; diff --git a/tests/test_issue5435_tts_voice_preferences.py b/tests/test_issue5435_tts_voice_preferences.py index 2d576558..fc3a3ca0 100644 --- a/tests/test_issue5435_tts_voice_preferences.py +++ b/tests/test_issue5435_tts_voice_preferences.py @@ -67,7 +67,7 @@ def test_settings_api_round_trips_speech_preferences(): "tts_engine": "voicevox_local", "tts_voice": "en-US-AriaNeural", "tts_rate": "1.4", - "tts_pitch": "0.8", + "tts_pitch": "0", "voice_mode_button": True, "voice_continuous": True, "voice_silence_ms": "2400", @@ -84,7 +84,7 @@ def test_settings_api_round_trips_speech_preferences(): assert saved["tts_engine"] == "voicevox_local" assert saved["tts_voice"] == "en-US-AriaNeural" assert saved["tts_rate"] == 1.4 - assert saved["tts_pitch"] == 0.8 + assert saved["tts_pitch"] == 0.0 assert saved["voice_mode_button"] is True assert saved["voice_continuous"] is True assert saved["voice_silence_ms"] == 2400 @@ -193,6 +193,10 @@ def test_settings_panel_persists_speech_fields_and_keeps_immediate_cache_writes( ]: assert storage_key in panel_block or storage_key in payload_block assert "_speechSetting('tts_engine','hermes-tts-engine','browser')" in panel_block + assert "savedRate||'1'" not in panel_block + assert "savedPitch||'1'" not in panel_block + assert "ttsRateSlider.value=(savedRate===null||savedRate===undefined)?'1':String(savedRate)" in panel_block + assert "ttsPitchSlider.value=(savedPitch===null||savedPitch===undefined)?'1':String(savedPitch)" in panel_block assert "serverBool===fallbackBool&&storedBool!==fallbackBool" in PANELS_JS assert "String(server)===String(fallback)&&String(stored)!==String(fallback)" in PANELS_JS assert "_schedulePreferencesAutosave()" in panel_block