构造一个 wav 文件并使用 scipy 将其写入磁盘

Posted

技术标签:

【中文标题】构造一个 wav 文件并使用 scipy 将其写入磁盘【英文标题】:constructing a wav file and writing it to disk using scipy 【发布时间】:2013-07-03 09:57:50 【问题描述】:

我希望将波形文件解构为小块,以不同的顺序重新组合,然后将其写入磁盘。 在重新组装后,我似乎在编写它时遇到了问题,所以现在我只是尝试调试这一部分,然后再担心剩下的部分。 基本上,我将原始 wav 读入 2D numpy 数组,将其分成 100 块存储在较小的 2D numpy 数组列表中,然后使用 vstack 垂直堆叠这些数组:

import scipy.io.wavfile as sciwav
import numpy
[sr,stereo_data] = sciwav.read('filename')
nparts = 100
stereo_parts = list()
part_length = len(stereo_data) / nparts 

for i in range(nparts):
    start = i*part_length
    end = (i+1)*part_length
    stereo_parts.append(stereo_data[start:end])

new_data = numpy.array([0,0])
for i in range(nparts):
    new_data = numpy.vstack([new_data, stereo_parts[i]])
sciwav.write('new_filename', sr, new_data)

到目前为止,我验证了 new_data 看起来与 stereo_data 相似,但有两个例外: 1.它在开头填充了[0,0]。 2. 由于 len(stereo_data)/nparts 不除而无余,因此缩短了 88 个样本。

当我尝试收听生成的 new_data eave 文件时,我听到的只是寂静,我认为这没有多大意义。

感谢您的帮助! 奥马尔

【问题讨论】:

stereo_datanew_data的形状是什么? 【参考方案1】:

很可能dtype 不同。当您生成要在开头填充的零时,您没有指定 dtype,因此它们可能是 np.int32。您的原始数据可能是np.uint8np.uint16,因此整个数组被提升为np.int32,这不是您数据的正确位深度。只需这样做:

new_data = numpy.array([0,0], dtype=stereo_data)

其实我更愿意这样做:

new_data = numpy.zeros((1, 2), dtype=stereo_data.dtype)

顺便说一句,您可以大大简化您的代码,并摆脱大量的 for 循环:

sr, stereo_data = sciwav.read('filename')
nparts = 100
part_length = len(stereo_data) // nparts 

stereo_parts = numpy.split(stereo_data[:part_length*nparts], nparts)

new_data = numpy.vstack([numpy.zeros((1, 2), dtype=stereo_data.dtype)] +
                        stereo_parts)

sciwav.write('new_filename', sr, new_data)

【讨论】:

以上是关于构造一个 wav 文件并使用 scipy 将其写入磁盘的主要内容,如果未能解决你的问题,请参考以下文章

将 PCM 录制的数据写入 .wav 文件(java android)

为啥 scipy 和 librosa 在读取 wav 文件时不同?

使用来自 SciPy 的 wavfile.write 在 Python 中编写 wav 文件

如何在 Javascript/Node 中从 blob 写入 .wav 文件

将.3gp文件写入.wav格式python Flask服务器

在python中创建无限WAV文件