From c2135cbe11984f29f9680a1219308b1e1c3ca1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Mon, 2 Dec 2024 11:01:55 -0800 Subject: [PATCH] transports(websockets): use frame serializers during interruptions --- CHANGELOG.md | 3 +++ src/pipecat/transports/network/fastapi_websocket.py | 2 -- src/pipecat/transports/network/websocket_server.py | 6 ++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f4932eec..203276f1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fixed a `WebsocketServerTransport` issue that would prevent interruptions with + `TwilioSerializer` from working. + - `DailyTransport.capture_participant_video` now allows capturing user's screen share by simply passing `video_source="screenVideo"`. diff --git a/src/pipecat/transports/network/fastapi_websocket.py b/src/pipecat/transports/network/fastapi_websocket.py index c0363c1a9..db1dcccdd 100644 --- a/src/pipecat/transports/network/fastapi_websocket.py +++ b/src/pipecat/transports/network/fastapi_websocket.py @@ -15,8 +15,6 @@ from pydantic.main import BaseModel from pipecat.frames.frames import ( AudioRawFrame, - CancelFrame, - EndFrame, Frame, InputAudioRawFrame, StartFrame, diff --git a/src/pipecat/transports/network/websocket_server.py b/src/pipecat/transports/network/websocket_server.py index c0c8595e9..10a42828b 100644 --- a/src/pipecat/transports/network/websocket_server.py +++ b/src/pipecat/transports/network/websocket_server.py @@ -148,6 +148,7 @@ class WebsocketServerOutputTransport(BaseOutputTransport): await super().process_frame(frame, direction) if isinstance(frame, StartInterruptionFrame): + await self._write_frame(frame) self._next_send_time = 0 async def write_raw_audio_frames(self, frames: bytes): @@ -189,6 +190,11 @@ class WebsocketServerOutputTransport(BaseOutputTransport): self._websocket_audio_buffer = bytes() + async def _write_frame(self, frame: Frame): + payload = self._params.serializer.serialize(frame) + if payload and self._websocket: + await self._websocket.send(payload) + class WebsocketServerTransport(BaseTransport): def __init__(