曲のテンポ、コードを取得する ~全ての音楽愛好家のためのSpotify API ep 2~

python
python

Spotify APIの本領を発揮していこう。

音楽プレイヤー必見!!!

記事①:PythonでSpotify APIを使ってみる ~全ての音楽愛好家のためのSpotify API ep 1~

前回は、Spotify APIの導入とデモをやってみました。
今回から、目的別でいろいろやってみたいと思います。

さて、音楽作成したり、バンドで曲をコピーしたり、動画に曲をつけたりするときに、曲の長さ、テンポ、コード(キー)といった情報を知りたいと思ったことはないでしょうか?

有名な曲だったら、どこかで誰かが情報をアップしているので調べる事が可能です。
しかし、マイナーな曲や最新の曲ではこれらデータが見つからないケースもしばしばあります。

Spotify APIなら、曲に様々な情報が埋め込まれており、これらを収集することが出来ます。

あなたの音楽ライフのお供にPythonを。
(2021年5月23日:学習開始93日目 PyQさんで勉強中!

オンラインPython学習サービス「PyQ™(パイキュー)」

今回は、最新の曲の情報を取得したいと思います。
という事で、藤井風さんの最新曲「きらり」を取り上げたいと思います。
2020年に1stアルバムを発売してからの快進撃はあえて説明するまでもないですね。
これからどんな音楽を届けてくれるのか、とても楽しみなアーティストです。
(曲名から公式YouTubeに飛びます。)

では、早速やっていきましょう。

最終のプログラムはGitHubに置いておきます。

1.Spotify APIを使おう

Spotify APIはSpotifyの所有しているバックデータを取得したり、Spotifyを操作したりできるAPIです。公式のWeb API Tutorial

Spotify APIを使うには、Spotifyの登録が必要です。
また、spotipyというライブラリを使っていくので、このインストールも必要です。
そのあたりは、PythonでSpotify APIを使ってみる ~全ての音楽愛好家のためのSpotify API ep 1~に記載しているので、ご参照ください。

準備編はこれで終了です。

2.曲の情報を取得しよう

今回の本編です。
では、早速やってみましょう。

冒頭に書いたように、藤井風さんの最新曲「きらり」の情報を取得したいと思います。

曲情報を取得するので、まずSpotifyの「きらり」のトラックIDを検索して取得します。
こちらの手順も前回記事を参照ください。

次に曲情報を取得していきます
曲情報の取得には、spotipyライブラリの中の、「audio_features」を使っていきます。

では、プログラムに書いていきましょう。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

#入力パート
artist_url = ''
album_url =''
track_url = 'https://open.spotify.com/track/3ciqhcLmXP4hVGBD98QlEj'

#認証パート
my_id ='0000000000000000000000' #client ID
my_secret = '0000000000000000000000' #client secret
ccm = SpotifyClientCredentials(client_id = my_id, client_secret = my_secret)
spotify = spotipy.Spotify(client_credentials_manager = ccm)

results = spotify.audio_features(track_url)
print(results)

結果は以下のようになりました。

[{'danceability': 0.746, 'energy': 0.764, 'key': 2, 'loudness': -6.833, 'mode': 1, 'speechiness': 0.0462, 'acousticness': 0.00803, 'instrumentalness': 0, 'liveness': 0.357, 'valence': 0.701, 'tempo': 116.982, 'type': 'audio_features', 'id': '3ciqhcLmXP4hVGBD98QlEj', 'uri': 'spotify:track:3ciqhcLmXP4hVGBD98QlEj', 'track_href': 'https://api.spotify.com/v1/tracks/3ciqhcLmXP4hVGBD98QlEj', 'analysis_url': 'https://api.spotify.com/v1/audio-analysis/3ciqhcLmXP4hVGBD98QlEj', 'duration_ms': 231883, 'time_signature': 4}]

情報が取得できています。ただ、見ずらいですね。分かりやすく変えていきましょう。
まず、形式は、[{~~~~~}]という形で、リスト型の中に辞書型のデータが入っています。
という事で、results[0]で辞書型データを取得します。
さらにfor文でアイテムごとにデータを取り出します。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

#入力パート
artist_url = ''
album_url =''
track_url = 'https://open.spotify.com/track/3ciqhcLmXP4hVGBD98QlEj'

#認証パート
my_id ='0000000000000000000000' #client ID
my_secret = '0000000000000000000000' #client secret
ccm = SpotifyClientCredentials(client_id = my_id, client_secret = my_secret)
spotify = spotipy.Spotify(client_credentials_manager = ccm)

results = spotify.audio_features(track_url)
result = results[0]
for key, val in result.items():
    print(f'{key} : {val}')

結果は以下のようになりました。

danceability : 0.746
energy : 0.764
key : 2
loudness : -6.833
mode : 1
speechiness : 0.0462
acousticness : 0.00803
instrumentalness : 0
liveness : 0.357
valence : 0.701
tempo : 116.982
type : audio_features
id : 3ciqhcLmXP4hVGBD98QlEj
uri : spotify:track:3ciqhcLmXP4hVGBD98QlEj
track_href : https://api.spotify.com/v1/tracks/3ciqhcLmXP4hVGBD98QlEj
analysis_url : https://api.spotify.com/v1/audio-analysis/3ciqhcLmXP4hVGBD98QlEj
duration_ms : 231883
time_signature : 4

データの中身が見れました。
ただ、内容が良く分かりません。公式のREFERENCEに説明があるので訳していきます。

項目 (キー)内容
danceability曲がダンスに適しているか尺度。0~1で表示。
0が最も踊りにくく、1が最も踊りやすい。
energy曲のエネルギッシュさを示す尺度。0~1で表示。
高いほどエネルギッシュ。
デスメタルが高くて、バッハが低いらしいです。
key曲のキー(高さ)です。整数で表示。
ピッチクラスで表現される。
例:0 = C、2 = D
loudness曲全体のラウドネス(音圧)のデシベル値の平均。
一般的にー60 ~ 0 dbとの事。
mode曲のスケール(メジャー、マイナー)。
一般的にメジャーは明るく、マイナーは暗い印象の曲。
メジャーは1,マイナーは0で表現。
speechiness曲内の話言葉の割合。0~1で表示。
0.66を超えるとほぼ話言葉で構成されている。
0.33~0.66はラップのような曲らしい。
acousticness曲のアコースティック(生音)感を示す尺度。0~1で表示。
高いほどアコースティック感が強い。
instrumentalness曲にボーカルが含まれていない割合。0~1で表示。
1に近づくほど、ボーカルが含まれない可能性が高い。
0.5を超えるとインスト曲(楽器のみの曲) となるように設定。
liveness曲のライブ感。曲のバックの聴衆の存在を検出して0~1で表示。
高いほどライブ感が強い。0.8を超えるとライブ録音である可能性が高い
valence曲のポジティブさを示す尺度。0~1で表示。
高いほどポジティブ感(幸福感、陶酔感)が強い。
低いほどネガティブ感(悲壮感、怒り)が強い。
tempo曲全体の推定テンポ(BPM)
typeオブジェクトタイプaudio_features (このデータの形式)
id曲のSpotify ID
uri曲のSpotify URI
track_href曲の詳細情報にアクセスするAPIリンク
analysis_url曲のオーディオ分析にアクセスするためのAPIリンク。
アクセスするには、アクセス権限が必要。
duration_ms曲の長さ。ミリ秒単位で表現される。
time_signature曲の拍子記号。各小節に含まれる拍数。4なら4拍子と思われる。

かなりたくさんの情報がありますね。
独自指標はなかなか面白いものがあります。

3.音楽活動に有益な情報を抽出しよう

この中で、曲のコピーとかアドリブとかをやるときに使えるのは、
key」「mode」「tempo」「duration_ms」「time_signature
あたりだと思います。

藤井風さんの「きらり」の場合、
key : 2
mode : 1
tempo : 116.982
duration_ms : 231883
time_signature : 4
です。
つまり、「スケールはD(メジャー)」「117 BPM」「曲の長さ231883=3分51.8秒」「4拍子」
という事が分かります。

この辺りがそのまま出力されるようにプログラムを変えてみましょう。
あと、曲そのものの情報も表示されるようにしたいと思います。
曲そのものの情報を得るのは、trackモジュールを使います。
複数のモジュールでアクセスするので、途中で1秒停止を挟みます(アクセス負荷を下げるため)。

詳細は略しますが、以下のようなプログラムになりました。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import time

#入力パート Input part
track_url = 'https://open.spotify.com/track/3ciqhcLmXP4hVGBD98QlEj'

#認証パート Authentication part
my_id ='0000000000000000000000' #client ID
my_secret = '0000000000000000000000' #client secret
ccm = SpotifyClientCredentials(client_id = my_id, client_secret = my_secret)
spotify = spotipy.Spotify(client_credentials_manager = ccm)

track_data = spotify.track(track_url)
time.sleep(1) #STOP 1sec
results = spotify.audio_features(track_url)
result = results[0]
pitch_class = {0:'C', 1:'C#', 2:'D', 3:'D#', 4:'E', 5:'F',
               6:'F#', 7:'G', 8:'G#', 9:'A', 10:'A#', 11:'B'}
mode_dec = {0:'Minor', 1:'Major'}
ptich = pitch_class[result['key']]
mode_m = mode_dec[result['mode']] #Minor ot Major
track_ms = result['duration_ms'] #track duration msec
track_s = track_ms/1000 #曲長さ sec track duration sec
track_min = track_s//60 #曲長さ min track duration min
track_min_sec = track_s -60 * track_min #曲長さ min track duration min
print('artist  :  ' + track_data['album']['artists'][0]['name'])
print('track  :  ' + track_data['name'])
print('popularity  :  ' + str(track_data['popularity']))
print(f'track time  :  {int(track_min)}min {track_min_sec:.1f}sec')
print('pitch  :  ' + ptich + ' ' + mode_m)
print('tempo(BPM)  :  ' + str(result['tempo']))
print('beat  :  ' + str(result['time_signature']))

結果は以下のように出力されます。

artist  :  Fujii Kaze
track  :  きらり
popularity  :  72
track time  :  3min 51.9sec
pitch  :  D Major
tempo(BPM)  :  116.982
beat  :  4

うまくデータが出力できています。

ちなみに、変拍子で有名な曲、Stingの「Seven Days」でやってみると、結果はこのようになります。

artist  :  Sting
track  :  Seven Days
popularity  :  52
track time  :  4min 38.2sec
pitch  :  C Major
tempo(BPM)  :  92.033
beat  :  5

この曲は、全編4分の5拍子なので、beatが5になっています。

一方で、部分的に変拍子の超有名曲、The Beatlesの「All You Need Is Love」でやってみると、このようになります。

artist  :  The Beatles
track  :  All You Need Is Love - Remastered 2015
popularity  :  57
track time  :  3min 47.8sec
pitch  :  G Major
tempo(BPM)  :  104.54
beat  :  4

beatは4です。部分的な変拍子だと4になるようです。Perfumeポリリズムとかも。

というか、popularityは知名度の指標ですが、あまりあてにならないかも。

今回は、キリが良いのでここまでにします。
次回は、Spotify APIを使ってさらに遊んでいきます。

To Be Continued :全ての音楽愛好家のためのSpotify API ep 3

PyQさんで勉強中!

コメント

タイトルとURLをコピーしました