2012-11-11 173 views
10

我有一個2秒16位單聲道8khz wav文件,我需要更改其音量。更改python中的wav文件的音量

它應該是非常簡單的,因爲改變音量與改變信號幅度是一樣的,我只需要對它進行衰減,即把它乘以0到1之間的一個數。但它不會「 t工作:新的聲音較低但非常充滿噪音。我究竟做錯了什麼?

這裏是我的代碼:

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

爲什麼使用'* 5/10'而不是'/ 2'? –

+1

如果我不得不猜測,我會說'* 5'部分正在削減和溢出。 –

+2

您是否正在以正確的字節順序讀取文件? [WAV文件是little-endian。](http://web.archive.org/web/199​​91115123323/http://www.borg.com/~jglatt/tech/wave.htm)使用其他endian將減半樣品並添加大量噪音。 –

回答

3

正如你在問題的意見看,有幾種解決方案,一些更有效率。

問題立刻由Jan德沃夏克(下稱「* 5部分裁剪和溢出」)和直接的解決方案檢測的是:

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

在這種情況下,該解決方案是完美的我,剛剛好足夠。

謝謝大家!

11

我寫了一個library to simplify this type of thing

你能做到這一點,像這樣:

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

您能否將Astley先生減少36dB? – msw

+0

@msw肯定會是'song = song - 36' – Jiaaro