2012-11-11 146 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

なぜ「/ 2」ではなく「* 5/10」を使用していますか? –

+1

もし私が推測しなければならないのは、 '* 5 'の部分がクリッピングしていることです。 –

+2

正しいエンディアンでファイルを読んでいますか? [WAVファイルはリトルエンディアンです。](http://web.archive.org/web/199​​91115123323/http://www.borg.com/~jglatt/tech/wave.htm)もう一方のエンディアンを使用すると、サンプルを追加し、多くのノイズを追加します。 –

答えて

3

ご質問のコメントで見ることができるように、いくつかの解決策、より効率的ないくつかがあります。

問題はすぐに月ドヴォルザークによって検出された(「* 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

アストリー氏を36dB減らすことができますか? – msw

+0

@msw確かに 'song = song - 36' – Jiaaro

関連する問題