Gri*_*per 5 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)
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:
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.
Run Code Online (Sandbox Code Playgroud)
在我(有限的)理解中,这似乎是一个问题,因为训练数据具有不同的大小,因此 numpy 无法将其转换为矩阵,那么我该如何解决这个问题?可以垫一下吗?如果是的话我应该使用什么尺寸?或者这是我的一个错误?
在我(有限的)理解中,这似乎是个问题,因为训练数据具有不同的大小,因此 numpy 无法将其转换为矩阵,
确实,这正是问题所在。
那么我该如何解决这个问题呢?可以垫一下吗?如果是的话我应该使用什么尺寸?或者这是我的一个错误?
我能想到两种选择,一种是使用支持不同大小矩阵的网络(选项1)。另一种是用零填充。(选项 2)。人们还可以用其他方法改变音频的长度(保持或不保持音高),但我没有在任何论文中找到任何应用程序,所以我不会将其作为一种选项发布。
选项 1:使用可以处理不同大小的网络
通常,人们使用循环神经网络(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
Run Code Online (Sandbox Code Playgroud)
UrbanSoundDataset就是此类应用程序的一个示例。它是不同长度音频的数据集,因此任何使用它的论文(对于非 RNN 网络)都将被迫使用这种或另一种将声音转换为相同长度向量/矩阵的方法。我推荐论文《深度卷积神经网络和环境声音分类的数据增强》或《使用卷积神经网络进行环境声音分类》。后者的代码是开源的,您可以看到它使用了我_load_audio在本笔记本中的函数中解释的(某种)方法
有点偏离主题,但对于此类应用,强烈建议使用mel-spectrum
标准(据我所知)是对此类应用使用梅尔光谱。您可以使用 Python 库Essentia并按照此示例进行操作,或者使用 librosa,如下所示:
y, sr = librosa.load('your-wav-file.wav')
mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |