Как использовать функцию двунаправленного потока Twilio для воспроизведения необработанных аудиоданных
Я использую Программируемый голос Twilio для обработки телефонных звонков.
Я хочу использовать функцию двунаправленного потока для отправки некоторых необработанных аудиоданных для воспроизведения с помощью twilio, код инициализации выглядит так:
from twilio.twiml.voice_response import Connect, VoiceResponse, Stream
response = VoiceResponse()
connect = Connect()
connect.stream(url='wss://mystream.ngrok.io/audiostream')
response.append(connect)
Затем, когда я получил wss-соединение от Twilio, я начал отправлять необработанные аудиоданные в Twilio, например
async def send_raw_audio(self, ws, stream_sid):
print('send raw audio')
import base64
import json
with open('test.wav', 'rb') as wav:
while True:
frame_data = wav.read(1024)
if len(frame_data) == 0:
print('no more data')
break
base64_data = base64.b64encode(frame_data).decode('utf-8')
print('send base64 data')
media_data = {
"event": "media",
"streamSid": stream_sid,
"media": {
"playload": base64_data
}
}
media = json.dumps(media_data)
print(f"media: {media}")
await ws.send(media)
print('finished sending')
test.wav
закодированный файл wav
audio/x-mulaw
с частотой дискретизации 8000.
Но при запуске я ничего не слышу, а на консоли Twilio говорилось
31951 - Stream - Protocol - Invalid Message
Possible Causes
- Message does not have JSON format
- Unknown message type
- Missing or extra field in message
- Wrong Stream SID used in message
Понятия не имею, какая часть неправильная. Кто-нибудь знает, в чем моя проблема? Я не могу найти пример этого сценария, просто следуйте инструкциям здесь, очень признателен, если кто-то знает, что есть пример по этому поводу, спасибо.
2 ответа
Вопрос, вероятно, уже не актуален, но я наткнулся на это при отладке своего двунаправленного потока, так что это может быть кому-то полезно:
- Основная причина, по которой вы получали эту ошибку из-за опечатки в содержимом json. Вы отправляете «playload» вместо «payload».
- Еще одна проблема при отправке данных в поток twilio заключается в том, что вы должны отправить сообщение о пометке в конце потока данных, чтобы уведомить twilio о том, что вся полезная нагрузка была отправлена. https://www.twilio.com/docs/voice/twiml/stream#message-mark-to-twilio
- При отправке данных обратно в поток twilio имейте в виду, что полезная нагрузка не должна содержать байты заголовка типа аудиофайла, поэтому убедитесь, что вы удалили их из своей записи или, в качестве альтернативы, пропустили их при отправке данных в twilio.
Не уверен, что это исправит, но я использую .decode("ascii"), а не "utf-8"