2016-04-27 11 views
1

Ich habe derzeit ein paar tausend Audio-Clips, die ich mit maschinellem Lernen klassifizieren muss.Plotten Audio Spektrogramm in Python

Nach einigem Graben fand ich, dass, wenn Sie eine kurze Fourier Transformation auf dem Audio machen, es in ein zweidimensionales Bild verwandelt, so dass ich verschiedene Bildklassifikationsalgorithmen auf diesen Bildern anstelle der Audiodateien selbst verwenden kann.

Zu diesem Zweck fand ich eine python package, die die STFT tut und alles was ich brauche ist es zu plotten, damit ich die Bilder bekommen kann. Zum Plotten fand ich this github repo sehr nützlich.

Schließlich endete mein Code als auf den Punkt:

import stft  
import scipy 
import scipy.io.wavfile as wav 
import matplotlib.pylab as pylab 

def save_stft_image(source_filename, destination_filename): 
    fs, audio = wav.read(source_filename) 
    X = stft.spectrogram(audio) 

    print X.shape  

    fig = pylab.figure()  
    ax = pylab.Axes(fig, [0,0,1,1])  
    ax.set_axis_off() 
    fig.add_axes(ax)  
    pylab.imshow(scipy.absolute(X[:][:][0].T), origin='lower', aspect='auto', interpolation='nearest') 
    pylab.savefig(destination_filename) 

save_stft_image("Example.wav","Example.png") 

Und Ausgabe lautet: enter image description here

Der Code funktioniert, aber ich festgestellt, dass, wenn print X.shape Linie I (513L, 943L, 2L) erhalten ausführt. Das Ergebnis ist also dreidimensional. Wenn ich also nur X[:][:][0] oder X[:][:][1] schreibe, bekomme ich ein Bild.

Ich lese weiter diese "Redundanz" STFT hat, dass Sie die Hälfte entfernen können, weil Sie es nicht brauchen würden. Ist diese 3. Dimension die Redundanz oder mache ich hier etwas sehr falsches? Wenn ja, wie zeichne ich es richtig?

Vielen Dank.

Edit: So der neue Code und Ausgabe lautet:

import stft 
import os 
import scipy 
import scipy.io.wavfile as wav 
import matplotlib.pylab as pylab 

def save_stft_image(source_filename, destination_filename): 
    fs, audio = wav.read(source_filename) 
    audio = scipy.mean(audio, axis = 1) 
    X = stft.spectrogram(audio) 

    print X.shape  

    fig = pylab.figure()  
    ax = pylab.Axes(fig, [0,0,1,1])  
    ax.set_axis_off() 
    fig.add_axes(ax)  
    pylab.imshow(scipy.absolute(X.T), origin='lower', aspect='auto', interpolation='nearest') 
    pylab.savefig(destination_filename) 

save_stft_image("Example.wav","Example.png") 

enter image description here

Auf der linken Seite ich eine fast unsichtbare Spalte von Farben. Die Sounds, an denen ich arbeite, sind Atmungsgeräusche, daher haben sie sehr niedrige Frequenzen. Vielleicht ist deshalb die Visualisierung eine sehr dünne Farbsäule.

Antwort

1

Sie haben wahrscheinlich eine Stereo-Audiodatei? So entsprechen X[:][:][0] und X[:][:][1] jedem Kanal.

Sie können Multichannel von scipy.mean(audio, axis=1) in Mono konvertieren.