最近在音频项目上有个需求,用户在web端上传wav二进制转化后的base64文件到服务端,服务端解码为python二进制字符串,这个时候wavfile.open是无法读取该文件的,因为此接口必须要写入本地磁盘的wav文件才可以读取。
根据互联网千篇一律的教程,wavfile.open函数必须如下使用:
import scipy.io.wavfile as wavfile # 方式一:以路径方式读取 wav_file = r'C:UsersUserDesktop1.wav' rate, signal = wavfile.read(wav_file) # 方式二:以文件句柄方式读取 wav_file = r'C:UsersUserDesktop1.wav' f = open(wav_file, "rb") rate, signal = wavfile.read(f)
上述两种方式必须要在本地存储wav文件,然而在服务端业务处理过程中为了避免IO带来的性能损失,我们不需要在磁盘处理wav文件,希望所有的业务逻辑均在内存中直接处理。
解决方案:
import io import base64 import scipy.io.wavfile as wavfile # 模拟前端传来的base64解码为python二进制字符串 wav_bytes = base64.b64decode(b64_data) memory_wav = io.BytesIO(wav_bytes) rate, signal = wavfile.read(memory_wav)
这样就可以通过内存去处理wav二进制字符串了。
测试:
memory_wav = io.BytesIO(wav_bytes)
print('二进制读取类型:',memory_wav)
rate1, signal1 = wavfile.read(memory_wav)
print('二进制读取结果:', rate1, type(signal1), signal1.shape)
print('--------------------------------------')
f = open(wav_file, "rb")
print('文件句柄类型:', f)
rate2, signal2 = wavfile.read(f)
print('文件句柄结果:', rate2, type(signal2), signal2.shape)
print('--------------------------------------')
print(rate1==rate2, signal1==signal2)
测试结果:
二进制读取类型: <_io.BytesIO object at 0x000001EAD42FF168> 二进制读取结果: 16000(34560, 2) -------------------------------------- 文件句柄类型: <_io.BufferedReader name='C:\Users\User\Desktop/1.wav'> 文件句柄结果: 16000 (34560, 2) -------------------------------------- True [[ True True] [ True True] [ True True] ... [ True True] [ True True] [ True True]]



