2017-07-13 6 views
5

मैं 50% तक ऑडियो की गति को कम करने के प्रयास में पाइथन में तरंग लाइब्रेरी का उपयोग कर रहा हूं। मैं सफल रहा हूं, लेकिन केवल सही चैनल में। बाएं चैनल में यह स्थैतिक का एक पूरा गुच्छा है।मेरा प्रोग्राम 50% तक संगीत की गति को कम करता है लेकिन केवल एक चैनल में

import wave,os,math 
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio 
compression\Audio compression\aha.wav","r") 
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio 
compression\Audio compression\ahaout.wav","w") 
frames=r.readframes(r.getnframes()) 
newframes=bytearray() 
w.setparams(r.getparams()) 
for i in range(0,len(frames)-1): 
    newframes.append(frames[i]) 
    newframes.append(frames[i]) 
w.writeframesraw(newframes) 

यह क्यों है? चूंकि मैं केवल कच्चे डेटा की प्रतिलिपि बना रहा हूं और पेस्ट कर रहा हूं, इसलिए मैं स्थिर उत्पन्न नहीं कर सकता हूं? संपादित करें: मैं उम्र की तलाश कर रहा हूं और अंत में मुझे लहर प्रारूप के लिए एक उपयोगी संसाधन मिला: http://soundfile.sapp.org/doc/WaveFormat/ यदि मैं स्टीरियो ध्वनि को संरक्षित करना चाहता हूं, तो ऐसा लगता है कि मुझे वास्तविक नमूना चौड़ाई 4 की प्रतिलिपि बनाने की आवश्यकता है। इसका कारण यह है कि दो चैनल हैं और वे 2.

`import wave 
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio 
compression\Audio compression\aha.wav","r") 
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio 
compression\Audio compression\ahaout.wav","w") 
frames=r.readframes(r.getnframes()) 
newframes=bytearray() 
w.setparams(r.getparams()) 
w.setframerate(r.getframerate()) 
print(r.getsampwidth()) 
for i in range(0,len(frames)-4,4): 
    newframes.append(frames[i]) 
    newframes.append(frames[i+1]) 
    newframes.append(frames[i+2]) 
    newframes.append(frames[i+3]) 
    newframes.append(frames[i]) 
    newframes.append(frames[i+1]) 
    newframes.append(frames[i+2]) 
    newframes.append(frames[i+3]) 
w.writeframesraw(newframes)` 

संपादित करने के बजाय 4 बाइट लेने के 2: ठीक है मुझे पता नहीं कि मुझे क्या दिया यह करने के लिए है, लेकिन मैं पहले से ही स्वतंत्रता यह मुझे दे रहा है आनंद ले रहा हूँ । मैंने wav फ़ाइल को स्मृति में कॉपी करने, प्रतिलिपि को सीधे संपादित करने और इसे आउटपुट फ़ाइल में लिखने का विकल्प चुना है। मैं परिणामों के साथ अविश्वसनीय रूप से खुश हूँ। मैं एक वाव आयात कर सकता हूं, एक बार ऑडियो दोहरा सकता हूं, और इसे केवल 0.2 सेकंड में आउटपुट फ़ाइल में लिख सकता हूं। आधे गुना से गति को कम करने के लिए अब मेरे पुराने कोड के साथ 30 सेकंड सेकेंड के बजाय केवल 9 सेकंड लेते हैं, WAV प्लगइन का उपयोग करते हुए :) यहां कोड है, फिर भी मुझे लगता है कि यह अनुकूलित नहीं है लेकिन यह उससे बेहतर है।

import struct 
import time as t 
t.clock() 
r=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing 
software/main/aha.wav","rb") 
w=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing 
software/main/output.wav","wb") 
rbuff=bytearray(r.read()) 
def replacebytes(array,bites,stop): 
    length=len(bites) 
    start=stop-length 
    for i in range(start,stop): 
     array[i]=bites[i-start] 
def write(audio): 
    w.write(audio) 
def repeat(audio,repeats): 
    if(repeats==1): 
     return(audio) 
    if(repeats==0): 
     return(audio[:44]) 
    replacebytes(audio, struct.pack('<I', struct.unpack('<I',audio[40:44]) 
[0]*repeats), 44) 
    return(audio+(audio[44:len(audio)-58]*(repeats-1))) 
def slowhalf(audio): 
    buff=bytearray() 
    replacebytes(audio, struct.pack('<I', struct.unpack('<I',audio[40:44]) 
[0]*2), 44) 
    for i in range(44,len(audio)-62,4): 
     buff.append(audio[i]) 
     buff.append(audio[i+1]) 
     buff.append(audio[i+2]) 
     buff.append(audio[i+3]) 
     buff.append(audio[i]) 
     buff.append(audio[i+1]) 
     buff.append(audio[i+2]) 
     buff.append(audio[i+3]) 
    return(audio[:44]+buff) 
rbuff=slowhalf(rbuff) 
write(rbuff) 
print(t.clock()) 

मुझे आश्चर्य है कि कोड कितना छोटा है।

+0

मेरा पहला विचार यह है कि यह फ़ाइल के साथ ही एक मुद्दा है। क्या आपने सही चैनल को म्यूट करने और पूरी गति से बाईं ओर सुनने की कोशिश की है? आप यह जांच सकते हैं कि यह मोनो में आपकी फ़ाइल को फिर से एन्कोड करके और फिर अपने प्रोग्राम के माध्यम से इसे चलाकर प्रोग्राम है या नहीं। क्या आपने अन्य ऑडियो फाइलों का उपयोग करने की कोशिश की है? – NuclearPeon

+2

@NuclearPeon ऑडियो फ़ाइल के साथ कोई समस्या नहीं प्रतीत होता है। मैंने परीक्षण करने के लिए एक यादृच्छिक WAV फ़ाइल डाउनलोड की है और यह वही काम करता है – Wondercricket

उत्तर

3

readframes द्वारा लौटाए गए प्रत्येक तत्व एक बाइट है, भले ही प्रकार int है। एक ऑडियो नमूना आमतौर पर 2 बाइट्स होता है। प्रत्येक पूरे नमूने के बजाय प्रत्येक बाइट को दोगुना करके, आपको शोर मिलता है।

मुझे नहीं पता कि एक चैनल क्यों काम करेगा, प्रश्न में दिखाए गए कोड के साथ सभी शोर होना चाहिए।

यह एक आंशिक फिक्स है। यह अभी भी बाएं और दाएं चैनल को अंतःस्थापित करता है, लेकिन यह आपको एक विचार देगा कि क्या काम करेगा।

for i in range(0,len(frames)-1,2): 
    newframes.append(frames[i]) 
    newframes.append(frames[i+1]) 
    newframes.append(frames[i]) 
    newframes.append(frames[i+1]) 

संपादित करें: यहां कोड है जो स्टीरियो में काम करना चाहिए। यह एक समय में 4 बाइट प्रतिलिपि बनाता है, बाएं चैनल के लिए 2 और दाईं ओर 2, फिर इसे दोबारा खोलने के लिए करता है। यह चैनल डेटा को अंतःस्थापित करने से रोक देगा।

for i in range(0, len(frames), 4): 
    for _ in range(2): 
     for j in range(4): 
      newframes.append(frames[i+j]) 
+0

धन्यवाद, मुझे एहसास नहीं हुआ कि यह मानक 16 बिट्स के बजाय केवल 1 बाइट पढ़ता है। मैं यह देखने के लिए ऑडैसिटी में फ़ाइल का विश्लेषण करूंगा कि क्या यह स्टीरियो ध्वनि को सही ढंग से संरक्षित करता है या नहीं। –

+0

दुख की बात यह नहीं थी। –

+0

@ एंथनीपीरसन मेरे संपादन का प्रयास करें। –

संबंधित मुद्दे