2012-11-11 9 views
10

Ich habe eine 2 Sekunden 16-Bit-Single-Channel-8khz Wav-Datei und ich muss seine Lautstärke ändern.Ändern Sie das Volumen einer WAV-Datei in Python

Es sollte ziemlich einfach sein, denn das Ändern der Lautstärke ist das gleiche wie das Ändern der Amplitude des Signals, und ich muss es nur abschwächen, das heißt es für eine Zahl zwischen 0 und 1 multiplizieren. Aber es tut nicht t Arbeit: Der neue Sound ist niedriger, aber sehr laut. Was mache ich falsch?

Hier ist mein Code:

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() 

Danke Jungs!

+2

Warum verwenden Sie '* 5/10' anstelle von'/2'? –

+1

Wenn ich raten müsste, würde ich sagen, dass der '* 5'-Teil abschneidet und überläuft. –

+2

Liest du die Datei in der richtigen Endianness? [WAV-Dateien sind Little-Endian.] (Http://www.archive.org/web/19991115123323/http://www.borg.com/~jglatt/tech/wave.htm) Mit dem anderen Endian wird die Hälfte Probe und fügen Sie eine Menge Lärm hinzu. –

Antwort

3

Wie Sie in den Kommentaren der Frage sehen können, gibt es mehrere Lösungen, einige effizienter.

Das Problem sofort von Jan Dvorak („die * 5 Teil clippt und überfüllt“) und die einfache Lösung gefunden wurde:

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

In diesem Fall ist diese Lösung perfekt für mich war, nur gut

genug.

Vielen Dank alle Leute!

11

Ich schrieb einen library to simplify this type of thing

Sie können das tun, wie so:

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") 
+0

Könnten Sie Mr. Astley stattdessen um 36 dB abschwächen? – msw

+0

@msw sicher, dass wäre 'Song = Lied - 36' – Jiaaro