2016-04-27 187 views
1

我目前有几千个音频片段需要用机器学习进行分类。在python中绘制音频谱图

经过一番挖掘,我发现如果您对音频进行短时傅里叶变换,它会变成二维图像,因此我可以在这些图像上使用各种图像分类算法而不是音频文件本身。

为此,我找到了一个python package,STFT和我需要的是绘制它,以便我可以获取图像。对于绘图我发现this github repo非常有用。

最后我的代码结束了,因为这:

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") 

和输出是: enter image description here

代码的工作,但是我观察到,当print X.shape行执行我得到(513L, 943L, 2L)。所以结果是三维的。所以当我只写X[:][:][0]X[:][:][1]我得到一个图像。

我一直在阅读STFT的“冗余”,你可以删除一半,因为你不需要它。第三个维度是冗余还是我在这里做的事情很错?如果是的话,我该如何正确地绘制它?

谢谢。

编辑: 因此,新的代码,并输出结果为:

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

在左边,我得到的颜色几乎看不见列。我正在研究的声音是呼吸音,所以它们的频率非常低。也许这就是为什么可视化是一个非常薄的颜色列。

回答

1

你可能有一个立体声音频文件?因此X[:][:][0]X[:][:][1]对应于每个通道。

您可以通过scipy.mean(audio, axis=1)将多声道转换为单声道。