はじめに
どーも!!!!deoxyです!
音楽分析がしたい!と思いlibrosaを勉強してみました。
ゆくゆくは曲のコード分析やキー分析をしたい!!!
Python3.12以上はlibrosaとの依存関係が不安定であり、うまく作動しないことがあります
実行環境
- Google Chrome 137.0.0.0
- Google Colaboratory
- Python 3.11.12
- librosa 0.11.0
Librosa
librosaとは、音楽とオーディオ分析のためのPythonパッケージです。
公式ドキュメント
Windowsの場合は、terminalを起動して
$ pip install librosa
と打てばlibrosaがインストールされます。
Pythonのバージョンによってはちゃんと動かないこともあるから注意!
BPM検出
まずはBPMの検出を試してみます。
使った音源はこちら
Mrs.GREENAPPLE様のインフェルノです。
インフェルノのBPMをネットで調べたところ92と180~189という2通りが出てきました。ちょうど倍になっているので取り方の違いですかね。
まあそれっぽい数字が出たらよしとしましょう
実装
import librosa
# 音声ファイルの読み込み(適切なサンプリングレートに設定)
music, hz = librosa.load("sample.wav", hz=22050)
# テンポとビートの検出
tempo, beats = librosa.beat.beat_track(y=music, sr=hz)
print(tempo)
[92.28515625]
なんとこんなに簡単に実装ができます。
検出されたBPMは92なので大体あっていますね。
音声ファイルの読み込み
music
はnumpy配列で、22050kHzにサンプリングされた音声波形データが格納されています。
hz
はサンプリング周波数を格納します。サンプリングを行わない場合は、hz = none
としてください。
librosa.load
はタプル型を返します。そのため変数が二個入っています。
BPM検出
librosa.beat
がBPMやビートを検出するためのモジュールです。このモジュールもタプル型を返します。
librosaの中にあるbeat_track
関数は引数としてy
とsr
を持っています。そのため、関数の引数y, srに音声ファイルの読み込み時に使ったmusicとhzを渡してあげます。
今回はBPM(テンポ)が知りたいので、テンポを出力します。
これで簡単にBPMが求まります。
ちょっと脱線
Librosaはローカルのファイルしか読み込めないらしいです。
YouTubeやニコニコから曲を取ってきたいなっていうときは一度ダウンロードしてあげる必要があります。不便;;
moviepy
というパッケージを使えばPythonのプログラム内でYouTubeから音声をダウンロードし一時的に保存することが可能になります。
気が向いたら試してみます。
参考
おわりに
有名どころであればBPMは調べたら出てくるのですが、ちょっとマイナーな曲だと出てこなかったりします。練習するときにメトロノームは必須なのでBPMがわかると便利です。
今回は公式ドキュメント(英語;;)とChatGPT君を頼りに作りました。
ドキュメントを読みながらコードを自分なりに書いてみて、エラーがでてどうしようもなければGPT君にお願いしていました。GPT君に丸投げはよくないけどコード理解のために使うのはいいですね。便利です。
deoxyでした!