From 42a6fc703cbc8c773917b2ef941aca05d768c932 Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Fri, 17 Apr 2026 15:38:14 -0400 Subject: [PATCH] Address review feedback - Fall back to Language.EN in _primary_detected_language when model is flux-general-en, preserving prior behavior on the default model. - Standardize example on DeepgramFluxSTTService.Settings and drop the now-redundant DeepgramFluxSTTSettings import. - Narrow the changed-behavior changelog to reflect that flux-general-en frames still carry Language.EN. --- changelog/4326.changed.md | 2 +- examples/update-settings/stt/stt-deepgram-flux.py | 7 ++++--- src/pipecat/services/deepgram/flux/base.py | 12 ++++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/changelog/4326.changed.md b/changelog/4326.changed.md index 2809777fc..4cc6e9bb7 100644 --- a/changelog/4326.changed.md +++ b/changelog/4326.changed.md @@ -1 +1 @@ -- `TranscriptionFrame.language` and `InterimTranscriptionFrame.language` emitted by `DeepgramFluxSTTService` now reflect the language Deepgram detected for each turn (read from the `languages` field on Flux's `TurnInfo` event) instead of a statically configured value. On `flux-general-multi` this means per-turn accuracy for downstream consumers (e.g. TTS voice selection). On `flux-general-en` the field is absent in Flux responses, so emitted frames now carry `language=None` instead of the previously hardcoded `Language.EN`. +- `TranscriptionFrame.language` and `InterimTranscriptionFrame.language` emitted by `DeepgramFluxSTTService` now reflect the language Deepgram detected for each turn (read from the `languages` field on Flux's `TurnInfo` event). On `flux-general-multi` this gives per-turn accuracy for downstream consumers (e.g. TTS voice selection). `flux-general-en` continues to emit `Language.EN`. diff --git a/examples/update-settings/stt/stt-deepgram-flux.py b/examples/update-settings/stt/stt-deepgram-flux.py index 82e60ce67..fc3a90f31 100644 --- a/examples/update-settings/stt/stt-deepgram-flux.py +++ b/examples/update-settings/stt/stt-deepgram-flux.py @@ -23,7 +23,6 @@ from pipecat.processors.aggregators.llm_response_universal import ( from pipecat.runner.types import RunnerArguments from pipecat.runner.utils import create_transport from pipecat.services.cartesia.tts import CartesiaTTSService -from pipecat.services.deepgram.flux.base import DeepgramFluxSTTSettings from pipecat.services.deepgram.flux.stt import DeepgramFluxSTTService from pipecat.services.openai.llm import OpenAILLMService from pipecat.transcriptions.language import Language @@ -118,7 +117,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): logger.info("Updating Deepgram Flux STT settings: eot_threshold, keyterm") await task.queue_frame( STTUpdateSettingsFrame( - delta=DeepgramFluxSTTSettings( + delta=DeepgramFluxSTTService.Settings( eot_threshold=0.8, keyterm=["Pipecat", "Deepgram"], ) @@ -130,7 +129,9 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): await asyncio.sleep(10) logger.info("Updating Deepgram Flux STT settings: language_hints=[es]") await task.queue_frame( - STTUpdateSettingsFrame(delta=DeepgramFluxSTTSettings(language_hints=[Language.ES])) + STTUpdateSettingsFrame( + delta=DeepgramFluxSTTService.Settings(language_hints=[Language.ES]) + ) ) @transport.event_handler("on_client_disconnected") diff --git a/src/pipecat/services/deepgram/flux/base.py b/src/pipecat/services/deepgram/flux/base.py index 089b5525a..c54cdda38 100644 --- a/src/pipecat/services/deepgram/flux/base.py +++ b/src/pipecat/services/deepgram/flux/base.py @@ -611,12 +611,16 @@ class DeepgramFluxSTTBase(STTService): def _primary_detected_language(self, data: dict[str, Any]) -> Language | None: """Extract the primary detected language from a TurnInfo payload. - Only populated by ``flux-general-multi``; returns ``None`` otherwise. + On ``flux-general-multi`` the language is read from TurnInfo's + ``languages`` field. On ``flux-general-en`` the field is absent, so we + fall back to ``Language.EN`` to match the model's fixed language. """ codes = data.get("languages") or [] - if not codes: - return None - return _code_to_pipecat_language(codes[0]) + if codes: + return _code_to_pipecat_language(codes[0]) + if self._settings.model == "flux-general-en": + return Language.EN + return None async def _handle_end_of_turn(self, transcript: str, data: dict[str, Any]): """Handle EndOfTurn events from Deepgram Flux.