@@ -195,11 +195,17 @@ async def handle_media_stream(websocket: WebSocket):
195
195
print ("Client connected" )
196
196
await websocket .accept ()
197
197
198
+ # Initialize variables
199
+ stream_sid = None
200
+ latest_media_timestamp = 0
201
+
202
+ # Set up OpenAI Realtime client
198
203
client = RealtimeClient (api_key = OPENAI_API_KEY )
199
204
await client .connect ()
200
205
201
206
async def receive_from_twilio ():
202
207
"""Receive audio data from Twilio and send it to the OpenAI Realtime API."""
208
+ nonlocal stream_sid , latest_media_timestamp
203
209
try :
204
210
async for message in websocket .iter_text ():
205
211
data = json .loads (message )
@@ -211,13 +217,43 @@ async def receive_from_twilio():
211
217
}
212
218
await client .ws .send (json .dumps (audio_append ))
213
219
elif data ['event' ] == 'start' :
214
- print (f"Incoming stream has started { data ['start' ]['streamSid' ]} " )
220
+ stream_sid = data ['start' ]['streamSid' ]
221
+ print (f"Incoming stream has started { stream_sid } " )
215
222
except WebSocketDisconnect :
216
223
print ("Client disconnected." )
217
224
await client .close ()
218
225
219
226
async def send_to_twilio ():
220
- await client .handle_messages ()
227
+ """Receive events from the OpenAI Realtime API and handle audio responses."""
228
+ nonlocal stream_sid
229
+ try :
230
+ async for openai_message in client .ws :
231
+ response = json .loads (openai_message )
232
+
233
+ # Log received event
234
+ if response .get ("type" ):
235
+ print (f"Received event: { response ['type' ]} " , response )
236
+
237
+ # Process audio responses
238
+ if response .get ("type" ) == "response.audio.delta" and "delta" in response :
239
+ # Decode and prepare the audio payload
240
+ audio_payload = base64 .b64encode (
241
+ base64 .b64decode (response ["delta" ])
242
+ ).decode ("utf-8" )
243
+ audio_delta = {
244
+ "event" : "media" ,
245
+ "streamSid" : stream_sid ,
246
+ "media" : {"payload" : audio_payload },
247
+ }
248
+ # Send the audio payload back to Twilio
249
+ await websocket .send_json (audio_delta )
250
+
251
+ # Handle other response types as needed
252
+ if response .get ("type" ) == "response.done" :
253
+ print (f"Response completed: { response } " )
254
+
255
+ except Exception as e :
256
+ print (f"Error in send_to_twilio: { e } " )
221
257
222
258
await asyncio .gather (receive_from_twilio (), send_to_twilio ())
223
259
0 commit comments