2013-03-22 15 views
8

Próbuję programowo podzielić plik wav w języku Python. Na podstawie wskazówek z stackoverflow, jak również dokumentacji z modułu fali Python robię następującedzielenie pliku wav w pytonie

import wave 

origAudio = wave.open('inputFile.wav','r') 
frameRate = origAudio.getframerate() 
nChannels = origAudio.getnchannels() 
sampWidth = origAudio.getsampwidth() 

start = float(someStartVal) 
end = float(someEndVal) 

origAudio.setpos(start*frameRate) 
chunkData = origAudio.readframes(int((end-start)*frameRate)) 

chunkAudio = wave.open('outputFile.wav','w') 
chunkAudio.setnchannels(nChannels) 
chunkAudio.setsampwidth(sampWidth) 
chunkAudio.setframerate(frameRate) 
chunkAudio.writeframes(chunkData) 
chunkAudio.close() 

iterację kilku różnych początkowych i końcowych wartości, a ekstrakt fragmenty audio z pliku w oryginalnym w ten sposób. Dziwne jest to, że ta technika działa doskonale w przypadku niektórych fragmentów i wytwarza biały szum dla innych. Nie ma też oczywistego wzorca, który z pozycji początkowej i końcowej generuje biały szum, tylko że dzieje się to konsekwentnie dla pliku wejściowego.

Ktoś wcześniej doświadczał tego rodzaju zachowań? Czy wiesz, co robię źle? Sugerowane są sugestie dotyczące lepszego sposobu dzielenia pliku audio programowo.

Z góry dziękuję.

+1

Może to mieć związek z 'start * frameRate' będącym zmienną podczas wywoływania' setpos'. Być może po 'readframes' powinieneś użyć' tell' aby znaleźć bieżące położenie wskaźnika pliku zamiast ... – unutbu

+0

arrgh! Głupi ze mnie ... dzięki. to naprawiło :) – user13321

+0

kiedy używam tell w miejsce setpos, mogę uzyskać błąd: tell() przyjmuje 1 argument pozycyjny, ale 2 zostały podane –

Odpowiedz

5

Może to być związane z start*frameRate byciem float podczas wywoływania setpos. Być może po readframes należy użyć tell, aby znaleźć bieżące położenie wskaźnika pliku zamiast ..