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