From f533dc320304a691c98f7e7ab826bf16e39bd686 Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Mon, 9 Mar 2026 14:59:09 -0400 Subject: [PATCH] Fix Azure STT SpeechConfig failing when private_endpoint is provided MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SpeechConfig does not accept both `region` and `endpoint` simultaneously — they are mutually exclusive. The previous code always passed both, which raises ValueError when a user supplies a private_endpoint URL. Now we conditionally pass either `endpoint` or `region`, never both. --- src/pipecat/services/azure/stt.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/pipecat/services/azure/stt.py b/src/pipecat/services/azure/stt.py index 0588cc6cc..72388b370 100644 --- a/src/pipecat/services/azure/stt.py +++ b/src/pipecat/services/azure/stt.py @@ -94,7 +94,7 @@ class AzureSTTService(STTService): sample_rate: Audio sample rate in Hz. If None, uses service default. private_endpoint: Private endpoint for STT behind firewall. - See https://docs.azure.cn/en-us/ai-services/speech-service/speech-services-private-link?tabs=portal + See https://learn.microsoft.com/en-us/azure/ai-services/speech-service/speech-services-private-link?tabs=portal endpoint_id: Custom model endpoint id. settings: Runtime-updatable settings. When provided alongside deprecated parameters, ``settings`` values take precedence. @@ -126,13 +126,21 @@ class AzureSTTService(STTService): **kwargs, ) - self._speech_config = SpeechConfig( - subscription=api_key, - region=region, - speech_recognition_language=default_settings.language + speech_config_kwargs: dict[str, Any] = { + "subscription": api_key, + "speech_recognition_language": default_settings.language or language_to_azure_language(Language.EN_US), - endpoint=private_endpoint, - ) + } + if private_endpoint: + if region: + logger.warning( + "Both 'region' and 'private_endpoint' provided; 'region' will be ignored." + ) + speech_config_kwargs["endpoint"] = private_endpoint + else: + speech_config_kwargs["region"] = region + + self._speech_config = SpeechConfig(**speech_config_kwargs) if endpoint_id: self._speech_config.endpoint_id = endpoint_id