You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Base64编码的PCM直接解码为二进制并保存为WAV?

解决Base64编码PCM直接转WAV的报错问题

哦,我明白你的问题了——你想跳过中间保存PCM文件的步骤,直接把Base64解码后的PCM二进制数据转成WAV对吧?你之前的错误出在把二进制数据转换成了字符串格式的二进制位,而wave.writeframes()需要的是原始的字节对象,不是字符串。

正确的实现代码

其实不需要多余的转换步骤,base64.b64decode()返回的就是bytes类型的PCM原始数据,直接传给writeframes()就行:

import base64
import wave

# 假设data是你通过API接收的Base64编码PCM字符串
decoded_data = base64.b64decode(data, ' /')  # 解码后直接得到PCM字节流

with wave.open(wavfile, 'wb') as wav:
    # 设置WAV文件参数:单声道、16位采样深度、16000采样率、无压缩
    wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
    wav.writeframes(decoded_data)  # 直接写入解码后的字节数据

错误原因解释

你之前写的这段代码是问题所在:

ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))

这里把decoded_data(已经是bytes)转换成了由二进制位组成的字符串,而wave.writeframes()要求传入的是原始字节对象,不是字符串,所以才会抛出a bytes-like object is required, not 'str'的错误。

为什么这个方法可行?

原来的流程是「解码→保存PCM→读取PCM→写入WAV」,而现在直接把解码后的字节数据传给writeframes(),完全跳过了中间的文件IO操作,既简化了代码,又提升了处理效率。

另外,你尝试的base64.decodebytes()和b64decode()在功能上是一致的(只要处理了自定义分隔符),但核心问题还是不要把解码后的字节转成字符串格式。

内容的提问来源于stack exchange,提问作者ddd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:05:24