在python中更改wav文件的卷

在python中更改wav文件的卷,python,audio,wav,volume,wave,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)

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

我写了一封信

您可以这样做:

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")

正如你在问题的评论中所看到的,有几种解决方案,有些更有效

Jan Dvorak立即发现了这个问题(“5部分被剪裁和溢出”),简单的解决方案是:

s = numpy.fromstring(s, numpy.int16) / 10 * 5
在这种情况下,这个解决方案对我来说是完美的,只是足够好


谢谢大家

使声音更响亮的代码加上过滤低频和高频

from pydub import AudioSegment

audio_file = "first.mp3"

song = AudioSegment.from_mp3(audio_file)

new = song.low_pass_filter(1000)

new1 = new.high_pass_filter(1000)

# increae volume by 6 dB
song_6_db_quieter = new1 + 6

# save the output
song_6_db_quieter.export("C://Users//User//Desktop//second.mp3", "mp3")

这可以通过Python标准库中的
audioop
模块完成。 这样,就不需要像
pydub
numpy
这样的依赖项

import wave,audioop
系数=0.5
使用wave.open('input.wav','rb')作为wav:
p=wav.getparams()
使用wave.open('output.wav','wb')作为音频:
音频设置参数(p)
frames=wav.readframes(p.nframes)
audio.writeframesraw(audioop.mul(帧,p.sampwidth,因子))

你为什么用
*5/10
而不是
/2
?如果我不得不猜测的话,我会说
*5
部分是剪切和溢出的。你读文件的结尾是否正确?使用另一端将使样本减半,并增加大量噪音。哦,我的。。。!!很抱歉发布了。。。回答太简单了。通过这样做:s=numpy.fromstring(s,numpy.int16)*5/10#半振幅,信号是饱和的,因为我在除以整数之前乘以整数。解决方案:s=numpy.fromstring(s,numpy.int16)/10*5半振幅小心,这不起作用,因为除法结果为零:s=numpy.fromstring(s,numpy.int16)*(5/10)#半振幅我把它放在这里,以防它对其他人有帮助。简,因为它们应该是可变的:5是期望的音量,10是原始音量。你能把阿斯特利先生的音量衰减36分贝吗?@msw确定那将是
song=song-36
这基本上是pydub在引擎盖下做的