栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python音频处理:wav二进制字符串供wavfile直接使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python音频处理:wav二进制字符串供wavfile直接使用

        最近在音频项目上有个需求,用户在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]]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号