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

谢谢你们!

4

4 回答 4

19

我写了一个库来简化这类事情

你可以这样做:

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")
于 2012-12-05T22:30:11.857 回答
7

正如您在问题的评论中看到的那样,有几种解决方案,其中一些更有效。

Jan Dvorak 立即发现了这个问题(“* 5 部分正在剪裁和溢出”),直接的解决方案是:

s = numpy.fromstring(s, numpy.int16) / 10 * 5

在这种情况下,这个解决方案对我来说是完美的,刚刚好。

谢谢大家!

于 2012-12-25T13:10:01.570 回答
3

这可以通过audioopPython 标准库中的模块来完成。这样,就不需要依赖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))
于 2021-01-10T18:00:25.220 回答
1

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

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")
于 2020-06-05T05:27:45.747 回答