2012-03-26 1 views
5

Итак, я пытаюсь использовать модуль Python Wave для получения аудиофайла и в основном извлекать из него все кадры, анализировать их и затем записывать обратно в другой файл , Я попытался вывести звук, который я сейчас читаю в другой файл, но он вышел либо как шум, либо как звук вообще. Итак, я уверен, что не анализирую файл и не получаю правильные фреймы ...? Я имею дело со стерео 16-битным звуковым файлом. Хотя я мог бы использовать более простой файл, чтобы просто понять процесс, я в конечном итоге хочу иметь возможность принимать любые звуковые файлы для работы, поэтому мне нужно понять, в чем проблема.Использование модуля Wave Python для получения и записи аудио

Я также отметил, что 32-битные звуковые файлы не будут прочитаны модулем Wave - это дало мне ошибку «Неизвестный формат». Есть идеи по этому поводу? Это что-то, что я могу обойти, чтобы я мог, например, читать 32-битные аудиофайлы, даже если я могу только «визуализировать» 16-битные файлы?

Я знаю, что волновые файлы чередуются между левым и правым каналами (первый образец для левого канала, второй справа и т. Д.). Но как я могу отделить каналы? Вот мой код. Я вырезал выходной код, чтобы посмотреть, правильно ли я читаю файлы. Я использую 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 

В настоящее время, это будет загрузить звуковой файл, распаковать его в структуры, и построить звуковой файл, так что я могу смотреть на него, но я не думаю, он получает весь аудиофайл, или он не получает его правильно. Я правильно читаю волновой файл в структуре? Существуют ли какие-либо современные ресурсы по использованию Python для чтения и анализа волновых/звуковых файлов? Любая помощь будет принята с благодарностью.

+0

Вот это [маленький учебник] (http://soledadpenades.com/2009/10/29/fastest-way-to -генератор-wav-files-in-python-using-the-wave-module /) о волновом пакете. – Trilarion

ответ

6

Может быть, вы должны попробовать модуль SciPy io.wavefile:

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

+0

Спасибо за предложение. Я проверю это. – SolarLune

+0

Я только что проверил это, и, похоже, он ясно читает звук, что хорошо. Спасибо за предложение. – SolarLune

+1

Ссылка мертва, это новая: http://docs.scipy.org/doc/scipy/reference/io.html – Kaifei