Ich persönlich bevorzuge Spektrogramme als Eingabe für neuronale Netze, wenn es um Klangklassifikation geht. Auf diese Weise werden rohe Audiodaten in eine Bilddarstellung umgewandelt und Sie können sie wie eine grundlegende Bildklassifizierungsaufgabe behandeln.
Es gibt eine Reihe von Möglichkeiten zur Auswahl, hier ist das, was ich in der Regel scipy Sie verwenden, python_speech_features und 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)
Zuerst müssen Sie Ihre Audio-Dateien in Bezug auf die Abtastrate und Kanäle standardisieren . Sie können das (und mehr) mit dem ausgezeichneten pydub Paket tun.
Danach müssen Sie Ihr Audiosignal in ein Bild mit FFT umwandeln. Sie können das mit scipy.io.wavefile und dem sigproc-Modul python_speech_features tun. Ich mag das Magnitudenspektrogramm, drehe es um 90 Grad, normalisiere es und verwende das resultierende NumPy-Array als Eingabe für meine Convnets. Sie können durch Einstellen der Werte von winstep und NFFT passen Ihre Eingabegröße die räumlichen Dimensionen des Spektrogramm ändern.
Es könnte leichtere Möglichkeiten geben, all dies zu tun; Mit dem obigen Code habe ich insgesamt gute Klassifikationsergebnisse erzielt.
Warum sollte das Spektrogramm um 90 Grad gedreht werden? – Androbin
Es spielt keine Rolle für die Convnet-Eingabe, nur um zu sehen und zu verstehen, was es darstellt (Spektrogramme haben normalerweise Zeit als x-Achse). Sie können die 90-Grad-Drehung einfach ignorieren, wenn Sie das Spektrogramm nicht visualisieren. –
Sie sollten auch beachten, dass der Mittelwert (Achse = 0) nur für Spalten der Mittelwert ist. Die mittlere Subtraktion für das gesamte Spektrogramm benötigt axis = None (was der Standardwert ist). –