Как использовать функцию двунаправленного потока 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 ответа

Вопрос, вероятно, уже не актуален, но я наткнулся на это при отладке своего двунаправленного потока, так что это может быть кому-то полезно:

  1. Основная причина, по которой вы получали эту ошибку из-за опечатки в содержимом json. Вы отправляете «playload» вместо «payload».
  2. Еще одна проблема при отправке данных в поток twilio заключается в том, что вы должны отправить сообщение о пометке в конце потока данных, чтобы уведомить twilio о том, что вся полезная нагрузка была отправлена. https://www.twilio.com/docs/voice/twiml/stream#message-mark-to-twilio
  3. При отправке данных обратно в поток twilio имейте в виду, что полезная нагрузка не должна содержать байты заголовка типа аудиофайла, поэтому убедитесь, что вы удалили их из своей записи или, в качестве альтернативы, пропустили их при отправке данных в twilio.

Не уверен, что это исправит, но я использую .decode("ascii"), а не "utf-8"

Другие вопросы по тегам