我有一个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()
谢谢你们!
答案 0 :(得分:12)
我写了library to simplify this type of thing
你可以这样做:
from pydub import AudioSegment
song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
# reduce volume by 10 dB
song_10_db_quieter = song - 10
# but let's make him *very* quiet
song = song - 36
# save the output
song.export("quieter.wav", "wav")
答案 1 :(得分:4)
正如您在问题的评论中所看到的,有几种解决方案,一些更有效。
问题是由Jan Dvorak立即检测到的(“* 5部分是剪切和溢出”),直截了当的解决方案是:
s = numpy.fromstring(s, numpy.int16) / 10 * 5
在这种情况下,这个解决方案对我来说非常合适,只是足够好。
谢谢所有人!
答案 2 :(得分:3)
这可以通过 Python 标准库中的 audioop
模块来完成。
这样,就不需要 pydub
或 numpy
之类的依赖项。
import wave, audioop
factor = 0.5
with wave.open('input.wav', 'rb') as wav:
p = wav.getparams()
with wave.open('output.wav', 'wb') as audio:
audio.setparams(p)
frames = wav.readframes(p.nframes)
audio.writeframesraw( audioop.mul(frames, p.sampwidth, factor))
答案 3 :(得分:0)
使声音更响亮并加上低频和高频滤波器的代码
df2 = df[['Product','Year']].drop_duplicates().assign(MonthGroups='Month1:3',SummedValue=0)
df1 = (df.assign(MonthGroups = np.select([df['Month'].between(1,3),
df['Month'].between(9,11)],
['Month1:3','Month9:11'], default=None))
.groupby(['Product','MonthGroups','Year']).value
.sum()
.reset_index(name='SummedValue')
.append(df2)
.drop_duplicates(['Product','MonthGroups','Year'])
)
print (df1)
Product MonthGroups Year SummedValue
0 A Month1:3 1999 2260
1 A Month9:11 1999 800
2 B Month9:11 1988 1050
3 C Month1:3 2002 1500
4 C Month1:3 2003 800
5 C Month9:11 2003 2700
6 B Month1:3 2017 0
8 B Month1:3 1988 0