我需要处理一些.wav
文件,并且我正在使用scipy.io.wavfile
模块来帮助我完成此任务。
当我试图了解read
和write
函数的工作方式时遇到了一个问题。
我有一个示例文件input_file.wav
。我编写的按预期工作的代码是:
def scale(filename):
fs, x = wavfile.read(filename)
wavfile.write('test_output.wav', fs, x)
return
scale('input_file.wav')
当我将它们导入Audacity时,输入和输出文件看起来完全相同,并且在耳机上听起来完全相同。 执行以下代码时遇到问题。
def scale(filename):
fs, x = wavfile.read(filename)
x1 = x * 0.5
wavfile.write('test_output1.wav', fs, x1)
return
scale('input_file.wav')
我希望输出的声音会大一半(因为我将每个样本的值乘以0.5。但是当我将其导入Audacity时,文件声音很大到严重失真的程度。
当我乘以1.01
,1.0001
,0.1
和其他尝试的其他值时,发生了同样的事情-将音量大大提高到了大失真的程度。
当我将样本数组乘以1/32767
左右的值(即1/(2^15-1)
)时,文件开始听起来完全相同(导入Audacity时看起来完全相同)。这很奇怪,因为read()
函数返回的示例数组中的值肯定不相同。
当缩放值为1或1/32767(两个非常不同的数字)时,为什么写操作的输出文件听起来相同?
任何帮助将不胜感激,谢谢。
编辑:如果有帮助,则x.dtype
的输出(dtype
返回的示例数组的read()
属性为int16
)。
答案 0 :(得分:1)
如果x
有dtype
np.int16
,则x1
有dtype
np.float64
。看来scipy.io.wavfile.write
试图将64位浮点值写入文件,即使文档仅提到32位浮点格式。您可以通过将x1
转换为int16
或将x1
中的值标准化为[-1,1](或[-0.5,0.5]或到[-1,1]中的任意范围)。也就是说,您可以使用
wavfile.write('test_output1.wav', fs, np.round(x1).astype(x.dtype)) # If x has an integer dtype
或
wavfile.write('test_output1.wav', fs, (x1/2**15).astype(np.float32))