问题描述
我在 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 ','有效载荷': '///////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// //////////////////w=='},'streamSid': 'streamSid_value'}
........
{'event': 'stop','sequenceNumber': '332','stop': {'accountSid': 'accountSid_value','callSid': 'callSid_value '}}
媒体位于 media.payload 中。在示例中提供的媒体是沉默。 媒体是以 base64 编码的原始音频。 如何将字符串从 media.payload 转换为 .wav(或任何其他)音频文件?
解决方法
我找到了一个解决方案,这段代码对我有用:
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 解码工作正常,但音频质量很差。 此方法返回出色的音频质量。
,首先你需要解码它:
d
至于您主要关心的问题,我真的帮不上忙,但我建议您检查 pydyb (https://github.com/jiaaro/pydub)。