Изменение объема wav-файла в 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()
Спасибо, ребята!
2 ответов
Я написал библиотека, чтобы упростить этот тип вещи
вы можете сделать это вот так:
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")
Как вы можете видеть в комментариях к вопросу, существует несколько решений, некоторые из которых более эффективны.
проблема была немедленно обнаружена Яном Дворжаком ("часть * 5 обрезается и переполняется"), и простым решением было:
s = numpy.fromstring(s, numpy.int16) / 10 * 5
в этом случае, это решение было идеальным для меня, вполне достаточно.
спасибо всем!