2

我正在使用 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)

然后当从 twilio 获得 wss 连接时,我开始向 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.wavaudio/x-mulaw是一个以 8000 的采样率编码的 wav 文件。

但是运行时,我什么也听不见,在 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

我不知道哪一部分是错的。有谁知道我的问题是什么?我找不到有关此场景的示例,只需按照此处的说明进行操作,如果有人知道有关此示例的示例,我将不胜感激,谢谢。

4

2 回答 2

0

问题可能不再相关,但我在调试双向流时遇到了这个问题,所以它可能对某人有用:

  1. 由于 json 内容中的拼写错误,您收到此错误的主要原因。您发送的是“playload”而不是“payload”。
  2. 将数据发送到 twilio 流时的另一个问题是,您应该在数据流的末尾发送标记消息,以通知 twilio 已发送完整的有效负载。https://www.twilio.com/docs/voice/twiml/stream#message-mark-to-twilio
  3. 将数据发送回 twilio 流时,请注意有效负载不应包含音频文件类型的标头字节,因此请确保将它们从录制中删除,或者在将数据发送到 twilio 时跳过它们。
于 2022-01-02T21:15:52.073 回答
0

不确定这是否会解决它,但我使用 .decode("ascii"),而不是 "utf-8"

于 2021-01-13T04:31:45.400 回答