Skip to content

Commit 900fc88

Browse files
authored
Merge pull request #4128 from pipecat-ai/mb/end-of-turn-assembly
2 parents cbb3d99 + b66c892 commit 900fc88

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

changelog/4128.added.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Added `on_end_of_turn` event handler to `AssemblyAISTTService`. This fires after the final transcript is pushed, providing a reliable hook for end-of-turn logic that doesn't race with `TranscriptionFrame`. Works in both Pipecat and AssemblyAI turn detection modes.

src/pipecat/services/assemblyai/stt.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ class AssemblyAISTTService(WebsocketSTTService):
129129
Provides real-time speech transcription using AssemblyAI's WebSocket API.
130130
Supports both interim and final transcriptions with configurable parameters
131131
for audio processing and connection management.
132+
133+
Event handlers available (in addition to WebsocketSTTService events):
134+
135+
- on_end_of_turn(service, transcript): Called when AssemblyAI detects end of turn.
136+
137+
Example::
138+
139+
@service.event_handler("on_end_of_turn")
140+
async def on_end_of_turn(service, transcript):
141+
...
132142
"""
133143

134144
Settings = AssemblyAISTTSettings
@@ -303,6 +313,8 @@ def __init__(
303313

304314
self._user_speaking = False
305315

316+
self._register_event_handler("on_end_of_turn")
317+
306318
def _configure_pipecat_turn_mode(self, settings: Settings, is_u3_pro: bool):
307319
"""Configure settings for Pipecat turn detection mode.
308320
@@ -741,6 +753,7 @@ async def _handle_transcription(self, message: TurnMessage):
741753
)
742754
await self._trace_transcription(transcript_text, True, language)
743755
await self.stop_processing_metrics()
756+
await self._call_event_handler("on_end_of_turn", transcript_text)
744757
else:
745758
await self.push_frame(
746759
InterimTranscriptionFrame(
@@ -774,6 +787,7 @@ async def _handle_transcription(self, message: TurnMessage):
774787
# above, so ordering is preserved) and upstream.
775788
await self.broadcast_frame(UserStoppedSpeakingFrame)
776789
self._user_speaking = False
790+
await self._call_event_handler("on_end_of_turn", transcript_text)
777791
else:
778792
await self.push_frame(
779793
InterimTranscriptionFrame(

src/pipecat/services/deepgram/flux/stt.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,15 @@ class DeepgramFluxSTTService(DeepgramFluxSTTBase, WebsocketService):
5353
5454
Event handlers available (in addition to base events):
5555
56-
- on_speech_started(service): Deepgram detected start of speech
57-
- on_utterance_end(service): Deepgram detected end of utterance
58-
- on_end_of_turn(service): Deepgram detected end of turn (EOT)
59-
- on_eager_end_of_turn(service): Deepgram predicted end of turn (EagerEOT)
56+
- on_start_of_turn(service, transcript): Deepgram detected start of speech
57+
- on_end_of_turn(service, transcript): Deepgram detected end of turn (EOT)
58+
- on_eager_end_of_turn(service, transcript): Deepgram predicted end of turn (EagerEOT)
6059
- on_turn_resumed(service): User resumed speaking after EagerEOT
6160
6261
Example::
6362
6463
@stt.event_handler("on_end_of_turn")
65-
async def on_end_of_turn(service):
64+
async def on_end_of_turn(service, transcript):
6665
...
6766
"""
6867

0 commit comments

Comments
 (0)