Я лично предпочитаю спектрограммы в качестве входных данных для нейронных сетей, когда речь идет о классификации звука. Таким образом, исходные аудиоданные преобразуются в представление изображения, и вы можете рассматривать его как базовую задачу классификации изображений.
Есть несколько способов, чтобы выбрать из, вот что я обычно используя SciPy, python_speech_features и pydub:
import numpy as np
import scipy.io.wavfile as wave
import python_speech_features as psf
from pydub import AudioSegment
#your sound file
filepath = 'my-sound.wav'
def convert(path):
#open file (supports all ffmpeg supported filetypes)
audio = AudioSegment.from_file(path, path.split('.')[-1].lower())
#set to mono
audio = audio.set_channels(1)
#set to 44.1 KHz
audio = audio.set_frame_rate(44100)
#save as wav
audio.export(path, format="wav")
def getSpectrogram(path, winlen=0.025, winstep=0.01, NFFT=512):
#open wav file
(rate,sig) = wave.read(path)
#get frames
winfunc=lambda x:np.ones((x,))
frames = psf.sigproc.framesig(sig, winlen*rate, winstep*rate, winfunc)
#Magnitude Spectrogram
magspec = np.rot90(psf.sigproc.magspec(frames, NFFT))
#noise reduction (mean substract)
magspec -= magspec.mean(axis=0)
#normalize values between 0 and 1
magspec -= magspec.min(axis=0)
magspec /= magspec.max(axis=0)
#show spec dimensions
print magspec.shape
return magspec
#convert file if you need to
convert(filepath)
#get spectrogram
spec = getSpectrogram(filepath)
Во-первых, необходимо стандартизировать свои аудио файлы с точки зрения частоты дискретизации и каналов , Вы можете сделать это (и многое другое) с отличным пакетом pydub.
После этого вам необходимо преобразовать аудиосигнал в изображение с помощью FFT. Вы можете сделать это с помощью scipy.io.wavefile и модуля sigproc python_speech_features. Мне нравится спектрограмма величины, поворачивайте ее на 90 градусов, нормализуйте ее и используйте полученный массив NumPy в качестве входных данных для моих коннектов. Вы можете изменить пространственные размеры спектрограммы путем корректировки значений WinStep и NFFT, чтобы соответствовать размеру входного сигнала.
Могут быть более простые способы сделать все это; Я получил хорошие результаты общей классификации, используя приведенный выше код.
Почему спектрограмма должна вращаться на 90 градусов? – Androbin
Это не имеет значения для входа в конвете, только для просмотра и понимания того, что он изображает (спектрограммы обычно имеют время как ось x). Вы можете просто игнорировать поворот на 90 градусов, если вы не собираетесь визуализировать спектрограмму. –
Следует также отметить, что среднее значение (ось = 0) является средним значением только для столбцов. Среднему значению для всей спектрограммы требуется ось = Нет (что является значением по умолчанию). –