Измените объем wav файла в python

У меня есть 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()

Спасибо, ребята!

Ответ 1

Как вы можете видеть в комментариях к вопросу, есть несколько решений, более эффективных.

Проблема была немедленно обнаружена Яном Дворжаком ( "часть * 5 отсечена и переполнена" ), и прямое решение было:

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

В этом случае это решение было идеально для меня, достаточно хорошее.

Спасибо всем!

Ответ 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 make him *very* quiet
song = song - 36

# save the output
song.export("quieter.wav", "wav")