質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1310閲覧

librosaで分析した波形を秒単位で区切りたい

sezaki_H

総合スコア41

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/18 04:47

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*2550秒を指定したい) 2librosa.display.waveplot(x, sr=sr, alpha=0.4) 3plt.plot(sc[:sec_select,0],sc[:sec_select,1], color='r') 4

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問