Merge pull request #3453 from pipecat-ai/pk/consistency-pass-on-user-started-stopped-speaking-frames

Do a consistency pass on how we're sending `UserStartedSpeakingFrame`…
This commit is contained in:
kompfner
2026-01-15 09:24:14 -05:00
committed by GitHub
8 changed files with 9 additions and 10 deletions

View File

@@ -119,7 +119,7 @@ class CompletenessCheck(FrameProcessor):
if isinstance(frame, TextFrame) and frame.text == "YES":
logger.debug("Completeness check YES")
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
await self._notifier.notify()
elif isinstance(frame, TextFrame) and frame.text == "NO":
logger.debug("Completeness check NO")

View File

@@ -322,7 +322,7 @@ class CompletenessCheck(FrameProcessor):
if isinstance(frame, TextFrame) and frame.text == "YES":
logger.debug("!!! Completeness check YES")
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
await self._notifier.notify()
elif isinstance(frame, TextFrame) and frame.text == "NO":
logger.debug("!!! Completeness check NO")

View File

@@ -451,7 +451,7 @@ class CompletenessCheck(FrameProcessor):
logger.debug("Completeness check YES")
if self._idle_task:
await self.cancel_task(self._idle_task)
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
await self._audio_accumulator.reset()
await self._notifier.notify()
elif isinstance(frame, TextFrame):

View File

@@ -1187,7 +1187,7 @@ class AWSNovaSonicLLMService(LLMService):
logger.debug(
"Wrapping assistant response trigger transcription with upstream UserStarted/StoppedSpeakingFrames"
)
await self.push_frame(UserStartedSpeakingFrame(), direction=FrameDirection.UPSTREAM)
await self.broadcast_frame(UserStartedSpeakingFrame)
# Send the transcription upstream for the user context aggregator
frame = TranscriptionFrame(
@@ -1197,7 +1197,7 @@ class AWSNovaSonicLLMService(LLMService):
# Finish wrapping the upstream transcription in UserStarted/StoppedSpeakingFrames if needed
if should_wrap_in_user_started_stopped_speaking_frames:
await self.push_frame(UserStoppedSpeakingFrame(), direction=FrameDirection.UPSTREAM)
await self.broadcast_frame(UserStoppedSpeakingFrame)
# Clear out the buffered user text
self._user_text_buffer = ""

View File

@@ -676,8 +676,7 @@ class DeepgramFluxSTTService(WebsocketSTTService):
await self._handle_transcription(transcript, True, self._language)
await self.stop_processing_metrics()
await self.push_frame(UserStoppedSpeakingFrame(), FrameDirection.DOWNSTREAM)
await self.push_frame(UserStoppedSpeakingFrame(), FrameDirection.UPSTREAM)
await self.broadcast_frame(UserStoppedSpeakingFrame)
await self._call_event_handler("on_end_of_turn", transcript)
async def _handle_eager_end_of_turn(self, transcript: str, data: Dict[str, Any]):

View File

@@ -659,7 +659,7 @@ class GrokRealtimeLLMService(LLMService):
"""Handle speech stopped event from VAD."""
await self.start_ttfb_metrics()
await self.start_processing_metrics()
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
async def _handle_evt_error(self, evt):
"""Handle error event."""

View File

@@ -776,7 +776,7 @@ class OpenAIRealtimeLLMService(LLMService):
async def _handle_evt_speech_stopped(self, evt):
await self.start_ttfb_metrics()
await self.start_processing_metrics()
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
async def _maybe_handle_evt_retrieve_conversation_item_error(self, evt: events.ErrorEvent):
"""Maybe handle an error event related to retrieving a conversation item.

View File

@@ -662,7 +662,7 @@ class OpenAIRealtimeBetaLLMService(LLMService):
async def _handle_evt_speech_stopped(self, evt):
await self.start_ttfb_metrics()
await self.start_processing_metrics()
await self.push_frame(UserStoppedSpeakingFrame())
await self.broadcast_frame(UserStoppedSpeakingFrame)
async def _maybe_handle_evt_retrieve_conversation_item_error(self, evt: events.ErrorEvent):
"""Maybe handle an error event related to retrieving a conversation item.