我正在做一个声音分类项目,给定一组录音,我试图确定某个录音属于哪个类别。您可能会将其与音乐流派或主题识别(文本主体)问题进行比较,我的样本长度不同,我需要为每个样本精确地分配一个标签。
我将我的特征表示为 2d 矩阵,其中每一列代表音频文件中的一个帧(例如 0.1 秒),每一行是一个仅与该时间帧相关的特征(例如 MFCC 系数)。现在虽然我的行数是固定的,但列数会根据记录的长度而变化。
我将训练和测试数据作为 numpy 数组输入,它们包含每个样本的 2D nxy矩阵,其中n是一个常数(即 13),y是一个变量,它取决于当前样本的长度。
不幸的是,scikit-learn 似乎不是这个的忠实拥护者,一次又一次地提高我一个ValueError: setting an array element with a sequence.
. 现在我看到了许多解决方案:
- 使用其中一个小工具
sklearn.feature_extraction
对序列中的特征(文本、不同大小的图像等)进行矢量化,尽管我看到的大多数示例都是针对基于文本的问题,所以我不完全确定它们对像这样的音频问题。 - 取列的平均值来产生一个与时间无关的特征向量(可以在这里看到https://www.youtube.com/watch?v=N1rcKBHlw-Y)
- 当使用像 K-NN 这样的模型时,可以手动预先计算距离,绕过 scikit 的“序列还是数组?” 完全检查。
现在在这三个中,我更喜欢类似于 #1 的东西,因为感觉这是 scikit 优化的方法。有任何想法吗?