diff --git a/api/services/configuration/registry.py b/api/services/configuration/registry.py index c74b0116..aba0b7c7 100644 --- a/api/services/configuration/registry.py +++ b/api/services/configuration/registry.py @@ -584,6 +584,20 @@ class SarvamLLMConfiguration(BaseLLMConfiguration): OPENAI_REALTIME_MODELS = ["gpt-realtime-2"] +# ISO 639-1 codes accepted by the Realtime API's input_audio_transcription. +# Not exhaustive — the field allows custom input. +OPENAI_REALTIME_LANGUAGES = [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "hi", + "ja", + "ko", + "zh", +] OPENAI_REALTIME_VOICES = [ "alloy", "ash", @@ -618,6 +632,17 @@ class OpenAIRealtimeLLMConfiguration(BaseLLMConfiguration): "allow_custom_input": True, }, ) + language: str | None = Field( + default=None, + description=( + "ISO 639-1 language code for input audio transcription (e.g. 'pt', 'es'). " + "Improves transcription accuracy and latency. Leave unset to auto-detect." + ), + json_schema_extra={ + "examples": OPENAI_REALTIME_LANGUAGES, + "allow_custom_input": True, + }, + ) GROK_REALTIME_MODELS = ["grok-voice-think-fast-1.0"] diff --git a/api/services/pipecat/service_factory.py b/api/services/pipecat/service_factory.py index e8a357a1..d34abd48 100644 --- a/api/services/pipecat/service_factory.py +++ b/api/services/pipecat/service_factory.py @@ -1008,6 +1008,13 @@ def create_realtime_llm_service(user_config, audio_config: "AudioConfig"): SessionProperties, ) + # Pin the transcription language when configured. Without it the model + # auto-detects per utterance, which misfires on short/noisy telephony + # audio (e.g. Portuguese transcribed as English or Chinese). + transcription_kwargs = {} + if language: + transcription_kwargs["language"] = language + return DograhOpenAIRealtimeLLMService( api_key=api_key, settings=DograhOpenAIRealtimeLLMService.Settings( @@ -1015,7 +1022,9 @@ def create_realtime_llm_service(user_config, audio_config: "AudioConfig"): session_properties=SessionProperties( audio=AudioConfiguration( input=AudioInput( - transcription=InputAudioTranscription(), + transcription=InputAudioTranscription( + **transcription_kwargs + ), ), output=AudioOutput( voice=voice or "alloy",