Извлечение звукового спектра из аудиофайла с помощью Python

Извините, если я отправляю дубликат, но мне интересно, есть ли какая-нибудь библиотека в python, которая позволяет вам извлекать звуковой спектр из аудиофайлов. Я хочу иметь возможность взять аудиофайл и написать алгоритм, который будет возвращать набор данных {TimeStampInFile; Амплитудно-частотная}.

Я слышал, что это обычно называется обнаружением биений, но, насколько я вижу, детекция биений не является точным методом, он хорош только для визуализации, хотя я хочу манипулировать извлеченными данными и затем преобразовывать их обратно в аудиофайл. Мне не нужно делать это в режиме реального времени.

Буду признателен за любые предложения и рекомендации.

2 ответа

Решение

Я думаю, что ваш вопрос состоит из трех отдельных частей:

  1. Как загрузить аудио файлы в Python?
  2. Как рассчитать спектр в питоне?
  3. Что делать со спектром?

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.

ура

Другие вопросы по тегам