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

时间:2013-07-03 09:57:51

标签: python scipy wave

我希望将wave文件解构为小块,以不同的顺序重新组合,然后将其写入磁盘。 在重新组装这些部分之后,我似乎遇到了编写问题,所以现在我只是尝试调试这一部分,然后担心其余部分。 基本上我将原始的wav读入2D numpy数组,将其分解为存储在较小的2D numpy数组列表中的100个片段,然后使用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.缩短了88个样本,因为len(stereo_data)/ nparts不会在没有余数的情况下进行分割。

当我尝试收听生成的new_data eave文件时,我听到的只是沉默,我觉得这没什么意义。

感谢您的帮助! 奥马尔

1 个答案:

答案 0 :(得分: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)