在不同长度的音频文件上使用sklearn

时间:2017-02-10 16:47:37

标签: python numpy machine-learning scikit-learn

我是ML的新手并希望自己尝试一个项目来学习,所以请原谅任何明显的错误。我试图在python中使用audiolab和sklearn对几个文件(铃声等)进行分类。

以下是代码:

from scikits.audiolab.pysndfile.matapi import oggread, wavread

import numpy as np

from sklearn import svm

files = ["Basic_Bell.ogg", "Beep-Beep.ogg", "Beep_Once.ogg", "Calling_You.ogg",  "Time_Up.ogg"]
labels = [2,1,1,2,2]
train = []

for f in files:
    data, fs, enc = oggread("Tones/"+f)
    train.append(data)

clf = svm.SVC()
clf.fit(train, labels)

我收到错误消息:

Traceback (most recent call last):
  File "/home/athul/Projects/Audio Analysis/read.py", line 18, in <module>
    clf.fit(train, labels)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 150, in fit
    X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 373, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.

在我的(有限的)理解中,这似乎是问题,因为列车数据具有不同的大小,因此numpy不能将其转换为矩阵,那么我该如何解决这个问题呢?我可以垫吗?如果是这样我应该使用的尺寸是多少?或者这是我的错误?

1 个答案:

答案 0 :(得分:0)

在我(有限的)理解中,这似乎是有问题的,因为火车 数据大小不同,因此numpy无法将其转换为 矩阵,

是的,这就是问题所在。

那我该如何解决呢?我可以垫吗?如果是这样,我应该使用多大的尺寸? 还是这是我的错误?

我可以想到2种选择,一种是使用支持不同大小矩阵的网络(选项1)。另一种是用零填充。 (选项2)。也可以使用其他方法(保持或不改变音高)来更改音频的长度,但是我在任何论文中都没有找到这种应用,因此我不会将其发布为一种选择。

选项1:使用可以处理不同大小的网络

通常,人们使用Recurrent Neural Network(RNN),因为它可以应付不同大小的音频。

选项2:零填充/截断

老实说,我在这里找不到标准。您可以选择修复持续时间,然后:

  • 对于较短的音频:在音频的结尾和/或开头添加静音
  • 要获取更长的音频,请剪切它们
from pydub import AudioSegment

audio = pydub.AudioSegment.silent(duration=duration_ms)    # The length you want
audio = audio.overlay(pydub.AudioSegment.from_wav(path))
raw = audio.split_to_mono()[0].get_array_of_samples()      # I only keep the left sound 

此类应用程序的示例可以是UrbanSoundDataset。它是不同长度音频的数据集,因此,使用它的任何论文(对于非RNN网络)都将被迫使用此方法或将声音转换为相同长度矢量/矩阵的另一种方法。我推荐论文Deep Convolutional Neural Networks and Data Augmentation for Environmental Sound ClassificationENVIRONMENTAL SOUND CLASSIFICATION WITH CONVOLUTIONAL NEURAL NETWORKS。后者的代码是开源的,您可以看到它使用了我在this笔记本中的函数_load_audio上解释的方法(类似)


话题不大,但是强烈建议对于此类应用程序使用 mel-spectrum

(据我所知)标准是将mel-spectrum用于此类应用程序。您可以使用Python库Essentia并遵循this示例或使用librosa,如下所示:

y, sr = librosa.load('your-wav-file.wav')
mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)