fix(livekit): clear AudioSource buffer on interruption

When an InterruptionFrame arrives, the Python-side audio task is
cancelled but frames already submitted to rtc.AudioSource continue
playing from its internal buffer. This causes the bot to keep speaking
for several seconds after being interrupted.

Fix by overriding process_frame in LiveKitOutputTransport to call
audio_source.clear_queue() on InterruptionFrame, immediately flushing
the buffered audio.
This commit is contained in:
ajmeraharsh
2026-03-26 09:47:00 +05:30
parent f311a0b6e4
commit 62484a4fc3
2 changed files with 18 additions and 0 deletions

1
changelog/4151.fixed.md Normal file
View File

@@ -0,0 +1 @@
- Fixed `LiveKitOutputTransport` not clearing the `rtc.AudioSource` internal buffer on interruption, causing the bot to continue speaking for several seconds after being interrupted.

View File

@@ -27,7 +27,9 @@ from pipecat.frames.frames import (
CancelFrame,
ClientConnectedFrame,
EndFrame,
Frame,
ImageRawFrame,
InterruptionFrame,
OutputAudioRawFrame,
OutputDTMFFrame,
OutputDTMFUrgentFrame,
@@ -880,6 +882,21 @@ class LiveKitOutputTransport(BaseOutputTransport):
await super().cancel(frame)
await self._client.disconnect()
async def process_frame(self, frame: Frame, direction: FrameDirection):
"""Process frames, clearing the LiveKit AudioSource buffer on interruption.
When an InterruptionFrame arrives, any audio already submitted to the
LiveKit AudioSource (but not yet played out) is cleared immediately so
the bot stops speaking without delay.
Args:
frame: The frame to process.
direction: The direction of frame flow in the pipeline.
"""
await super().process_frame(frame, direction)
if isinstance(frame, InterruptionFrame) and self._client._audio_source is not None:
self._client._audio_source.clear_queue()
async def setup(self, setup: FrameProcessorSetup):
"""Setup the output transport with shared client setup.