2017-07-13 17 views
5

Ses hızını% 50 azaltmaya çalışmak için python'daki dalga kütüphanesini kullanıyorum. Başarılı oldum, ama sadece doğru kanalda. Sol kanalda bir bütün statiktir.Programım müzik hızını% 50 azaltır, ancak sadece bir kanalda

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) 

neden bu? sadece ham verileri kopyalayıp yapıştıracağımdan, statik olarak üretemiyorum düzenleme: Ben çağlar için arıyorum ve sonunda dalga biçimi için yararlı bir kaynak buldum: http://soundfile.sapp.org/doc/WaveFormat/ Eğer stereo ses korumak istiyorsanız, 4 gerçek örnek genişliğini kopyalamak gerekiyor gibi görünüyor iki kez. İki kanal olduğundan bu ve onlar kadar yerine 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)` 

Düzenleme 4 bayt almak 2: Tamam ben beni bunu yapmaya sürdü hiçbir fikrim yok ama zaten bu beni veriyor özgürlükleri zevk alıyorum . Wav dosyasını belleğe kopyalamayı, kopyayı doğrudan düzenlemeyi ve bir çıktı dosyasına yazmayı seçtim. Sonuçlarla inanılmaz derecede mutluyum. Bir dalgayı içe aktarabilirim, sesi bir kez tekrarlayıp, bir çıktı dosyasına yazabilirim, sadece 0,2 saniyede. Bu hızın yarı yarıya azaltılması, eski kodumun wav eklentisini kullanarak sadece 30 saniye yerine sadece 30 saniye sürüyor :) işte bu kod, hala optimize edilmemiş bir şeydi ama ne olduğundan daha iyi.

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()) 

Kodun ne kadar küçük olduğuna şaşırdım.

+0

İlk düşüncem bu dosyanın kendisi ile ilgili bir sorun olmasıdır. Doğru kanalı susturmayı ve sadece solda tam hızda dinlemeyi denediniz mi? Dosyanızı yeniden kodlayarak ve programınızı tekrar çalıştırarak programın olup olmadığını kontrol edebilirsiniz. Diğer ses dosyalarını kullanmayı denediniz mi? – NuclearPeon

+2

@NuclearPeon Ses dosyasıyla ilgili bir sorun görünmüyor. Ben test etmek için bir rasgele wav dosyası indirilen ve aynı şey – Wondercricket

cevap

3

readframes tarafından döndürülen öğelerin her biri, tür int olsa bile, tek bir bayttır. Bir ses örneği tipik olarak 2 bayttır. Her bir örnek yerine her baytı iki katına çıkararak, gürültü elde edersiniz.

Tek kanalın neden işe yarayacağı konusunda hiçbir fikrim yok, soruda gösterilen kod tüm gürültü olmalıdır.

Bu kısmi bir düzeltmedir. Hala sol ve sağ kanalı karıştırır, ancak size neyin işe yarayacağı hakkında bir fikir verecektir.

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]) 

Düzenleme: Burada stereo olarak çalışması gereken kod. Bir seferde 4 bayt, sol kanal için 2 ve sağdaki 2 kopyalar, sonra tekrar ikiye katlamak için yapar. Bu kanal verilerinin serpiştirilmesini engeller.

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

yapar, ben standart 16 bit yerine sadece 1 bayt okumak fark etmedi. Stereo sesi doğru şekilde koruyup korumadığını görmek için dosyayı audacity olarak analiz edeceğim. –

+0

ne yazık ki yapmadı. –

+0

@AnthonyPierson Düzenlemeyi dene. –