Извлечение звукового спектра из аудиофайла с помощью Python
Извините, если я отправляю дубликат, но мне интересно, есть ли какая-нибудь библиотека в python, которая позволяет вам извлекать звуковой спектр из аудиофайлов. Я хочу иметь возможность взять аудиофайл и написать алгоритм, который будет возвращать набор данных {TimeStampInFile; Амплитудно-частотная}.
Я слышал, что это обычно называется обнаружением биений, но, насколько я вижу, детекция биений не является точным методом, он хорош только для визуализации, хотя я хочу манипулировать извлеченными данными и затем преобразовывать их обратно в аудиофайл. Мне не нужно делать это в режиме реального времени.
Буду признателен за любые предложения и рекомендации.
2 ответа
Я думаю, что ваш вопрос состоит из трех отдельных частей:
- Как загрузить аудио файлы в Python?
- Как рассчитать спектр в питоне?
- Что делать со спектром?
1. Как загрузить аудио файлы в python?
Вы, вероятно, лучше всего, используя scipy
, поскольку он предоставляет множество функций обработки сигналов. Для загрузки аудиофайлов:
import scipy.io.wavfile
samplerate, data = scipy.io.wavfile.read("mywav.wav")
Теперь у вас есть частота дискретизации (образцов / с) в samplerate
и данные как numpy.array
в data
, Вы можете захотеть преобразовать данные в число с плавающей запятой, в зависимости от вашего приложения.
Существует также стандартный модуль Python wave
для загрузки wav-файлов, но numpy
/scipy
предлагает более простой интерфейс и больше возможностей для обработки сигналов.
2. Как рассчитать спектр
Краткий ответ: используйте БПФ. Для большего количества слов мудрости, см.:
Анализировать аудио с помощью быстрого преобразования Фурье
Более длинный ответ довольно длинный. Оконное управление очень важно, иначе у вас будут странные спектры.
3. Что делать со спектром
Это немного сложнее. Фильтрация часто выполняется во временной области для более длинных сигналов. Возможно, если вы скажете нам, чего хотите достичь, вы получите хороший ответ на этот вопрос. Вычисление частотного спектра - это одно, получить значимые результаты при обработке сигнала немного сложнее.
(Я знаю, что вы не спрашивали об этом, но я вижу, что это происходит с вероятностью >> 0. Конечно, возможно, у вас есть хорошие знания по обработке аудиосигнала, и в этом случае это не имеет значения.)
Вы можете вычислить и визуализировать спектр и спектрограмму, используя scipy, для этого теста я использовал этот аудиофайл: vignesh.wav
from scipy.io import wavfile # scipy library to read wav files
AudioName = "vignesh.wav" # Audio File
fs, Audiodata = wavfile.read(AudioName)
# Plot the audio signal in time
import matplotlib.pyplot as plt
plt.plot(Audiodata)
plt.title('Audio signal in time',size=16)
# spectrum
from scipy.fftpack import fft # fourier transform
n = len(Audiodata)
AudioFreq = fft(Audiodata)
AudioFreq = AudioFreq[0:int(np.ceil((n+1)/2.0))] #Half of the spectrum
MagFreq = np.abs(AudioFreq) # Magnitude
MagFreq = MagFreq / float(n)
# power spectrum
MagFreq = MagFreq**2
if n % 2 > 0: # ffte odd
MagFreq[1:len(MagFreq)] = MagFreq[1:len(MagFreq)] * 2
else:# fft even
MagFreq[1:len(MagFreq) -1] = MagFreq[1:len(MagFreq) - 1] * 2
plt.figure()
freqAxis = np.arange(0,int(np.ceil((n+1)/2.0)), 1.0) * (fs / n);
plt.plot(freqAxis/1000.0, 10*np.log10(MagFreq)) #Power spectrum
plt.xlabel('Frequency (kHz)'); plt.ylabel('Power spectrum (dB)');
#Spectrogram
from scipy import signal
N = 512 #Number of point in the fft
f, t, Sxx = signal.spectrogram(Audiodata, fs,window = signal.blackman(N),nfft=N)
plt.figure()
plt.pcolormesh(t, f,10*np.log10(Sxx)) # dB spectrogram
#plt.pcolormesh(t, f,Sxx) # Lineal spectrogram
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [seg]')
plt.title('Spectrogram with scipy.signal',size=16);
Я проверил весь код, и он работает, вам нужно, numpy, matplotlib и scipy.
ура