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

时间:2013-09-05 20:40:04

标签: python scipy wav

我有这段代码:

import numpy as np
import scipy.io.wavfile
import math

rate, data = scipy.io.wavfile.read('xenencounter_23.wav')

data2 = []

for i in range(len(data)):
    data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])

data2 = np.asarray(data2)

print data2

scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2)

打印(截断):

[[-2524  2728]
 [ -423 -2270]
 [ 2270   423]
 ..., 
 [-2524     0]
 [ 2524 -2728]
 [-2270   838]]

wav文件打开并在Windows Media Player中播放,所以至少它的格式正确。但是,当使用Audacity打开它并查看单个样本时,它们都是0,并且一致地说文件根本没有声音。

我不明白的是上面列出的那个numpy数组是如何变成全0的。它应该低于样本的最大值(或者如果它是负的则高于)。

3 个答案:

答案 0 :(得分:13)

我发现scipy.io.wavfile.write()以16位整数写入,这解释了尝试使用32位整数(默认值)时较大的文件大小。虽然我找不到在wavfile.write中更改此方法的方法,但我确实通过更改:

找到了
data2 = np.asarray(data2)

data2 = np.asarray(data2, dtype=np.int16)

我可以写一份工作文件。

答案 1 :(得分:1)

正如您通过在不同点打印输出并重新保存最初加载的内容所发现的那样,行data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])是问题的根源。

我怀疑3000的振幅太大了。试试1.

答案 2 :(得分:1)

在通过scipy.io.wavfile.write()创建wav文件时,我发现振幅非常重要。如果您创建幅度为150的正弦波,则在VLC中播放时听起来像是静音。如果振幅为100,则听起来像是一个扭曲的正弦波,如果你把它变成80,它就会听起来像普通文件。

创建波形文件时必须要小心振幅,但现在我还不清楚它在开始削波或消失之前的最高级别是什么。