Development Tip

PHP에서 노래의 BPM을 감지하는 방법

yourdevel 2020. 10. 14. 21:20
반응형

PHP에서 노래의 BPM을 감지하는 방법


노래의 템포 / BPM을 프로그래밍 방식으로 어떻게 결정할 수 있습니까? 일반적으로 사용되는 알고리즘은 무엇이며 고려해야 할 사항은 무엇입니까?


이것은 단일 StackOverflow 게시물에서 설명하기가 어렵습니다. 일반적으로 가장 간단한 비트 감지 알고리즘은 감지하기 쉬운 사운드 에너지의 피크를 찾는 방식으로 작동합니다. 보다 정교한 방법은 콤 필터 및 기타 통계 / 파형 방법을 사용합니다. 코드 샘플을 포함한 자세한 설명은 이 GameDev 기사를 확인 하십시오 .


검색 할 키워드는 "비트 감지", "비트 추적"및 "음악 정보 검색"입니다. 여기에 많은 정보가 있습니다 : http://www.music-ir.org/

비트 감지 성능에 대해 다양한 알고리즘을 테스트하는 MIREX라는 (아마도) 연례 콘테스트가 있습니다.

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

테스트 할 알고리즘 목록이 표시됩니다.

고전적인 알고리즘은 Beatroot (google it)로 멋지고 이해하기 쉽습니다. 다음과 같이 작동합니다.

  1. 짧은 시간에 음악을 FFT하여 초음파를 얻습니다.
  2. 각 시간 단계의 모든 주파수에 대한 크기 증가합산합니다 (감소 무시). 이것은 "스펙트럼 플럭스"라고하는 1D 시변 함수를 제공합니다.
  3. 오래된 피크 감지 알고리즘을 사용하여 피크를 찾으십시오. 이를 "온셋"이라고하며 음악의 시작 음 (음표 시작, 드럼 히트 등)에 해당합니다.
  4. 인터-온셋 간격 (IOI)의 히스토그램을 생성합니다. 이것은 가능한 템포를 찾는 데 사용할 수 있습니다.
  5. 비트 추적 결과에 대한 "에이전트"또는 "가설"세트를 초기화합니다. 이 약제를 한 번에 하나씩 순서대로 공급하십시오. 각 에이전트는 비트이기도 한 발병 목록과 현재 템포 추정치를 추적합니다. 에이전트는 마지막으로 추적 한 비트와 템포에 가깝게 맞는 경우 시작을 받아들이고, 완전히 다른 경우 무시하거나 중간에있는 경우 새 에이전트를 생성 할 수 있습니다. 모든 비트에 시작이 필요한 것은 아닙니다. 에이전트는 보간 할 수 있습니다.
  6. 각 에이전트는 가설이 얼마나 깔끔한 지에 따라 점수를받습니다. 모든 비트 시작이 클 경우 더 높은 점수를받습니다. 그들이 모두 규칙적이라면 더 높은 점수를 얻습니다.
  7. 가장 높은 점수를받은 에이전트가 답입니다.

내 경험상이 알고리즘의 단점 :

  • 피크 감지는 다소 임시적이며 임계 값 매개 변수 등에 민감합니다.
  • 일부 음악은 비트에 분명한 시작점이 없습니다. 분명히 그것들과 함께 작동하지 않을 것입니다.
  • 특히 실시간 추적에서 60bpm-vs-120bpm 문제를 해결하는 방법을 알기 어렵습니다!
  • 1D 스펙트럼 플럭스 만 사용하여 많은 정보를 버립니다 . 몇 개의 대역 제한 스펙트럼 플럭스 (그리고 드럼 용 광대역 플럭스 하나)를 사용하면 훨씬 더 잘할 수 있다고 생각합니다.

다음 은 스펙트럼 플럭스 (하단의 검은 색 선)와 시작 (녹색 원)을 보여주는이 알고리즘의 라이브 버전 데모입니다. 비트가 녹색 원 에서만 추출된다는 사실을 고려할 가치가 있습니다. 나는 클릭처럼 시작을 재생했고, 솔직히 말해서 나는 그들로부터 비트를들을 수 없다고 생각한다. 그래서 어떤면에서이 알고리즘은 비트 감지에있는 사람들보다 낫다. 나는 그러한 저 차원 신호에 대한 감소가 약한 단계라고 생각합니다.

귀찮게도 몇 년 전에 비트 감지를위한 많은 알고리즘과 코드가있는 아주 좋은 사이트를 찾았습니다. 나는 그것을 완전히 정제하지 못했습니다.

편집 : 찾았습니다!

다음은 시작하는 데 도움이되는 몇 가지 훌륭한 링크입니다.

http://marsyasweb.appspot.com/

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


비트 추출은 음악에서인지 적 지표 구조의 식별을 포함합니다. 예를 들어 대부분의 음악에는 실신 수준이 있습니다. 즉, 우리가 인식하는 "발 두드리기"비트가 물리적 소리의 존재와 일치하지 않음을 의미합니다. 이것은 물리적 소리를 감지하는 시작 감지는 완전히 다른 필드 이며 다른 방식으로 수행됨을 의미합니다.

시작 및 비트 추출 도구를 모두 제공하는 일반 C 라이브러리 인 Aubio 라이브러리를 사용해 볼 수 있습니다.

온라인 Echonest API 도 있습니다. 여기에는 MP3를 웹 사이트에 업로드하고 XML을 검색하는 과정이 포함되므로 적합하지 않을 수 있습니다.

편집 : 나는 지난 밤에 이것을 발견했다-내가 직접 사용하지는 않았지만 매우 유망한 C / C ++ 라이브러리. Vamp 플러그인


관심있는 연구의 일반적인 영역은 음악 정보 검색입니다.

이를 수행하는 다양한 알고리즘이 있지만 모두 기본적으로 ONSET DETECTION을 중심으로합니다.

시작 감지는 이벤트의 시작을 측정하며이 경우 이벤트는 재생중인 음표입니다. 가중 푸리에 변환 (High Frequency Content)의 변화를 찾을 수 있으며 스펙트럼 콘텐츠의 큰 변화를 찾을 수 있습니다. (분광 차이). (더 자세히 살펴볼 것을 권장하는 몇 가지 논문이 있습니다.) 시작 감지 알고리즘을 적용하면 임계 값을 통해 비트가있는 위치를 선택합니다.

비트의 시간 현지화를 얻은 후에 사용할 수있는 다양한 알고리즘이 있습니다. 그것을 펄스 트레인으로 바꿀 수 있습니다 (항상 0 인 신호를 만들고 비트가 발생할 때만 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

다음은 일부 사람들이 논의하는 내용에 대한 확장입니다.

누군가가 머신 러닝 알고리즘을 적용하는 방법을 언급했습니다. 기본적으로 시작 감지 기능 (위에서 언급)에서 여러 기능을 수집하고 신경망 / 로지스틱 회귀에서 원시 신호와 결합하고 비트가 비트를 만드는 요소를 학습합니다.

Andrew Ng 박사를 살펴보세요. 그는 Stanford University에서 온라인으로 무료 머신 러닝 강의를 제공합니다 (장시간 비디오 강의가 아니라 실제로 온라인 원격 강의가 있습니다).


프로젝트에서 Python 코드와 인터페이스 할 수 있다면 Echo Nest Remix API 는 Python을위한 매우 매끄러운 API입니다.

analysis.tempoBPM을 제공 하는 방법 이 있습니다. API 문서 또는 튜토리얼 에서 볼 수 있듯이 단순한 BPM보다 훨씬 더 많은 일을 할 수 있습니다.


푸리에 변환을 수행 하고 전력 스펙트럼에서 피크를 찾습니다. 사람의 청력을 위해 20Hz 컷오프 이하의 피크를 찾고 있습니다. 일반적으로 0.1-5Hz 범위에서 관대하다고 생각합니다.

도움이 될만한 질문 : Bpm 오디오 감지 라이브러리

Also, here is one of several "peak finding" questions on SO: Peak detection of measured signal


Edit: Not that I do audio processing. It's just a guess based on the fact that you're looking for a frequency domain property of the file...


another edit: It is worth noting that lossy compression formats like mp3, store Fourier domain data rather than time domain data in the first place. With a little cleverness, you can save yourself some heavy computation...but see the thoughtful comment by cobbal.


Accurate BPM detection is very difficult. See this stackoverflow question, and my reply to it.


To repost my answer: The easy way to do it is to have the user tap a button in rhythm with the beat, and count the number of taps divided by the time.


Others have already described some beat-detection methods. I want to add that there are some libraries available that provide techniques and algorithms for this sort of task.

Aubio is one of them, it has a good reputation and it's written in C with a C++ wrapper so you can integrate it easily with a cocoa application (all the audio stuff in Apple's frameworks is also written in C/C++).


There are several methods to get the BPM but the one I find the most effective is the "beat spectrum" (described here). This algorithm computes a similarity matrix by comparing each short sample of the music with every others. Once the similarity matrix is computed it is possible to get average similarity between every samples pairs {S(T);S(T+1)} for each time interval T: this is the beat spectrum. The first high peak in the beat spectrum is most of the time the beat duration. The best part is you can also do things like music structure or rythm analyses.


Here's a free program will analyze and write BPM to ID3V2 tag. No idea how good


I'd imagine this will be easiest in 4-4 dance music, as there should be a single low frequency thud about twice a second.

참고URL : https://stackoverflow.com/questions/657073/how-to-detect-the-bpm-of-a-song-in-php

반응형