2024. 8. 8. 22:52ㆍDevelopers 공간 [Shorts]/Vision & Audio
<분류>
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에서 distutils의 Extension대신 setuptools의 Extension을 사용해주면 수정할 수 있습니다.
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
'Developers 공간 [Shorts] > Vision & Audio' 카테고리의 다른 글
[Generative] Python으로 FID 구하기 (0) | 2024.10.15 |
---|---|
[Audio] Python Pedalboard를 활용해 Audio를 바꾸기 (2) | 2024.10.10 |
[Audio] Python에서 Audio 불러오기 (0) | 2024.07.15 |
[Audio] Python에서 MIDI 파일 다루기 (0) | 2024.07.15 |
[NLP] Python으로 Regular Expression 활용 예시 (0) | 2024.07.07 |