diff --git a/services/stt/stt_service.py b/services/stt/stt_service.py index 9f2fd7e..55e57af 100644 --- a/services/stt/stt_service.py +++ b/services/stt/stt_service.py @@ -40,6 +40,8 @@ class STTService: @property def available(self) -> bool: settings = self._load_settings() + if settings.get("stt_enabled") is False: + return False provider = settings["stt_provider"] if provider == "disabled": return False @@ -140,6 +142,8 @@ class STTService: def transcribe(self, audio_bytes: bytes) -> Optional[str]: settings = self._load_settings() + if settings.get("stt_enabled") is False: + return None provider = settings["stt_provider"] model = settings["stt_model"] language = settings.get("stt_language", "") diff --git a/services/tts/tts_service.py b/services/tts/tts_service.py index 8b8de88..a78c8a7 100644 --- a/services/tts/tts_service.py +++ b/services/tts/tts_service.py @@ -34,6 +34,7 @@ class TTSService: from src.settings import load_settings saved = load_settings() return { + "tts_enabled": saved.get("tts_enabled", True), "tts_provider": saved.get("tts_provider", "disabled"), "tts_model": saved.get("tts_model", "tts-1"), "tts_voice": saved.get("tts_voice", "alloy"), @@ -43,6 +44,8 @@ class TTSService: @property def available(self) -> bool: settings = self._load_settings() + if settings.get("tts_enabled") is False: + return False provider = settings["tts_provider"] if provider == "disabled": return False @@ -128,6 +131,8 @@ class TTSService: def synthesize(self, text: str, use_cache: bool = True) -> Optional[bytes]: settings = self._load_settings() + if settings.get("tts_enabled") is False: + return None provider = settings["tts_provider"] model = settings["tts_model"] voice = settings["tts_voice"] diff --git a/tests/test_speech_service_toggles.py b/tests/test_speech_service_toggles.py new file mode 100644 index 0000000..e853900 --- /dev/null +++ b/tests/test_speech_service_toggles.py @@ -0,0 +1,57 @@ +from services.stt.stt_service import STTService +from services.tts.tts_service import TTSService + + +def test_tts_disabled_toggle_blocks_synthesis(monkeypatch, tmp_path): + service = TTSService(cache_dir=str(tmp_path)) + calls = {"endpoint": 0, "kokoro": 0} + + monkeypatch.setattr(service, "_load_settings", lambda: { + "tts_enabled": False, + "tts_provider": "endpoint:voice-endpoint", + "tts_model": "tts-1", + "tts_voice": "alloy", + "tts_speed": "1", + }) + + def fake_endpoint(*args, **kwargs): + calls["endpoint"] += 1 + return b"audio" + + def fake_kokoro(): + calls["kokoro"] += 1 + return None + + monkeypatch.setattr(service, "_synthesize_api", fake_endpoint) + monkeypatch.setattr(service, "_get_kokoro", fake_kokoro) + + assert service.available is False + assert service.synthesize("hello") is None + assert calls == {"endpoint": 0, "kokoro": 0} + + +def test_stt_disabled_toggle_blocks_transcription(monkeypatch): + service = STTService() + calls = {"endpoint": 0, "whisper": 0} + + monkeypatch.setattr(service, "_load_settings", lambda: { + "stt_enabled": False, + "stt_provider": "endpoint:transcribe-endpoint", + "stt_model": "whisper-1", + "stt_language": "", + }) + + def fake_endpoint(*args, **kwargs): + calls["endpoint"] += 1 + return "transcript" + + def fake_whisper(): + calls["whisper"] += 1 + return None + + monkeypatch.setattr(service, "_transcribe_api", fake_endpoint) + monkeypatch.setattr(service, "_get_whisper", fake_whisper) + + assert service.available is False + assert service.transcribe(b"audio") is None + assert calls == {"endpoint": 0, "whisper": 0}