2012-03-26 11 views
5

lo tanto, estoy tratando de utilizar el módulo Wave Python para obtener un archivo de audio y básicamente obtener todos los marcos de ella, examinarlos, ya continuación escribirlos de nuevo a otro archivo . Traté de enviar el sonido que estoy leyendo a otro archivo en este momento, pero salió como ruido o como ningún sonido. Entonces, estoy bastante seguro de que no estoy analizando el archivo y obteniendo los marcos correctos ...? Estoy tratando con un archivo de sonido estéreo de 16 bits. Si bien podría utilizar un archivo más simple para comprender el proceso, eventualmente quiero poder aceptar cualquier tipo de archivo de sonido para trabajar, así que tengo que entender cuál es el problema.utilizando el módulo Python Wave obtener y escritura de audio

También tomó nota de que los archivos de sonido de 32 bits no serían leídos por el módulo de onda - me dio un error de "Formato Desconocido". Alguna idea sobre eso? ¿Es algo que puedo omitir para poder al menos, por ejemplo, leer archivos de audio de 32 bits, incluso si solo puedo 'renderizar' archivos de 16 bits?

Estoy algo consciente de que los archivos de onda están intercalados entre los canales izquierdo y derecho (primeras muestras para el canal izquierdo, segundo para el derecho, etc.). ¿Pero cómo se separan los canales? Aquí está mi código. Corté el código de salida para ver si estoy leyendo los archivos correctamente. Estoy usando 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 

Actualmente, esto va a cargar el archivo de sonido, descomprimirlo en una estructura, y trazar el archivo de sonido para que pueda mirarlo, pero no creo está obteniendo todo el archivo de audio, o no lo está obteniendo correctamente. ¿Estoy leyendo correctamente el archivo de onda en la estructura? ¿Hay recursos actualizados sobre el uso de Python para leer y analizar archivos de onda/audio? Cualquier ayuda sería muy apreciada.

+0

Aquí es un [pequeño tutorial] (http://soledadpenades.com/2009/10/29/fastest-way-to -generate-wav-files-in-python-using-the-wave-module /) sobre el paquete wave. – Trilarion

Respuesta

6

Tal vez debería probar el módulo de SciPy io.wavefile:

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

+0

Gracias por la sugerencia. Lo comprobaré. – SolarLune

+0

Acabo de comprobarlo, y parece leer el audio con claridad, lo cual es bueno. Gracias por la sugerencia. – SolarLune

+1

El enlace está muerto, este es el nuevo: http://docs.scipy.org/doc/scipy/reference/io.html – Kaifei

Cuestiones relacionadas