使用Python,Numpy数组和WAVE模块编写WAV文件

问题描述:

我试图实现Karplus-Strong算法。使用Python,Numpy数组和WAVE模块编写WAV文件

当我玩(通过Jupyter笔记本使用音频(y,费率= Fs))收集的numpy数组(代表吉他协议)时,所有看起来都很好。

不幸的是,在写入numpy的阵列:使用WAVE模块ÿ,成wav文件是不正确的(使用下一Python代码):

noise_output = wave.open('k-s.wav', 'w') 
noise_output.setparams((1, 4, Fs, 0, 'NONE', 'not compressed')) 

for i in range(0, len(y)): 
    value = y[i] 
    packed_value = struct.pack('f', value) 
    noise_output.writeframes(packed_value) 

noise_output.close() 

ÿ的每个元素是

<type 'numpy.float64'> 

我应该如何修改写入循环才能正确写入WAV文件?

有关该问题的更多信息。写WAV之前,Y数组的第一个元素是:

[ 0.33659756 0.33659756 -0.43915295 -0.87036152 1.40708988 0.32123558 
-0.6889402 1.9739982 -1.29587159 -0.12299964 2.18381762 0.82228042 
0.24593503 -1.28067426 -0.67568838 -0.01843234 -1.830472 1.2729578 
-0.56575346 0.55410736] 

写元素的WAV文件后,关闭该WAV文件,看了一遍,我得到这个对收集的第一个20种元素数组:

[ 1051481732 1051481732 -1092560728 -1084305405 1068768133 1050966269 
-1087349149 1073523705 -1079648481 -1107564740 1074512811 1062371576 
    1048303204 -1079775966 -1087571478 -1130954901 -1075163928 1067642952 
-1089415880 1057872379] 
+0

您需要将您的float数据转换为整数并将其包装为Little Endian。 –

+0

如何将其转换为整数?通过一些缩放或?浮点数非常接近1,所以我需要一些缩放呢? @ PM2Ring – mir0soft

+0

是的,你需要扩展它们。我建议使用带符号的16位整数,因此缩放浮点数以便它们适合于'-2 ** 15

import scipy.io.wavfile 
scipy.io.wavfile.write("karplus.wav", Fs, y) 

田田! AFAIK使用float64和float32,可能还有其他的。对于立体声,形状必须是(nb_samples,2)。请参阅scipy.io.wavfile.write

+0

是的,我用scipy试过,所有工作都很好。但我仍然困惑,为什么当我使用WAVE时会发生这种情况? – mir0soft