Как определить BPM песни в php

75 [2009-03-18 08:32:00]

Как можно программно определить темп /BPM песни? Какие алгоритмы обычно используются и какие соображения должны быть сделаны?

algorithm audio signal-processing


12 ответов


42 John Feminella [2009-03-18 08:38:00]

Это сложно объяснить в одном сообщении StackOverflow. В общем, простейшие алгоритмы обнаружения биений работают путем нахождения пиков в звуковой энергии, что легко обнаружить. Более сложные методы используют гребенчатые фильтры и другие методы статистики/осциллограммы. Для подробной экспликации, включая примеры кода, проверьте эту статью GameDev.


29 Timmmm [2013-03-27 18:30:00]

Ключевыми словами для поиска являются "Beat Detection", "Beat Tracking" и "Music Information Retrieval". Здесь много информации: http://www.music-ir.org/

Существует (может быть) ежегодный конкурс под названием MIREX, где тестируются различные алгоритмы с их характеристикой обнаружения биений.

http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/

Это должно дать вам список алгоритмов для тестирования.

Классическим алгоритмом является Beatroot (google it), что приятно и легко понять. Он работает следующим образом:

  • Краткосрочная FFT музыка для получения сонограммы.
  • Суммируйте увеличение величины по всем частотам для каждого временного шага (игнорируйте уменьшение). Это дает вам 1D изменяющуюся во времени функцию, называемую "спектральный поток".
  • Найти пики, используя любой старый алгоритм обнаружения пиков. Они называются "onsets" и соответствуют началу звуков в музыке (начало заметок, ударные удары и т.д.).
  • Построить гистограмму интервала-интервала (IOI). Это можно использовать для поиска вероятных темпов.
  • Инициализировать набор "агентов" или "гипотез" для результата отслеживания бит. Подавайте эти агенты по порядку поочередно. Каждый агент отслеживает список тактов, которые также являются битами, и текущую оценку темпа. Агенты могут либо принимать onsets, если они вписываются в тесную связь с их последним отслеживаемым ритмом и темпом, игнорируют их, если они сильно отличаются, или создают нового агента, если они находятся между ними. Не каждый бит требует начала - агенты могут интерполировать.
  • Каждому агенту дается оценка в соответствии с тем, насколько аккуратная его гипотеза - если все ее бит-атаки громкие, она получает более высокий балл. Если они все регулярные, он получает более высокий балл.
  • Самый высокий агент оценки - это ответ.

Недостатки этого алгоритма в моем опыте:

  • Обнаружение пиков является скорее ad-hoc и чувствительным к пороговым параметрам и еще что-то.
  • В какой-то музыке нет явных битков на битах. Очевидно, что это не сработает с ними.
  • Трудно узнать, как решить проблему с 60bpm-vs-120bpm, особенно с отслеживанием в реальном времени!
  • Выбрасывает много информации только с использованием 1D спектрального потока. Я считаю, что вы можете сделать гораздо лучше, имея несколько ограниченных диапазоном спектральных потоков (и, возможно, один широкополосный для барабанов).

Здесь - демонстрация живой версии этого алгоритма, показывающая спектральный поток (черная линия внизу) и onsets (зеленые круги). Стоит учесть тот факт, что бит извлекается только из зеленых кругов. Я воспроизводил наборы так же, как и клики, и, честно говоря, я не думаю, что мог услышать от них удар, поэтому в некотором смысле этот алгоритм лучше, чем у людей с биением. Я думаю, что сокращение до такого низкоразмерного сигнала является его слабым шагом, хотя.

Досадно, что я нашел очень хороший сайт со многими алгоритмами и кодом для обнаружения биений несколько лет назад. Однако я полностью не смог его переделать.

Изменить: Найди его!

Вот несколько отличных ссылок, которые вы должны начать:

http://marsyasweb.appspot.com/

http://www.vamp-plugins.org/download.html


22 robw [2009-03-18 10:56:00]

Извлечение ударов включает в себя идентификацию когнитивных метрических структур в музыке. Очень часто они не соответствуют физической звуковой энергии - например, в большинстве музыкальных групп наблюдается уровень синкопии, а это означает, что ритм "ступни ног", который мы воспринимаем, не соответствует присутствию физического звука. Это означает, что это совершенно другое поле для обнаружения начала, которое является обнаружением физических звуков, и выполняется по-другому.

Вы можете попробовать библиотеку Aubio, которая представляет собой обычную библиотеку C, предлагающую инструменты для начала и извлечения бит.

Существует также онлайн-интерфейс Echonest API, хотя это связано с загрузкой MP3 на веб-сайт и извлечением XML, поэтому может быть не так хорошо..

EDIT: Я наткнулся на эту прошлую ночь - очень перспективную библиотеку C/С++, хотя сам я ее не использовал. Vamp Plugins


9 mikeh [2009-03-18 09:18:00]

Если вы можете управлять интерфейсом python в своем проекте, Echo Nest Remix API - это довольно slick API для python:

Есть метод analysis.tempo, который даст вам BPM. Это может сделать намного больше, чем простой BPM, как вы можете видеть из документации API или this учебник


9 Adam [2012-03-13 23:43:00]

Общая область исследований, которые вас интересуют, называется МЕТОДИКА ИНФОРМАЦИИ RETRIEVAL

Существует множество различных алгоритмов, которые делают это, но все они в основном сосредоточены вокруг ONSET DETECTION.

Обнаружение начала измеряет начало события, событие в этом случае представляет собой ноту, воспроизводимую. Вы можете искать изменения в взвешенном преобразовании Фурье (High Frequency Content), вы можете искать большие изменения в спектральном контенте. (Спектральная разность). (есть несколько статей, которые я рекомендую вам посмотреть дальше). Когда вы применяете алгоритм обнаружения начала, вы выбираете, где биты проходят через порог.

Существуют различные алгоритмы, которые вы можете использовать, когда получили локализацию ритма. Вы можете превратить его в последовательность импульсов (создать сигнал, равный нулю на все время, и 1 только тогда, когда произойдет ваш ритм), затем примените FFT к этому и BAM, теперь у вас есть частота начислений на самом большом пике.

Вот несколько статей, которые помогут вам в правильном направлении:

http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

Вот пример того, что некоторые люди обсуждают:

Кто-то упомянул о применении алгоритма машинного обучения: в основном собирайте кучу функций из функций обнаружения начала (см. выше) и объедините их с необработанным сигналом в нейронной сети/логистической регрессии и узнайте, что делает бит в ритме,

Взгляните на доктора Эндрю Нг, у него есть бесплатные лекции по компьютерному обучению из Стэнфордского университета в Интернете (а не длинные лекции с видео, на самом деле есть онлайн-курс).


7 dmckee [2009-03-18 08:37:00]

Выполните преобразование Фурье и найдите пики в спектре мощности. Вы ищете пики ниже отсечки 20 Гц для человеческого слуха. Я бы предположил, что обычно в диапазоне 0,1-5 дюймов, чтобы быть великодушным.

Вопрос SO, который может помочь: Библиотека обнаружения звука Bpm

Кроме того, здесь приведен один из нескольких вопросов "пикового поиска" на SO: Пиковое обнаружение измеренного сигнала


Изменить: Не то, чтобы я обрабатывал аудио. Это просто предположение, основанное на том, что вы ищете свойство частотной области файла...


другое редактирование: Стоит отметить, что форматы сжатия с потерями, такие как mp3, хранят данные домена Фурье, а не данные во временной области. С небольшим умом вы можете сэкономить тяжелые вычисления... но посмотрите на продуманный комментарий cobbal.


2 Rafael Vega [2012-02-13 15:15:00]

Другие уже описали некоторые методы обнаружения биений. Я хочу добавить, что есть несколько доступных библиотек, которые предоставляют методы и алгоритмы для такого рода задач.

Aubio является одним из них, он имеет хорошую репутацию и написан на C с помощью С++-оболочки, поэтому вы можете легко интегрировать его с приложением cocoa (все аудиофайлы в каркасах Apple также написаны на C/С++).


2 jeremy-george [2011-02-24 02:16:00]

Существует несколько способов получить BPM, но тот, который я нахожу наиболее эффективным, - это "спектр удара" (описывается здесь). Этот алгоритм вычисляет матрицу подобия, сравнивая каждую короткую выборку музыки со всеми остальными. Когда вычисляется матрица подобия, можно получить среднее сходство между каждой выборкой пар {S (T); S (T + 1)} для каждого временного интервала T: это спектр удара. Первый высокий пик в спектре ритма - это большая часть времени удара. Лучшая часть - вы также можете делать такие вещи, как музыкальная структура или анализ ритма.


2 [2009-03-21 00:46:00]

Повторить мой ответ: простой способ сделать это - нажать кнопку в ритме с ритмом и подсчитать количество отводов, деленное на время.


2 Nick Johnson [2009-03-18 12:55:00]

Точное обнаружение BPM очень сложно. См. этот вопрос о стеке_потока и мой ответ на него.


0 Scott Evernden [2009-03-18 08:39:00]

Здесь бесплатная программа будет анализировать и записывать BPM в тег ID3V2. Не знаю, насколько хорошо


-2 Daniel Earwicker [2009-03-18 10:27:00]

Я бы предположил, что это будет проще всего в танцевальной музыке 4-4, так как должен быть один низкий уровень громкости примерно два раза в секунду.