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:
1
changelog/4151.fixed.md
Normal file
1
changelog/4151.fixed.md
Normal 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.
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user