From f7c74cfa8015c74831dbcf6031746e11bb58363e Mon Sep 17 00:00:00 2001 From: Sam Sykes Date: Wed, 31 Dec 2025 01:28:31 +0000 Subject: [PATCH] Updated VAD --- src/pipecat/services/speechmatics/stt.py | 26 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/pipecat/services/speechmatics/stt.py b/src/pipecat/services/speechmatics/stt.py index f779f0e77..a628b2f89 100644 --- a/src/pipecat/services/speechmatics/stt.py +++ b/src/pipecat/services/speechmatics/stt.py @@ -27,8 +27,8 @@ from pipecat.frames.frames import ( InterimTranscriptionFrame, StartFrame, TranscriptionFrame, - UserStartedSpeakingFrame, - UserStoppedSpeakingFrame, + VADUserStartedSpeakingFrame, + VADUserStoppedSpeakingFrame, ) from pipecat.processors.frame_processor import FrameDirection from pipecat.services.stt_service import STTService @@ -597,17 +597,21 @@ class SpeechmaticsSTTService(STTService): The service will: - Send a BotInterruptionFrame upstream to stop bot speech - - Send a UserStartedSpeakingFrame downstream to notify other components + - Send a VADUserStartedSpeakingFrame downstream to notify other components - Start metrics collection for measuring response times Args: message: the message payload. """ logger.debug(f"{self} StartOfTurn received") - await self.broadcast_frame(UserStartedSpeakingFrame) - await self.push_interruption_task_frame_and_wait() # await self.start_processing_metrics() + # Emit VAD events if enabled + if self._enable_vad: + await self.push_interruption_task_frame_and_wait() + logger.debug(f"{self} sending VADUserStartedSpeakingFrame") + await self.broadcast_frame(VADUserStartedSpeakingFrame) + async def _handle_end_of_turn(self, message: dict[str, Any]) -> None: """Handle EndOfTurn events. @@ -618,14 +622,18 @@ class SpeechmaticsSTTService(STTService): The service will: - Stop processing metrics collection - - Send a UserStoppedSpeakingFrame to signal turn completion + - Send a VADUserStoppedSpeakingFrame to signal turn completion Args: message: the message payload. """ logger.debug(f"{self} EndOfTurn received") # await self.stop_processing_metrics() - await self.broadcast_frame(UserStoppedSpeakingFrame) + + # Emit VAD events if enabled + if self._enable_vad: + logger.debug(f"{self} sending VADUserStoppedSpeakingFrame") + await self.broadcast_frame(VADUserStoppedSpeakingFrame) async def _handle_speakers_result(self, message: dict[str, Any]) -> None: """Handle SpeakersResult events. @@ -660,10 +668,10 @@ class SpeechmaticsSTTService(STTService): self._bot_speaking = False # Force finalization - if isinstance(frame, UserStoppedSpeakingFrame): + if isinstance(frame, VADUserStoppedSpeakingFrame): if self._enable_vad: logger.warning( - f"{self} UserStoppedSpeakingFrame received but internal VAD is being used" + f"{self} VADUserStoppedSpeakingFrame received but internal VAD is being used" ) elif not self._enable_vad and self._client is not None: self._client.finalize()