将 Twilio 双向 <Stream> 媒体负载转换为 Python 中的 .wav 文件

Convert Twilio bi-directional <Stream> media payload to .wav file in Python

我在 Python 中有一个非常简单的 websocket,它正在监听来自 Twilio 的实时双向流。我得到包含以下信息的数据。

{'event': 'connected', 'protocol': 'Call', 'version': '1.0.0'}

{'event': 'start', 'sequenceNumber': '1', 'start': {'accountSid': 'accountSid_value', 'streamSid': 'streamSid_value', 'callSid': 'callSid_value', 'tracks': ['inbound'], 'mediaFormat': {'encoding': 'audio/x-mulaw', 'sampleRate': 8000, 'channels': 1}}, 'streamSid': 'streamSid_value'}

{'event': 'media', 'sequenceNumber': '5', 'media': {'track': 'inbound', 'chunk': '4', 'timestamp': '262', 'payload': '//////////////////// //////////////////////////////////////////////// //////////////////////////////////////////////// //////////////////////////////////////////////// ///////////////////////////////////////w=='}, 'streamSid': 'streamSid_value'}

.........

{'event': 'stop', 'sequenceNumber': '332', 'streamSid': 'streamSid_value', 'stop' : {'accountSid': 'accountSid_value', 'callSid': 'callSid_value'}}

媒体位于 media.payload。在示例中提供的媒体是静音。 媒体是以 base64 编码的原始音频。 如何将字符串从 media.payload 转换为 .wav(或任何其他)音频文件?

首先你需要解码它:

import base64
decoded_payload = base64.b64decode(media.payload)

至于你最关心的问题,我真的帮不上忙,但我建议你检查一下pydyb(https://github.com/jiaaro/pydub)。

我找到了解决方案,这段代码对我有用:

https://github.com/saisyam/pywav

import pywav
import pickle
import base64

with open('stream', 'rb') as fp:
    stream = pickle.load(fp)

data = []
for d in stream:
    if d['event'] == 'media':
        data.append(base64.b64decode(d['media']['payload']))

data_bytes = b"".join(data)
wave_write = pywav.WavWrite("filename.wav", 1, 8000, 8, 7)  # 1 stands for mono channel, 8000 sample rate, 8 bit, 7 stands for MULAW encoding
wave_write.write(data_bytes)
wave_write.close()

使用 base64 和 pydub 解码有效,但音频质量很糟糕。 这种方法returns音质极佳。