5分間の曲(0:00~4:59)をlibrosaで分析をかけ、そこに数秒毎に窓を設けて平均や分散を取りたいです。
しかし、1秒あたりのフレーム数の指定の方法が正しいのか分かりません。
librosa.frames_to_time
は秒単位に変換するメソッドではないのでしょうか?
python
1import librosa 2import sklearn 3import numpy as np 4 5audio_path = './mp3/song.mp3' 6x , sr = librosa.load(audio_path, sr=None) # sr(サンプリング周波数) sr=None:リサンプリング無効 7 8 9#特徴抽出 10spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0] 11print('spectral_centroids.shape:',spectral_centroids.shape) 12#OUT:25869 13 14 15#frame数をlenで取得しrangeをかける=range(0, 25869) 16frames = range(len(spectral_centroids))#0から任意の値までの連番: range(stop) 17print('frames:',frames) 18#OUT:range(0, 25869) 19 20t = librosa.frames_to_time(frames) #秒単位に変換? 21#OUT:[0.00000000e+00 2.32199546e-02 4.64399093e-02 ... 6.00607347e+02 22# 6.00630567e+02 6.00653787e+02] 23 24#正規化 25def normalize(x, axis=0): 26 return sklearn.preprocessing.minmax_scale(x, axis=axis) 27 28librosa.display.waveplot(x, sr=sr, alpha=0.4) 29plt.plot(t, normalize(spectral_centroids), color='r') 30print('len(t):',len(t),'len(spectral_centroids)',len(spectral_centroids)) 31#OUT:len(t): 25869 len(spectral_centroids) 25869
フレーム数が25869
であり曲長が5分(60s*5=300s)なので
25869//300*[指定したい秒数]
で試した見たのですがいまいちでした。
指定したい秒数の半分の値でやるといい感じにはなるのですが、最適ではない気がします。
適した方法を教えていただきたいです。
python
1sec_select = 25869//300*25(50秒を指定したい) 2librosa.display.waveplot(x, sr=sr, alpha=0.4) 3plt.plot(sc[:sec_select,0],sc[:sec_select,1], color='r') 4
あなたの回答
tips
プレビュー