2012-11-11 3 views
10

में एक WAV फ़ाइल की मात्रा बदलें मेरे पास 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() 

तुम लोग धन्यवाद:

यहाँ मेरी कोड है!

+2

आप '/ 2' के बजाय' * 5/10' का उपयोग क्यों कर रहे हैं? –

+1

अगर मुझे लगता है, तो मैं कहूंगा कि '* 5' भाग क्लिपिंग और बह रहा है। –

+2

क्या आप सही अंतहीनता में फ़ाइल पढ़ रहे हैं? [डब्ल्यूएवी फाइलें छोटी-छोटी हैं।] (Http://web.archive.org/web/19991115123323/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

क्या आप इसके बजाय 36 डीबी द्वारा श्री एस्टली को क्षीण कर सकते हैं? – msw

+0

@msw यकीन है कि 'गीत = गीत - 36' होगा – Jiaaro