diff --git a/api/services/configuration/registry.py b/api/services/configuration/registry.py index 0ce0459..758a24d 100644 --- a/api/services/configuration/registry.py +++ b/api/services/configuration/registry.py @@ -443,6 +443,14 @@ class ElevenlabsTTSConfiguration(BaseServiceConfiguration): default="eleven_flash_v2_5", json_schema_extra={"examples": ELEVENLABS_TTS_MODELS}, ) + base_url: str = Field( + default="https://api.elevenlabs.io", + description=( + "ElevenLabs API base URL. Override to use a Data Residency endpoint " + "(e.g. https://api.eu.residency.elevenlabs.io) for GDPR / HIPAA / " + "regional compliance." + ), + ) OPENAI_TTS_MODELS = ["gpt-4o-mini-tts"] diff --git a/api/services/pipecat/service_factory.py b/api/services/pipecat/service_factory.py index 14c73ae..d730b4f 100644 --- a/api/services/pipecat/service_factory.py +++ b/api/services/pipecat/service_factory.py @@ -247,9 +247,16 @@ def create_tts_service(user_config, audio_config: "AudioConfig"): voice_id = user_config.tts.voice.split(" - ")[1] except IndexError: voice_id = user_config.tts.voice + # ElevenLabs TTS uses WebSocket. Users configure base_url with an HTTP + # scheme (matching ElevenLabs documentation, e.g. + # https://api.eu.residency.elevenlabs.io); rewrite it to the WS scheme. + elevenlabs_url = user_config.tts.base_url.replace( + "https://", "wss://" + ).replace("http://", "ws://") return ElevenLabsTTSService( reconnect_on_error=False, api_key=user_config.tts.api_key, + url=elevenlabs_url, settings=ElevenLabsTTSSettings( voice=voice_id, model=user_config.tts.model,