diff --git a/CHANGELOG.md b/CHANGELOG.md index 74a9b739f..9df43bab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- `ElevenLabsTTSService` now supports additional runtime changes to the `model` + and `language` parameters. + - Added `MistralLLMService`, using Mistral's chat completion API. - For `OpenAILLMService` and its subclasses, added the ability to retry diff --git a/src/pipecat/services/elevenlabs/tts.py b/src/pipecat/services/elevenlabs/tts.py index 37302c96f..b8915f862 100644 --- a/src/pipecat/services/elevenlabs/tts.py +++ b/src/pipecat/services/elevenlabs/tts.py @@ -370,11 +370,28 @@ class ElevenLabsTTSService(AudioContextWordTTSService): await self._connect() async def _update_settings(self, settings: Mapping[str, Any]): - """Update service settings and reconnect if voice changed.""" + """Update service settings and reconnect if voice, model, or language changed.""" + # Track previous values for settings that require reconnection prev_voice = self._voice_id + prev_model = self.model_name + prev_language = self._settings.get("language") + await super()._update_settings(settings) - if not prev_voice == self._voice_id: - logger.info(f"Switching TTS voice to: [{self._voice_id}]") + + # Update voice settings for the next context creation + self._voice_settings = self._set_voice_settings() + + # Check if any key connection-level settings changed + settings_changed = ( + prev_voice != self._voice_id + or prev_model != self.model_name + or prev_language != self._settings.get("language") + ) + + if settings_changed: + logger.debug( + f"Connection-level setting changed (voice/model/language), reconnecting WebSocket" + ) await self._disconnect() await self._connect() diff --git a/src/pipecat/services/tts_service.py b/src/pipecat/services/tts_service.py index 9be28f319..556276494 100644 --- a/src/pipecat/services/tts_service.py +++ b/src/pipecat/services/tts_service.py @@ -258,7 +258,7 @@ class TTSService(AIService): self._settings[key] = self.language_to_service_language(value) elif key == "model": self.set_model_name(value) - elif key == "voice": + elif key == "voice" or key == "voice_id": self.set_voice(value) elif key == "text_filter": for filter in self._text_filters: