2012-03-26 15 views
5

Próbuję użyć modułu Python Wave, aby pobrać plik audio i pobrać z niego wszystkie ramki, przeanalizować je, a następnie zapisać w innym pliku . Próbowałem odtworzyć dźwięk, który właśnie czytam, do innego pliku, ale wyszedł jako szum albo jako brak dźwięku. Jestem prawie pewien, że nie analizuję pliku i nie otrzymuję właściwych ramek ...? Mam do czynienia z stereofonicznym 16-bitowym plikiem dźwiękowym. Chociaż mógłbym użyć prostszego pliku, aby po prostu zrozumieć proces, w końcu chcę mieć możliwość zaakceptowania dowolnego pliku dźwiękowego do pracy, więc muszę zrozumieć, na czym polega problem.Używanie modułu Wave Python do pobierania i zapisu dźwięku

Zauważyłem również, że 32-bitowe pliki dźwiękowe nie zostaną odczytane przez moduł Wave - spowodowało to błąd "Nieznanego formatu". Jakieś pomysły na ten temat? Czy to coś, co mogę ominąć, abym mógł przynajmniej na przykład przeczytać 32-bitowe pliki audio, nawet jeśli mogę "renderować" tylko pliki 16-bitowe?

Jestem nieco świadomy, że pliki falowe są przeplatane pomiędzy kanałem lewym i prawym (pierwsza próbka dla lewego kanału, druga dla prawej itd.)., Ale jak mogę oddzielić kanały? Oto mój kod. Wyciąłem kod wyjściowy, aby zobaczyć, czy poprawnie odczytuję pliki. Używam Python 2.7.2:

import scipy 
import wave 
import struct 
import numpy 
import pylab 

fp = wave.open('./sinewave16.wav', 'rb') # Problem loading certain kinds of wave files in binary? 

samplerate = fp.getframerate() 
totalsamples = fp.getnframes() 
fft_length = 2048 # Guess 
num_fft = (totalsamples/fft_length) - 2 

temp = numpy.zeros((num_fft, fft_length), float) 

leftchannel = numpy.zeros((num_fft, fft_length), float) 
rightchannel = numpy.zeros((num_fft, fft_length), float) 

for i in range(num_fft): 

    tempb = fp.readframes(fft_length/fp.getnchannels()/fp.getsampwidth()); 

    #tempb = fp.readframes(fft_length) 

    up = (struct.unpack("%dB"%(fft_length), tempb)) 

    #up = (struct.unpack("%dB"%(fft_length * fp.getnchannels() * fp.getsampwidth()), tempb)) 
    #print (len(up)) 
    temp[i,:] = numpy.array(up, float) - 128.0 


temp = temp * numpy.hamming(fft_length) 

temp.shape = (-1, fp.getnchannels()) 

fftd = numpy.fft.rfft(temp) 

pylab.plot(abs(fftd[:,1])) 

pylab.show() 

#Frequency of an FFT should be as follows: 

#The first bin in the FFT is DC (0 Hz), the second bin is Fs/N, where Fs is the sample rate and N is the size of the FFT. The next bin is 2 * Fs/N. To express this in general terms, the nth bin is n * Fs/N. 
# (It would appear to me that n * Fs/N gives you the hertz, and you can use sqrt(real portion of number*r + imaginary portion*i) to find the magnitude of the signal 

Obecnie będzie to załadować plik dźwiękowy, rozpakować go do struktury, i wykreślić plik dźwiękowy tak, że mogę na to patrzeć, ale nie sądzę, dostaje cały plik audio lub nie robi tego poprawnie. Czy poprawnie odczytuję plik wave do struktury? Czy są jakieś aktualne zasoby dotyczące używania Pythona do odczytywania i analizowania plików wave/audio? Każda pomoc będzie bardzo ceniona.

+0

Oto [mały tutorial] (http://soledadpenades.com/2009/10/29/fastest-way-to -generate-wav-files-in-python-using-the-wave-module /) o pakiecie fal. – Trilarion

Odpowiedz

Powiązane problemy