在python中更改wav文件的体积

2024-04-26 19:12:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谢谢你们!


Tags: 文件代码numpy声音close信号数字open
2条回答

我写了一篇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")

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

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

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

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

谢谢大家!

相关问题 更多 >