Как определить BPM песни в php
Как темп /BPM песни можно определить программно? Какие алгоритмы обычно используются, и какие соображения должны быть сделаны?
12 ответов
Это сложно объяснить в одном посте Stackru. В целом, самые простые алгоритмы обнаружения ударов работают путем определения пиков в звуковой энергии, которую легко обнаружить. Более сложные методы используют гребенчатые фильтры и другие статистические методы / методы осциллограммы. Подробное объяснение, включая примеры кода, можно найти в этой статье на GameDev.
Ключевые слова для поиска: "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 google), который приятен и прост для понимания. Это работает так:
- Краткосрочная БПФ музыка, чтобы получить сонограмму.
- Суммируйте увеличение величины по всем частотам для каждого временного шага (игнорируйте уменьшение). Это дает вам одномерную изменяющуюся во времени функцию, называемую "спектральным потоком".
- Найдите пики, используя любой старый алгоритм обнаружения пиков. Они называются "наступления" и соответствуют началу звуков в музыке (начало нот, ударных и т. Д.).
- Построить гистограмму между интервалами начала (IOI). Это может быть использовано для поиска вероятных темпов.
- Инициализируйте набор "агентов" или "гипотез" для результата отслеживания ударов. Кормите этих агентов по очереди по порядку. Каждый агент отслеживает список появлений, которые также являются ударами, и текущую оценку темпа. Агенты могут либо принять начало, если они близко соответствуют их последнему отслеживаемому удару и темпу, игнорировать их, если они сильно отличаются, или породить нового агента, если они находятся между ними. Не каждый удар требует начала - агенты могут интерполировать.
- Каждому агенту дается оценка в соответствии с тем, насколько точна его гипотеза - если все его начальные удары громки, он получает более высокий балл. Если они все регулярные, он получает более высокий балл.
- Самый высокий балл - это ответ.
Недостатки этого алгоритма в моем опыте:
- Обнаружение пиков является довольно случайным и чувствительным к пороговым параметрам и еще много чего.
- У некоторой музыки нет явных проявлений ритмов. Очевидно, это не сработает.
- Трудно понять, как решить проблему 60bpm-vs-120bpm, особенно с отслеживанием в реальном времени!
- Выбрасывает много информации, используя только одномерный спектральный поток. Я считаю, что вы можете сделать намного лучше, имея несколько спектральных потоков с ограниченной полосой (и, возможно, один широкополосный для барабанов).
Вот демонстрация живой версии этого алгоритма, показывающая спектральный поток (черная линия внизу) и начало (зеленые кружки). Стоит учитывать тот факт, что ритм извлекается только из зеленых кругов. Я воспроизводил их как клики, и, честно говоря, я не думаю, что слышу их ритм, так что в некотором смысле этот алгоритм лучше, чем люди при обнаружении ритма. Я думаю, что сокращение до такого низкоразмерного сигнала является его слабым шагом.
Досадно, что несколько лет назад я нашел очень хороший сайт со множеством алгоритмов и кода для обнаружения ударов. Я полностью не смог это исправить, хотя.
Редактировать: нашел это!
Вот несколько замечательных ссылок, с которых стоит начать:
Извлечение битов включает в себя выявление когнитивных метрических структур в музыке. Очень часто они не соответствуют физической звуковой энергии - например, в большинстве музыкальных произведений существует уровень синкопации, что означает, что воспринимаемый нами "удар по ногам" не соответствует присутствию физического звука. Это означает, что это совсем другое поле для обнаружения начала, которое является обнаружением физических звуков и выполняется другим способом.
Вы можете попробовать библиотеку Aubio, которая представляет собой простую библиотеку C, предлагающую инструменты извлечения как начала, так и удара.
Существует также онлайн- интерфейс Echonest API, хотя он включает в себя загрузку MP3 на веб-сайт и получение XML, поэтому он может быть не совсем подходящим.
РЕДАКТИРОВАТЬ: я столкнулся с этим прошлой ночью - очень многообещающе выглядящая библиотека C/C++, хотя я сам не использовал ее. Плагины Vamp
Основная область исследований, которая вас интересует, называется ПОЛУЧЕНИЕ ИНФОРМАЦИИ О МУЗЫКЕ.
Есть много разных алгоритмов, которые делают это, но все они в основном сосредоточены вокруг обнаружения ONSET.
Обнаружение начала измеряет начало события, событие в этом случае - играемая нота. Вы можете искать изменения в взвешенном преобразовании Фурье (Высокочастотное содержимое), вы можете искать большие изменения в спектральном содержимом. (Спектральная разница). (есть пара статей, которые я рекомендую вам изучить ниже). Как только вы применяете алгоритм обнаружения начала, вы выбираете, где биения, через порог.
Существуют различные алгоритмы, которые вы можете использовать, как только вы получите локализацию ритма. Вы можете превратить его в последовательность импульсов (создать нулевой сигнал для всех времен и 1 только тогда, когда произойдет ваш удар), а затем применить к нему БПФ и БАМ, теперь у вас есть частота появления на самом большом пике.
Вот несколько статей, которые помогут вам в правильном направлении:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
Вот продолжение того, что обсуждают некоторые люди:
Кто-то упомянул, что рассматривал применение алгоритма машинного обучения: в основном соберите набор функций из функций обнаружения начала (упомянутых выше) и объедините их с необработанным сигналом в нейронной сети / логистической регрессии и изучите, что делает удар.
Посмотрите на доктора Эндрю Нг, у него бесплатные лекции по машинному обучению из Стэнфордского университета онлайн (не длинные видеолекции, на самом деле есть онлайн дистанционный курс)
Если вам удастся взаимодействовать с кодом Python в вашем проекте, Echo Nest Remix API - довольно приятный API для Python:
Есть метод analysis.tempo
который даст вам BPM. Это может сделать намного больше, чем простой BPM, как вы можете видеть из документации по API или из этого руководства
Выполните преобразование Фурье и найдите пики в спектре мощности. Вы ищете пики ниже предела 20 Гц для человеческого слуха. Я бы предположил, что обычно в диапазоне от 0,1 до 5 Гц он щедрый.
ТАК вопрос, который может помочь: Библиотека аудио обнаружения Bpm
Кроме того, вот один из нескольких вопросов "пикового определения" SO: обнаружение пиков измеряемого сигнала
Изменить: не то, что я делаю аудио обработки. Это всего лишь предположение, основанное на том факте, что вы ищете свойство частотной области файла...
другое редактирование: стоит отметить, что форматы сжатия с потерями, такие как mp3, в первую очередь хранят данные домена Фурье, а не данные временного домена. С некоторой сообразительностью вы можете сэкономить некоторые тяжелые вычисления... но посмотрите вдумчивый комментарий коббала.
Есть несколько способов получить BPM, но самый эффективный, на мой взгляд, это "спектр биений" (описанный здесь). Этот алгоритм вычисляет матрицу сходства, сравнивая каждый короткий образец музыки со всеми остальными. Как только матрица подобия вычислена, можно получить среднее сходство между каждой парой выборок {S(T);S(T+1)} для каждого временного интервала T: это спектр биений. Первый высокий пик в спектре ударов - это большая часть продолжительности ударов. Самое приятное, что вы также можете делать такие вещи, как структура музыки или ритм-анализ.
Точное определение BPM очень сложно. Посмотрите на этот вопрос stackru и мой ответ на него.
Чтобы опубликовать мой ответ: Самый простой способ сделать это - заставить пользователя ритмично нажимать кнопку и считать количество нажатий, деленное на время.
Другие уже описали некоторые методы обнаружения ударов. Я хочу добавить, что есть некоторые библиотеки, которые предоставляют методы и алгоритмы для такого рода задач.
Aubio - один из них, у него хорошая репутация, и он написан на C с оболочкой C++, так что вы можете легко интегрировать его с приложением какао (все аудио-компоненты в рамках Apple также написаны на C/C++).
Вот бесплатная программа, которая будет анализировать и записывать BPM в тег ID3V2. Понятия не имею, как хорошо
Я полагаю, что это будет проще всего в 4-4 танцевальной музыке, так как должен быть один низкочастотный стук около двух раз в секунду.