Python | librosaを用いて曲のテンポを数値化しよう
- 2023.09.03
- librosa(Pythonプログラム)
みなさん、こんにちは!
今回は librosaを用いたテンポの数値化を行います。
librosa.beat.beat_track
beat_trackを用いることで、曲のテンポを解析することができます。
サンプルプログラム
くるみ割り人形のテンポを算出します。
import librosa
y, sr = librosa.load(librosa.example('nutcracker'), duration=10) #くるみ割り人形を10秒間
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
print(tempo)
print(beats)
結果、tempoは「107.666015625」となりました。
beats
テンポの要となるフレームの番号が格納されています。
今回の場合は以下のフレームです。
[ 51 74 100 124 149 173 198 221 247 271 295 319 344]
このフレームをタイムスタンプに変換するには、以下のように記載します。
fr_time = librosa.frames_to_time(beats, sr=sr)
print(fr_time)
出力結果は以下のようになります。
[1.18421769 1.71827664 2.32199546 2.87927438 3.45977324 4.01705215
4.59755102 5.13160998 5.7353288 6.29260771 6.84988662 7.40716553
7.9876644 ]
波形とビートを重ね合わせる
ロードした曲と波形を重ね合わせてみます。
波形の描画は右記の記事でも取り上げています。(参考)
※元の音源の波形は以下の通りです。
サンプルプログラム
以下、音源とクリック音の波形を重ね合わせるプログラムです。
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
import IPython.display
#------------------------------------------------------------
#くるみ割り人形を10秒間取得し、テンポとビートを取得
#------------------------------------------------------------
y, sr = librosa.load(librosa.example('nutcracker'), duration=10)
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
#------------------------------------------------------------
#横軸を時間に変換
#------------------------------------------------------------
times = time = np.arange(0,len(y)) / sr
fr_time = librosa.frames_to_time(beats, sr=sr)
#------------------------------------------------------------
#波形の描画
#------------------------------------------------------------
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(times, y)
ax2.vlines(fr_time, 0 ,1, alpha=0.5, color='r', linestyle='--')
plt.xlabel("Time(s)")
plt.ylabel("Sound Amplitude")
plt.show()
#------------------------------------------------------------
# 原曲の再生
#------------------------------------------------------------
#IPython.display.Audio(data=y, rate=sr)
#------------------------------------------------------------
# クリック音を追加して再生
#------------------------------------------------------------
clicks = librosa.clicks(frames=beats, sr=sr, length=len(y))
IPython.display.Audio(data= y + clicks, rate=sr)
今回は以上です。
エラー: データの取得に失敗しました。
-
前の記事
Python | librosaを用いて騒音計を作るには?(PyAudio、matplotlib) 2023.08.30
-
次の記事
Python | librosaを用いて曲のテンポを一覧化してみる(水樹奈々 / The Museum) 2023.09.05