2017-02-19 74 views
1

我目前正在使用UrbanSound8K数据集开发一个带有TensorFlow Python API的音频分类器,并试图区分10个互斥类。应如何对音频进行预处理以进行分类?

音频文件长4秒,包含176400个数据点,导致严重的内存问题。应如何预处理音频以减少内存使用量?

如何从音频中提取更多有用的功能(使用卷积和池化)?

回答

1

当谈到声音分类时,我个人更喜欢光谱图作为神经网络的输入。这样,原始音频数据被转换成图像表示,您可以将其视为基本的图像分类任务。

有多种方式可供选择,这里是我平时使用的是什么SciPy的,python_speech_featurespydub

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,以适应您输入的大小而改变频谱的空间尺寸。

可能有更简单的方法来做到这一点;我使用上面的代码取得了良好的整体分类结果。

+0

为什么要将光谱图旋转90度? – Androbin

+0

对于网点输入而言,它并不重要,只能用于查看和理解它描述的内容(频谱图通常具有时间x轴)。如果不打算显示频谱图,则可以忽略90度旋转。 –

+1

您还应该注意,mean(axis = 0)仅是列的平均值。整个频谱图的平均减法需要axis = None(这是默认值)。 –