From 2634b03ffafdc2c6a29258b162f5e2c942401109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 28 Jan 2025 19:05:08 -0800 Subject: [PATCH] serializers(twilio): handle transport message frames --- CHANGELOG.md | 3 +++ src/pipecat/serializers/twilio.py | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e8b9fac1..950e6889b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- `TwilioSerializer` now supports transport message frames. With this we can + create Twilio emulators. + - Added a new transport: `WebsocketClientTransport`. - Added a `metadata` field to `Frame` which makes it possible to pass custom diff --git a/src/pipecat/serializers/twilio.py b/src/pipecat/serializers/twilio.py index 298e8a6cb..40c8c726f 100644 --- a/src/pipecat/serializers/twilio.py +++ b/src/pipecat/serializers/twilio.py @@ -17,6 +17,8 @@ InputDTMFFrame, KeypadEntry, StartInterruptionFrame, + TransportMessageFrame, + TransportMessageUrgentFrame, ) from pipecat.serializers.base_serializer import FrameSerializer, FrameSerializerType @@ -35,7 +37,10 @@ def type(self) -> FrameSerializerType: return FrameSerializerType.TEXT def serialize(self, frame: Frame) -> str | bytes | None: - if isinstance(frame, AudioRawFrame): + if isinstance(frame, StartInterruptionFrame): + answer = {"event": "clear", "streamSid": self._stream_sid} + return json.dumps(answer) + elif isinstance(frame, AudioRawFrame): data = frame.audio serialized_data = pcm_to_ulaw(data, frame.sample_rate, self._params.twilio_sample_rate) @@ -47,10 +52,8 @@ def serialize(self, frame: Frame) -> str | bytes | None: } return json.dumps(answer) - - if isinstance(frame, StartInterruptionFrame): - answer = {"event": "clear", "streamSid": self._stream_sid} - return json.dumps(answer) + elif isinstance(frame, (TransportMessageFrame, TransportMessageUrgentFrame)): + return json.dumps(frame.message) def deserialize(self, data: str | bytes) -> Frame | None: message = json.loads(data)