在python中更改wav文件的音量

时间:2012-11-11 08:19:13

标签: python audio wav volume wave

我有一个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()

谢谢你们!

4 个答案:

答案 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 模块来完成。 这样,就不需要 pydubnumpy 之类的依赖项。

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