Python | librosaを用いて曲のテンポを数値化しよう

Python | librosaを用いて曲のテンポを数値化しよう

みなさん、こんにちは!

今回は 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)

今回は以上です。

エラー: データの取得に失敗しました。