[Audio] Python활용해 BPM 측정하기

2024. 8. 8. 22:52Developers 공간 [Shorts]/Vision & Audio

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

 

이번 글에서는 다양한 패키지를 활용해 음악의 bpm을 구하는 방법을 살펴보겠습니다.


2. Why? (원인)

  • X

3. How? (해결책)

각각의 패키지를 구현한 방법을 살펴본 뒤에, 실험결과를 살펴보겠습니다.

 

1. Essentia

 

Essentia 패키지를 설치해줍니다.

pip3 install essentia

 

아래와 같이 bpm을 얻습니다.

import essentia.standard as es

audio_file = 'myfile.mp3'
 
audio = es.MonoLoader(filename=audio_file)() 
bpm, beats, beats_confidence, _, beats_intervals = rhythm_extractor = es.RhythmExtractor2013(method="multifeature")(audio)
print(f"[Essentia] The estimated tempo is {bpm:.2f} BPM")

 

2. Madmom

 

Madmom 패키지를 설치해줍니다. 그냥 pip3를 활용해 설치하면 문제가 많아 아래와 같이 직접 소스로 설치하겠습니다.

# Pre-install packages
pip3 install cython
apt-get install ffmpeg

# Get sources
git clone  https://github.com/CPJKU/madmom.git
cd madmom
git submodule update --init —remote

# Install
python3 setup.py develop --user

# Test
python3 setup.py pytest

 

위 설치 과정에서 setuptools 패키지 때문에 문제가 발생할 수 있는데, 이 때 받은 소스의 setup.py에서 distutilsExtension대신 setuptoolsExtension을 사용해주면 수정할 수 있습니다.

from distutils.extension import Extension (제거)
from setuptools import setup, find_packages → from setuptools import setup, find_packages, Extension (추가)

 

아래와 같이 bpm을 얻어주었습니다.

from madmom.features.beats import BeatTrackingProcessor, RNNBeatProcessor 
import numpy as np

audio_file = 'myfile.mp3'
 
act = RNNBeatProcessor()(audio_file)
processor = BeatTrackingProcessor(fps=100) 
beats = processor(act) 
#beats = processor(audio_file) 
bpm = 60. / np.diff(beats).mean() 
print(f"[MADMOM] The estimated tempo is {bpm:.2f} BPM")

 

 

3. Librosa

 

Librosa 패키지를 설치해줍니다.

pip3 install librosa

 

아래와 같이 bpm을 얻어주었습니다.

import librosa 

audio_file = 'myfile.mp3'
 
y, sr = librosa.load(audio_file) 
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr) 
print(f"[LIBROSA] The estimated tempo is {tempo[0]:.2f} BPM")

 

4. 실험 결과

 

각각에 대해 결과 비교 실험 결과는 아래와 같습니다.

 

a. 실제 126 BPM인 음원

셋다 잘 나오는 것 같아 보입니다.

[Essentia] The estimated tempo is 126.02 BPM
[MADMOM] The estimated tempo is 126.07 BPM
[LIBROSA] The estimated tempo is 123.05 BPM

 

b. 실제 78 BPM인 음원

Librosa의 결과가 부족해보입니다.

[Essentia] The estimated tempo is 77.98 BPM
[MADMOM] The estimated tempo is 92.38 BPM
[LIBROSA] The estimated tempo is 39.15 BPM

 

c. 실제 78 BPM인 음원

Librosa의 결과가 부족해보입니다.

[Essentia] The estimated tempo is 78.99 BPM
[MADMOM] The estimated tempo is 81.33 BPM
[LIBROSA] The estimated tempo is 39.75 BPM

 

 

c. 실제 58 BPM인 음원

이 음원은 드럼 비트가 없는 솔로 연주여서 BPM을 알아내기 쉽지 않아 모두가 틀린 값을 냅니다. 하지만 Librosa의 결과가 좀 더 부족해보입니다.

[Essentia] The estimated tempo is 111.82 BPM
[MADMOM] The estimated tempo is 126.48 BPM
[LIBROSA] The estimated tempo is 234.91 BPM

 


https://www.quora.com/Which-Python-libraries-can-I-use-to-get-the-BPM-beats-per-minute-of-a-MP3-file

728x90
반응형