如何使用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)

然后,当从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.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

我不知道哪一部分错了。有人知道我有什么问题吗?我找不到这种情况的示例,只需按照说明here进行操作,如果有人知道有这种示例,非常感谢。

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...