2012-03-26 4 views
5

Also, ich versuche, das Python-Wave-Modul zu verwenden, um eine Audio-Datei zu erhalten und alle Frames daraus zu bekommen, sie zu untersuchen und sie dann in eine andere Datei zu schreiben . Ich habe gerade versucht, den Sound, den ich gerade lese, in eine andere Datei zu übertragen, aber es kam entweder als Rauschen oder als überhaupt kein Ton heraus. Also bin ich mir ziemlich sicher, dass ich die Datei nicht analysiere und die richtigen Frames bekomme ...? Ich habe es mit einer Stereo-16-Bit-Sounddatei zu tun. Während ich eine einfachere Datei verwenden könnte, um den Prozess einfach zu verstehen, möchte ich schließlich in der Lage sein, jede Art von Audiodatei zu akzeptieren, mit der ich arbeiten kann. Ich muss also verstehen, was das Problem ist.Verwenden von Wave Python-Modul zum Abrufen und Schreiben von Audio

Ich bemerkte auch, dass 32-Bit-Sound-Dateien nicht von der Wave-Modul gelesen werden würde - es gab mir einen Fehler von "Unbekanntes Format". Irgendwelche Ideen dazu? Kann ich das umgehen, damit ich zumindest 32-Bit-Audiodateien lesen kann, auch wenn ich nur 16-Bit-Dateien "rendern" kann?

Ich bin mir ziemlich bewusst, dass Wave-Dateien zwischen den linken und rechten Kanälen verschachtelt sind (erste Probe für den linken Kanal, zweite für die rechte, etc), aber wie kann ich die Kanäle trennen? Hier ist mein Code. Ich schneide den Ausgabecode aus, um nur zu sehen, ob ich die Dateien richtig lese. Ich verwende 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 

Derzeit wird dies die Sound-Datei zu laden, entpacken Sie es in einer Struktur, und zeichnen Sie die Audio-Datei, so dass ich es sehe, aber ich glaube nicht, dass Es wird die gesamte Audiodatei oder sie wird nicht korrekt wiedergegeben. Lies ich die Wave-Datei korrekt in die Struktur ein? Gibt es aktuelle Ressourcen zur Verwendung von Python zum Lesen und Analysieren von Wave-/Audio-Dateien? Jede Hilfe würde sehr geschätzt werden.

+0

Hier ist ein [kleines Tutorial] (http://soledadpenades.com/2009/10/29/fastest-way-to -generate-wav-files-in-python-mit-dem-wellen-modul /) über das wave-paket. – Trilarion

Antwort

6

Vielleicht sollten Sie versuchen, das SciPy io.wavefile Modul:

http://docs.scipy.org/doc/scipy/reference/io.html

+0

Danke für den Vorschlag. Ich werde das überprüfen. – SolarLune

+0

Ich habe es gerade überprüft, und es scheint, den Ton klar zu lesen, was gut ist. Danke für den Vorschlag. – SolarLune

+1

Der Link ist tot, das ist der neue: http://docs.scipy.org/doc/scipy/reference/io.html – Kaifei

Verwandte Themen