我想到了一个程序,用于分析音乐的短片段,将它们归类为“好”或“坏”。这将是一个更大的程序的一部分,该程序搜索更大的好短语和整个片段。
现在的想法是获取音乐片段 X,并将其与已知的良好样本片段 G_1、G_2 等进行比较,并获得与每个片段的相似度等级。然后将其与已知的坏片段 B_1、B_2、B_3、.. 等进行比较。
“好”的音乐当然是主观的,但是这个程序可以使用我根据自己的喜好手动优化的 G 和 B 样本。
好的音乐就是至少与 G 中的一个相似,而与 B 中的任何一个都不相似的音乐。与 G 和 B 都具有高度相似性的片段可能是坏的:B 具有否决权。
那么,如何判断相似度呢?音乐片段可以用类似图像的像素矩阵来表示。纵轴是音高,横轴是时间。如果音高 P_1 的音符出现在时间 T_beg 和 T_end 之间,那么这就像在 (T_beg, P_1) 和 (T_end, P_1) 之间画一条小线。
在某种意义上,要分类的样本 X 可以与已知样本 K 进行卷积。它可以向上或向下转置(垂直移动)或在时间上向左或向右移动(或在时间上拉伸,或其他变化),并且每个转置将叠加在 G 或 B 样本上。我对卷积不太熟悉,但我认为重叠像素会相乘并取所有像素的总和。最亮结果像素的转置很好地表明了 X 与 K 样本的相似程度:它的大小变成了相似度的度量。
暗像素无关紧要。大量的暗像素并不会使音乐变差。这只是意味着在这些位置找不到真正的模式。与已知坏片段的明亮匹配是使音乐变坏的原因。
我想使用 NumPy 或针对矩阵或图像计算优化的类似语言来执行这些计算。
我可以知道这种操作是否有名称,以及在哪里寻找它的有效实现?使用 GPU 提高速度将是一个奖励。

