如何使用python将base64解码为wav格式?

问题描述

我在服务器上将音频记录存储为base64,webm格式,并想用python将其解码为wav文件。我从这里找到的一个类似问题尝试了两种建议的方法How to decode base64 String directly to binary audio format。但是我在两种建议下都面临着不同的问题:

使用file.write的版本生成一个wav文件,我可以使用VLC播放器播放该文件,其中包含预期的内容。但是,当我尝试使用matlab或python读取消息时,显示“未知格式”或“缺少riff”时,我收到一条错误消息。

fin = open(dirName + file,"r") 
b64_str = fin.read()
fin.close()
# decode base64 string to original binary sound object
decodedData = base64.b64decode(b64_str)

webmfile = (outdir + file.split('.')[0] + ".webm")
wavfile = (outdir + file.split('.')[0] + ".wav")

with open(webmfile,'wb') as wm:
    wm.write(decodedData)
with open(webmfile,'rb') as wm:
    webmdata = pcm.read()
with open(wavfile,'wb') as file:
        file.write(webmdata)

使用writeframes设置参数的版本会生成一个文件,我可以使用matlab或python读取该文件,但是该文件不包含预期的内容,并且比预期的要短。

with wave.open(wavfile,'wb') as wav:
        wav.setparams((1,2,48000,'NONE','NONE'))
        wav.writeframes(webmdata)

关于如何解决此问题的任何想法?文件本身很好。使用在线转换器对其进行转换是可行的。

解决方法

万一某人遇到相同的问题,这是对我有用的解决方案: 以下代码从base64 str创建一个webm文件:

import base64

decodedData = base64.b64decode(b64_str)
webmfile = (outdir + file.split('.')[0] + ".webm")
with open(webmfile,'wb') as file:
       file.write(decodedData)

对于转换,我使用了ffmpy:

from ffmpy import FFmpeg

ff = FFmpeg(
        executable = 'C:/Program Files/ffmpeg-2020/bin/ffmpeg.exe',inputs={file:None},outputs = {outfile:'-c:a pcm_f32le'})
ff.cmd
ff.run()

经过这两个步骤,我能够使用matlab或任何其他程序读取生成的wav文件。