python中的wave库:2个通道和2个样本宽度

Posted

技术标签:

【中文标题】python中的wave库:2个通道和2个样本宽度【英文标题】:wave library in python: 2 channels and sample width of 2 【发布时间】:2020-12-11 19:43:40 【问题描述】:

我正在尝试将 .wav 文件转换为 numpy 数组。我在 python 中使用 wave 库使用 readframes() 将 .wav 文件转换为字节对象,然后使用 np.frombuffer() 将字节对象转换为 numpy 数组。

我的 .wav 文件具有以下属性:

频道数:2 样品宽度:2 帧率:44100 帧数:4692480 压缩类型:无 压缩类型(人类可读的名称):未压缩

当我将其转换为 np 数组并检查形状时,我得到的形状为 18769920,是预期的 4 倍 (4692480)。我怀疑这是因为通道数(2)和样本宽度(2)。

我在下面包含了我的代码:

wave_read = wave.open('sample_jazz.wav', mode='rb')
frames = wave_read.readframes(wave_read.getnframes())
sound_arr = np.frombuffer(frames, dtype=np.uint8)

这里是问题(它们彼此非常相关)。

如何一次阅读一个频道? 我如何一次读取 2 个字节而不是 1 个字节?我只是将 dtype 更改为 np.uint16 吗?原因是我不确定字节对象中的字节是如何排序的。也许它有通道 1,帧 1,字节 1,然后是通道 2,帧 1,字节 1,然后是通道 1,帧 1,字节 2,然后是通道 2,帧 1,字节 2,我不能只解释两个连续字节作为 uint16,因为通道是散布的,我最终只是将来自不同通道的两个字节 1 解释为 16 位 int。

【问题讨论】:

【参考方案1】:

我最终使用了非常方便的 scipy.io.wavfile。

【讨论】:

以上是关于python中的wave库:2个通道和2个样本宽度的主要内容,如果未能解决你的问题,请参考以下文章

利用 wave 库 对音频进行格式处理

似乎无法在原始 Python 中编写两个通道 Wave 文件(无 Wave 模块)

MP3 中的“样本”是啥?

正确读取 .wav 文件中的样本

如何使用python实现wave音频文件回放

获取keras模型中3个类的混淆矩阵