Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

Posted

技术标签:

【中文标题】Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组【英文标题】:Python 3: Convert wave data (byte array) to numpy array of floating point values 【发布时间】:2021-02-20 20:08:30 【问题描述】:

我的目标是将 wave 数据(使用 wave 模块从 .wav 文件读取)转换为 numpy 数组。

数据当前被格式化为字节数组。这意味着字节数组的每个元素都是 8 位宽。 wav 文件是单声道的,因此仅包含 1 个通道。然而,大多数 wav 文件是立体声的,因此数据被格式化为左右声道交织的一系列样本。

样本是 16 位,因此数组中的每一对连续字节都是 1 个“16 位”样本。某些音频文件是每个样本 24 位。每个样本的位数可以从

获得
len(bytearray) // (wave.getnframes() *  wave.getnchannels())

所以我需要以某种方式

将字节分组为字节对(样本) 使用“步幅”将字节对复制到某个新存储中。对于单步幅 = 0 ?对于立体声,步幅大概是 1? (这将取决于 python 在内存中的计数) 将新存储转换为 numpy 数组 有时会从 16 位有符号整数格式转换为浮点格式,这可以在过程的任何阶段完成

我可以使用 for 循环和索引来实现 C++ 风格的解决方案。我认为这在 python 中会很慢。

我的猜测是 Python(可能)包含一些函数

int 和 float/double 格式之间的转换(可能是 numpy 数组或上述过程中的其他地方) “去隔行”数据(从字节数组中分离出左/右通道数据) 将指定格式的字节数组转换为指定类型的numpy数组

但是,我不知道这些可能是什么或它们可能是什么形式。(内置?库/模块?)

这似乎是一个应该很容易“duckduckgoable”的问题 - 但我没有运气。现在使用 wav 格式数据可能有点小众应用?

即使是简单的答案,其中包含要输入到 dadduckgo 中的内容列表,也将不胜感激。我可以阅读/找出文档,只是不知道要搜索什么。

【问题讨论】:

请问我的编辑有什么问题吗?我修复了一些小问题,添加了相关标签并删除了您要求外部资源的部分,这是题外话... 【参考方案1】:

我通常使用scipy.io.wavfile.read 这样做,它会解析波形文件头并将数据作为 numpy 数组和从头中获取的采样频率提供给您。

如果你真的想从字节开始,你可以使用numpy.frombuffer

data_s16 = np.frombuffer(bytes, dtype=np.int16, count=len(bytes)//2, offset=0)
float_data = data_s16 * 0.5**15

【讨论】:

scipy方法看起来比较简单,我来看看。 scipy 包含用于读取 wav 文件的代码似乎有点奇怪? 为什么你觉得奇怪?因为你认为 Wave 更多的是一种娱乐形式?源分离、语音识别、语音合成是使用音频信号的几个热门研究领域。

以上是关于Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

将浮点 numpy 数组转换为字符串数组 Python

javascript中如何将获得的整型数值转换为字节数组

如何正确将 16Bit 字节数组转换为音频剪辑数据?

C语言的浮点型怎么转换为整型?

字节数组byte[]和整型,浮点型数据的转换——Java代码

在 Python 3 中将二进制字符串转换为字节数组