Итак, я пытаюсь использовать модуль 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 для чтения и анализа волновых/звуковых файлов? Любая помощь будет принята с благодарностью.
Вот это [маленький учебник] (http://soledadpenades.com/2009/10/29/fastest-way-to -генератор-wav-files-in-python-using-the-wave-module /) о волновом пакете. – Trilarion