From c28ed2206ce426d16f5c7a17a91268d999c95dab Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Mon, 29 Dec 2025 12:44:42 -0500 Subject: [PATCH] DeepgramSTTService pushes user started/stopped speaking and interruption frames --- changelog/xxx.changed.md | 1 + .../07c-interruptible-deepgram-vad.py | 15 +-------------- src/pipecat/services/deepgram/stt.py | 5 +++++ 3 files changed, 7 insertions(+), 14 deletions(-) create mode 100644 changelog/xxx.changed.md diff --git a/changelog/xxx.changed.md b/changelog/xxx.changed.md new file mode 100644 index 000000000..3b9b074a8 --- /dev/null +++ b/changelog/xxx.changed.md @@ -0,0 +1 @@ +- Updated `DeepgramSTTService` to push user started/stopped speaking and interruption frames when `vad_enabled` is set to true. This centralizes the frames into the service, removing the need to have your application code handle Deepgram's events and push these frames. diff --git a/examples/foundational/07c-interruptible-deepgram-vad.py b/examples/foundational/07c-interruptible-deepgram-vad.py index cbde4008d..9814fc01d 100644 --- a/examples/foundational/07c-interruptible-deepgram-vad.py +++ b/examples/foundational/07c-interruptible-deepgram-vad.py @@ -11,12 +11,7 @@ from deepgram import LiveOptions from dotenv import load_dotenv from loguru import logger -from pipecat.frames.frames import ( - InterruptionFrame, - LLMRunFrame, - UserStartedSpeakingFrame, - UserStoppedSpeakingFrame, -) +from pipecat.frames.frames import LLMRunFrame from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.task import PipelineParams, PipelineTask @@ -103,14 +98,6 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): idle_timeout_secs=runner_args.pipeline_idle_timeout_secs, ) - @stt.event_handler("on_speech_started") - async def on_speech_started(stt, *args, **kwargs): - await task.queue_frames([UserStartedSpeakingFrame(), InterruptionFrame()]) - - @stt.event_handler("on_utterance_end") - async def on_utterance_end(stt, *args, **kwargs): - await task.queue_frames([UserStoppedSpeakingFrame()]) - @transport.event_handler("on_client_connected") async def on_client_connected(transport, client): logger.info(f"Client connected") diff --git a/src/pipecat/services/deepgram/stt.py b/src/pipecat/services/deepgram/stt.py index 63c89f880..97888b7ec 100644 --- a/src/pipecat/services/deepgram/stt.py +++ b/src/pipecat/services/deepgram/stt.py @@ -17,6 +17,8 @@ from pipecat.frames.frames import ( InterimTranscriptionFrame, StartFrame, TranscriptionFrame, + UserStartedSpeakingFrame, + UserStoppedSpeakingFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame, ) @@ -271,9 +273,12 @@ class DeepgramSTTService(STTService): async def _on_speech_started(self, *args, **kwargs): await self.start_metrics() await self._call_event_handler("on_speech_started", *args, **kwargs) + await self.broadcast_frame(UserStartedSpeakingFrame) + await self.push_interruption_task_frame_and_wait() async def _on_utterance_end(self, *args, **kwargs): await self._call_event_handler("on_utterance_end", *args, **kwargs) + await self.broadcast_frame(UserStoppedSpeakingFrame) @traced_stt async def _handle_transcription(