15

2 秒の 16 ビット シングル チャネル 8khz 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()

君たちありがとう!

4

4 に答える 4

19

この種のことを単純化するためのライブラリを作成しました

次のようにできます。

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")
于 2012-12-05T22:30:11.857 に答える
7

質問のコメントでわかるように、いくつかの解決策があり、いくつかはより効率的です。

この問題は Jan Dvorak によってすぐに検出され (「* 5 の部分がクリッピングしてオーバーフローしています」)、簡単な解決策は次のとおりです。

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

この場合、このソリューションは私にとって完璧で、十分でした。

ありがとうございます!

于 2012-12-25T13:10:01.570 に答える