Alterar o volume de um arquivo wav em python
Eu tenho um arquivo wav 8khz de canal único de 2 segundos 16bit e preciso alterar seu volume.
Deve ser bastante simples, porque mudar o volume é o mesmo que mudar a amplitude do sinal, e eu só preciso atenuá-lo, ou seja, multiplicá-lo por um número entre 0 e 1. Mas não funciona: o novo som é menor, mas muito cheio de ruído. O que estou fazendo de errado?
Aqui está o meu código:
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()
Obrigado pessoal!