У меня есть 2-секундный 16-битный одноканальный 8 кГц 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()
Спасибо вам, ребята!
* 5 / 10
вместо/ 2
? - person John Dvorak   schedule 11.11.2012* 5
обрезается и переполняется. - person Nick ODell   schedule 11.11.2012float(desired_volume) / float(orig_volume)
. - person user4815162342   schedule 11.11.2012*
в строкеstruct.pack('h', *s)
преобразует весь массив numpy в кортеж объектов int. Это потенциально очень неэффективно — вместо этого вы должны использоватьs.tostring
, что эффективно создаст строку непосредственно из содержимого массива. - person user4815162342   schedule 11.11.2012tostring
даст неверный результат. Но вместо этого вы могли бы сделатьs = (s * (desired/original)).astype(numpy.int16).tostring()
. - person Eryk Sun   schedule 11.11.2012