2017-02-19 4 views
1

Ich entwickle gerade einen Audio Klassifikator mit der Python API von TensorFlow, benutze den UrbanSound8K Datensatz und versuche zwischen 10 sich gegenseitig ausschließenden Klassen zu unterscheiden.Wie sollte Audio für die Klassifizierung vorverarbeitet werden?

Die Audiodateien sind 4 Sekunden lang und enthalten 176400 Datenpunkte, was zu schwerwiegenden Speicherproblemen führt. Wie sollte das Audio vorverarbeitet werden, um die Speichernutzung zu reduzieren?

Und wie können weitere nützliche Funktionen aus dem Audio extrahiert werden (mit Faltung und Pooling)?

Antwort

1

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.

+0

Warum sollte das Spektrogramm um 90 Grad gedreht werden? – Androbin

+0

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. –

+1

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). –

Verwandte Themen