PHP에서 노래의 BPM을 감지하는 방법 [닫힌]


78

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

답변:


42

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


오년 후에 GameDev 기사는 없습니다 (404)ツ(자주 따라, webarchive.org을 사용할 수 있습니다 외에도 않습니다 web.archive.org/web/20120525085210/http://archive.gamedev.net/... )
earcam

GameDev 기사에서 잠시 설명해 주시겠습니까? 저자는 1024 개의 샘플을 약 500 초 ( th? ) 초로 두라고합니다. 그리고 나중에 그는 44032 샘플이 약 1 초라고 말합니다. 하지만 0.05 초당 1024 개 샘플이 1 초당 20480 개 샘플과 같다면 어떻게 얻었 을까요? 다른 주파수가 있습니까? 이 텍스트 조각은 1024 번을 처음 입력하면 쉽게 찾을 수 있습니다.
Powercoder

30

검색 할 키워드는 "비트 감지", "비트 추적"및 "음악 정보 검색"입니다. 여기에 많은 정보가 있습니다 : 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


OSX 대상 용 Vamp 플러그인을 빌드하기가 어렵습니다. 종속성이있는 프로브는 없지만 darwin 용 os typedef가 있습니다. sdk를 ... / Developer / SDKs / iPhoneOS7.0.sdk로 전환 한 후 make -f build / Makefile.osx를 시도하여 무슨 뜻인지 확인하십시오.
loretoparisi

22

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

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

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

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


9

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

이를 수행하는 다양한 알고리즘이 있지만 모두 기본적으로 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에서 온라인으로 무료 머신 러닝 강의를 제공합니다 (긴 바람의 비디오 강의가 아니라 실제로 온라인 원격 강의가 있습니다).


9

프로젝트에서 파이썬 코드와 상호 작용할 수 있다면 Echo Nest Remix API 는 매우 매끄러운 파이썬 용 API입니다.

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


7

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

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

또한 다음은 SO에 대한 몇 가지 "피크 찾기"질문 중 하나입니다. 측정 된 신호의 피크 감지


편집 : 내가 오디오 처리를하는 것은 아닙니다. 파일의 주파수 도메인 속성을 찾고 있다는 사실에 근거한 추측 일뿐입니다.


또 다른 편집 : mp3와 같은 손실 압축 형식은 처음에 시간 도메인 데이터가 아닌 푸리에 도메인 데이터를 저장한다는 점에 주목할 가치가 있습니다. 약간의 영리함으로 무거운 계산을 절약 할 수 있지만 cobbal의 사려 깊은 의견을 참조하십시오.


1
그러나 mp3는 사람의 청각을 벗어난 주파수를 잘라내어 압축합니다. 푸리에가 여기서 올바른 도구가 아닐 수도 있습니다.
cobbal

1
MP3는 사람의 청력을 벗어난 주파수를 '잘라 내지'않고 각각 약 1ms 너비의 엔벨로프 창에 대해 개별적으로 코사인 변환 (푸리에와 관련)을 수행합니다. 나는 10 초의 긴 창에서 dmckee의 첫 번째 제안을 시도하고 무엇이 나오는지 볼 것입니다.
TrayMan

이것은 정말 잘 작동하기에는 너무 단순합니다.
Timmmm


2

내 답변을 다시 게시하려면 : 쉬운 방법은 사용자가 비트에 맞춰 리듬에 맞춰 버튼을 탭하게하고 탭 수를 시간으로 나눈 값을 세는 것입니다.


2

다른 사람들은 이미 일부 비트 감지 방법을 설명했습니다. 이런 종류의 작업에 대한 기술과 알고리즘을 제공하는 라이브러리가 몇 개 있다고 덧붙이고 싶습니다.

Aubio 는 그 중 하나이며 좋은 평판을 가지고 있으며 C ++ 래퍼를 사용하여 C로 작성되었으므로 코코아 응용 프로그램과 쉽게 통합 할 수 있습니다 (Apple 프레임 워크의 모든 오디오 항목도 C / C ++로 작성 됨).


2

BPM을 얻는 방법에는 여러 가지가 있지만 가장 효과적인 방법은 "비트 스펙트럼"( 여기에서 설명 )입니다. 이 알고리즘은 음악의 짧은 샘플을 다른 샘플과 비교하여 유사성 매트릭스를 계산합니다. 유사성 행렬이 계산되면 각 시간 간격 T에 대해 모든 샘플 쌍 {S (T); S (T + 1)} 사이의 평균 유사성을 얻을 수 있습니다. 이것이 비트 스펙트럼입니다. 비트 스펙트럼의 첫 번째 높은 피크는 대부분의 경우 비트 지속 시간입니다. 가장 좋은 점은 음악 구조 나 리듬 분석과 같은 작업도 할 수 있다는 것입니다.



-2

나는 이것이 4-4 댄스 음악에서 가장 쉬울 것이라고 생각합니다. 1 초에 두 번 정도의 저주파 소리가 있어야하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.