将 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音质极佳。
我在 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音质极佳。