Як виявити BPM пісні у php [закрито]


78

Як можна програмно визначити темп / BPM пісні? Які алгоритми зазвичай використовуються, і які міркування слід враховувати?

Відповіді:


42

Це складно пояснити в одному дописі StackOverflow. Загалом, найпростіші алгоритми виявлення ударів працюють шляхом визначення піків звукової енергії, які легко виявити. Більш складні методи використовують гребінчасті фільтри та інші статистичні / сигнальні методи. Для детального пояснення, включаючи зразки коду, перегляньте цю статтю GameDev .


Через 5 років стаття GameDev не містить 404 ツ (крім того, ви часто можете використовувати webarchive.org, згідно з web.archive.org/web/20120525085210/http://archive.gamedev.net/… )
вушна камера

Чи можете ви пояснити мені момент із статті GameDev? Автор каже, що нехай 1024 зразки становлять приблизно 5 сотень (тисяч ? ) С секунди. А дещо пізніше він каже, що 44032 зразки - це приблизно 1 секунда. Але як ми це отримали, якщо 1024 зразки за 0,05 секунди дорівнюють 20480 зразкам за 1 секунду? Чи є різні частоти? Цей фрагмент тексту можна легко знайти,
ввівши

30

Ключові слова, за якими потрібно шукати, - "Визначення ритму", "Відстеження ритмів" та "Отримання музичної інформації". Тут є багато інформації: http://www.music-ir.org/

Існує (можливо) щорічний конкурс під назвою MIREX, де різні алгоритми тестуються на ефективність виявлення ударів.

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

Це має дати вам список алгоритмів для тестування.

Класичний алгоритм - Beatroot ( пошукати в Google), який приємний і простий у розумінні. Це працює так:

  1. Короткочасна ШПФ музика для отримання сонограми.
  2. Підсумуйте збільшення величини за всіма частотами для кожного часового кроку (ігноруйте зменшення). Це дає вам 1D-функцію, що змінюється в часі, яка називається "спектральний потік".
  3. Знайдіть піки, використовуючи будь-який старий алгоритм виявлення піків. Вони називаються "наступами" і відповідають початку звуків у музиці (початку нот, ударних ударних тощо).
  4. Побудуйте гістограму інтервалів між початком (IOI). Це можна використовувати для пошуку ймовірних темпів.
  5. Ініціюйте набір "агентів" або "гіпотез" для результату відстеження ударів. Годуйте цих агентів наступними засобами по черзі. Кожен агент відстежує список нападів, які також є ритмами, і поточну оцінку темпу. Агенти можуть або прийняти наступ, якщо вони тісно поєднуються з останнім відстежуваним ритмом та темпом, ігнорувати їх, якщо вони дико відрізняються, або породити нового агента, якщо вони посередині. Не кожен такт вимагає початку - агенти можуть інтерполювати.
  6. Кожен агент отримує оцінку відповідно до того, наскільки акуратною є його гіпотеза - якщо всі його напади гучні, це отримує вищий бал. Якщо вони всі регулярні, він отримує вищий бал.
  7. Відповідає найвищий агент.

Мінуси цього алгоритму на моєму досвіді:

  • Виявлення піків є досить спеціальним та чутливим до порогових параметрів та іншого.
  • Деяка музика не має очевидних нападів на ритмі. Очевидно, що з цими не спрацює.
  • Важко знати, як вирішити проблему 60 бит / хв проти 120 біт / хв, особливо за допомогою відстеження в реальному часі!
  • Викидає багато інформації, використовуючи лише 1D спектральний потік. Я гадаю, ви можете зробити набагато краще, маючи кілька спектральних потоків з обмеженим діапазоном (і, можливо, один широкосмуговий для барабанів).

Ось демонстраційна версія реальної версії цього алгоритму, що показує спектральний потік (чорна лінія внизу) та наступні значення (зелені кола). Варто врахувати той факт, що ритм витягується лише із зелених кіл. Я відтворював наступні дії лише як клацання, і, чесно кажучи, не думаю, що я міг почути такт від них, тому певним чином цей алгоритм кращий за людей, які виявляють биття. Я думаю, що зведення до такого низьковимірного сигналу є його слабким кроком.

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

Редагувати: знайшов!

Ось декілька чудових посилань, з яких слід почати:

http://marsyasweb.appspot.com/

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


Важко створити плагін Vamp для цілі OSX. Немає проблем із залежностями, але з os typedefs для darwin. Спробуйте зробити -f build / Makefile.osx після перемикання sdk на ... / Developer / SDKs / iPhoneOS7.0.sdk, щоб зрозуміти, що я маю на увазі.
loretoparisi

22

Екстракція ударів передбачає виявлення когнітивних метричних структур у музиці. Дуже часто вони не відповідають фізичній звуковій енергії - наприклад, у більшості музики існує рівень синкопації, що означає, що удар, який ми сприймаємо, не відповідає присутності фізичного звуку. Це означає, що це зовсім інше поле для виявлення початку , яке є виявлення фізичних звуків, і виконується по-іншому.

Ви можете спробувати бібліотеку Aubio , яка є простою бібліотекою C, що пропонує інструменти для вилучення як початку, так і удару.

Існує також Інтернет- API Echonest , хоча це передбачає завантаження MP3-файлу на веб-сайт та отримання XML-файлу, тому, можливо, це не так підходить ..

EDIT: Я натрапив на це вчора ввечері - дуже перспективну на вигляд бібліотеку C / C ++, хоча сам я не використовував її. Плагіни Vamp


9

Загальний напрямок досліджень, який вас цікавить, називається МУЗИЧНА ІНФОРМАЦІЯ ПОВТОРЕННЯ

Існує багато різних алгоритмів, які роблять це, але всі вони принципово зосереджені навколо ВИЗНАЧЕННЯ ВСТАНОВЛЕННЯ.

Виявлення початку вимірює початок події, подія в цьому випадку - це відтворена нота. Ви можете шукати зміни в зваженому перетворенні Фур'є (високочастотний вміст), ви можете шукати великі зміни в спектральному вмісті. (Спектральна різниця). (Є кілька статей, які я рекомендую вам розглянути далі) Після того, як ви застосуєте алгоритм виявлення початку, ви вибираєте, де б'ються, через порогове значення.

Існують різні алгоритми, якими ви можете скористатися, коли отримаєте локалізацію удару за цей час. Ви можете перетворити його на імпульсний шлейф (створити сигнал, який дорівнює нулю за весь час і дорівнює 1 лише тоді, коли відбувається ваш такт), а потім застосувати до нього БПФ, і BAM тепер у вас є Частота наборів на найбільшому піку.

Ось кілька статей, які допоможуть вам у правильному напрямку:

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

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

Ось розширення того, що деякі люди обговорюють:

Хтось згадав, що вивчає застосування алгоритму машинного навчання: В основному збирають купу функцій з функцій виявлення початку (згаданих вище) і поєднують їх із вихідним сигналом у нейронній мережі / логістичній регресії та дізнаються, що робить такт ритмом.

загляньте до доктора Ендрю Нґ, він безкоштовно читає лекції машинного навчання в Стенфордському університеті в Інтернеті (не довгі відеолекції, насправді існує онлайн-дистанційний курс)


9

Якщо вам вдається взаємодіяти з кодом python у своєму проекті, Echo Nest Remix API - це досить приємний API для python:

Існує метод, analysis.tempoякий надасть вам BPM. Це може зробити набагато більше, ніж простий BPM, як ви можете бачити з документів API або цього посібника


7

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

ТАКЕ запитання, яке може допомогти: Бібліотека виявлення звуку Bpm

Крім того, ось одне з декількох запитань щодо "пошуку піків" щодо SO: Виявлення піку виміряного сигналу


Редагувати: Не те, що я займаюся обробкою звуку. Це лише припущення, засноване на тому, що ви шукаєте властивість частотного домену файлу ...


ще одне редагування: Варто зазначити, що формати стиснення з втратами, такі як mp3, зберігають дані домену Фур’є, а не дані часового домену. З невеликою кмітливістю ви можете заощадити собі важкі обчислення ... але перегляньте вдумливий коментар cobbal.


1
однак mp3 досягає свого стиснення, відсікаючи частоти поза людським слухом. Тут Фур’є може бути не правильним інструментом.
cobbal

1
MP3 не `` відрубує '' частоти поза людським слухом, і виконує косинусні перетворення (пов'язані з Фур'є) окремо в огорнуті вікна шириною близько 1 мс кожна. Я спробую першу пропозицію dmckee на вікнах довжиною 10 с і подивлюся, що вийде.
TrayMan

Це занадто спрощено, щоб справді добре працювати.
Timmmm


2

Щоб повторно опублікувати свою відповідь: найпростіший спосіб зробити це - це зробити так, щоб користувач натискав кнопку в такт ритму та підраховував кількість натискань, поділену на час.


2

Інші вже описали деякі методи виявлення ударів. Я хочу додати, що є кілька доступних бібліотек, які надають методи та алгоритми для такого роду завдань.

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


2

Існує кілька методів отримання BPM, але найбільш ефективним я вважаю "спектр ударів" (описаний тут ). Цей алгоритм обчислює матрицю подібності, порівнюючи кожен короткий зразок музики з усіма іншими. Після обчислення матриці подібності можна отримати середню подібність між кожними парами вибірки {S (T); S (T + 1)} для кожного інтервалу часу T: це спектр биття. Перший високий пік у спектрі тактових часток становить більшу частину часу тривалості біту. Найкраще, ви також можете робити такі речі, як музична структура або аналіз ритму.



-2

Я гадаю, це буде найпростішим у танцювальній музиці 4-4, оскільки там повинен бути один низький частотний удар близько двох разів на секунду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.