Я экспериментировал несколько недель, чтобы найти способ сопоставить / найти похожие песни в библиотеке, содержащей разные жанры музыки.
Моей первой попыткой было определить такие особенности, как темп или количество басов в песнях, чтобы сформировать группы, но я не продвинулся далеко с этим подходом (определение ритма на основе изменения громкости), поскольку примерно на 20% песен не нужно считать ритм всегда, иногда 1/2 или 1/3 из них, и я не мог реализовать это.
После нескольких недель неудачных попыток у меня появилась новая идея, которая описана далее в этом посте. Проще говоря, он работает, беря образцы файлов Spectrum, создавая что-то вроде «среднего спектра» файлов для их сравнения. Идея заключалась в том, что, например, в Hardstyle намного больше басов, чем в обычной рок-музыке, я также проверил это, посмотрев некоторые спектрумы в Audacity.
- Файл 1: взять полный файл FFT Spectrums (размер образца 2048 атм, логарифмическая шкала амплитуд)
- Суммируйте все массивы спектра, возьмите средние значения каждой корзины
- Сделайте то же самое с другими файлами, сохраните все результаты
- Составьте список различий значений FFT между файлом 1 и другими файлами
- Среднее значение различий между файлом 1 и файлом X
- Сортировка по возрастанию по этим средним
- Песни с самым низким значением разности считаются похожими.
Могут ли некоторые из вас, у кого есть хорошие знания, сказать мне, будет ли это правильный / хороший способ реализовать мою идею?
Ответы:
То, что вы пытаетесь сделать, было опробовано снова и снова сотнями исследователей, и по этому поводу достаточно много работы. Проверьте материалы конференции ISMIR. Даже если это не соответствует действительности, прочитайте тезис Элиаса Пампалка: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf
Чтобы быстро сориентироваться на правильном пути:
Музыка может быть похожа по многим параметрам: а) тембр / текстура / жанр; б) ритмический рисунок; в) прогрессия мелодии / аккорда ... и многое другое! Из вашего сообщения не понятно, что вы хотите измерить!
Это для функций. Теперь вам нужно будет придумать лучший способ сравнить ваши песни, когда они будут представлены в виде последовательности этих функций. Вычисление парных различий между последовательностями не очень разумно - например: сравнение песни и смещения одной и той же песни на некоторое молчание приведет к разнице, хотя она точно такая же! Вы бы лучше сравнили распределение этих функций; например, вычислите среднее / стандартное отклонение элементов по песне A и среднее / стандартное отклонение элементов по песне B, а затем возьмите вероятностное расстояние (KL, Bhattacharyya над ними).
Последний пункт, но который будет иметь значение позже: вычисление расстояния между песней и остальной частью корпуса для нахождения ближайших совпадений довольно неэффективно. При работе с большими коллекциями такие методы, как LSH или Ball-деревья, позволяют выполнять запросы ближайших соседей без явного сравнения со всем корпусом.
Кроме того, определение темпа - это совсем другое дело. Если вы хотите разобраться в этом, лучшим документом по производительности / доступности по этой теме будет Ellis 'Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Это невероятно просто, но близко к современным алгоритмам.
источник