【发布时间】:2012-10-31 01:04:15
【问题描述】:
我有一个 2 秒的 16 位单通道 8khz wav 文件,我需要更改它的音量。
应该很简单,因为改变音量和改变信号幅度是一样的,我只需要衰减它,也就是将它乘以0到1之间的一个数。但它没有工作:新的声音较低,但噪音很大。我做错了什么?
这是我的代码:
import wave, numpy, struct
# Open
w = wave.open("input.wav","rb")
p = w.getparams()
f = p[3] # number of frames
s = w.readframes(f)
w.close()
# Edit
s = numpy.fromstring(s, numpy.int16) * 5 / 10 # half amplitude
s = struct.pack('h'*len(s), *s)
# Save
w = wave.open("output.wav","wb")
w.setparams(p)
w.writeframes(s)
w.close()
谢谢你们!
【问题讨论】:
-
你为什么用
* 5 / 10而不是/ 2? -
如果我不得不猜测,我会说
* 5部分正在剪辑和溢出。 -
您是否以正确的字节序读取文件? WAV files are little-endian. 使用另一个字节序会使样本减半并增加很多噪音。
-
天哪……!!很抱歉发布... 回复太容易了。通过这样做: s = numpy.fromstring(s, numpy.int16) * 5 / 10 # 半幅度信号饱和,因为我在除以之前乘以整数。一个解决方案: s = numpy.fromstring(s, numpy.int16) / 10 * 5 # 半幅 注意,这不起作用,因为除法结果为零:s = numpy.fromstring(s, numpy.int16) * (5 / 10) # 半振幅我把它放在这里以防它帮助别人。
-
Jan,因为它们应该是 vars:5 是所需的音量,10 是原始音量。
标签: python audio wav volume wave