LoginSignup
34
30

More than 3 years have passed since last update.

PythonでSpotify API [audio_features編]

Posted at

楽曲の解析情報

ぼくがSpotifyのAPIに手を出した大きな理由として、楽曲ごとの解析情報(それもかなりこまかい)が提供されているということがあります。

まぁ詳しく知っていたわけではないんですが、Spotifyを愛用していると、「こまかい情報あるよ」と言われるだけで、そうなんだろうなと思うわけです。
それくらいなんかオススメ楽曲とかの精度がよい。

で、頑張ってAPIのリファレンスとか読んでやってみているわけなんですが、リファレンスのリンクたどって英語読むのも飽きちゃうのでここにノートとしてまとめておきますね。

どんな情報がとれる?

(ぼくが)楽曲の解析情報と呼んでいるものは、オブジェクト的には2つ。
audio_featuresと、audio_analysisです。

リファレンス読んでみたかんじ、ざっくりいうと
audio_features曲を全体的に見たデータで、audio_analysis曲を細かい単位に分割して分析したってかんじのデータ。

今回はaudio_featuresをまとめてみまーす

audio_features

曲全体の印象を主に数値で表したオブジェクト。情報の文字列検索でも少し触れました。少しだけ。

表はリファレンスをふんわり訳したものです。
項目自体の意味もふんわりなので、詳しく知りたい人は英和辞書片手にリファレンスへ。

キー 意味
acousticness その曲がどれくらいアコースティックなのかを、0.0から1.0までの数字で表します。
どれくらいシンセとかエレキ楽器を使わずに演ってるかってこと。
多分だけど、「曲の中にアコースティックな部分(時間)がどれだけあるか」とニアイコール。
analysis_url 後述のaudio_analysisへのURLを指します。
danceability その曲がどれだけ踊れるか楽曲なのかを、0.0から1.0までの数字で表します。
要するにダンスミュージックっぽさ。テンポやリズムに基づいてるみたいだけどまぁ深く考えなくていいんじゃないかな。踊れば。
duration_ms 楽曲の時間をなんとミリ秒でお届け。
energy 曲のエネルギー量を0.0から1.0の以下略。
速くて騒々しい曲はエネルギーが高くなり、逆に静かでゆっくりな曲は低いようです。0.5はまさに冷静と情熱の間。ちがうか。
id 言わずもがな。
instrumentalness どれくらい歌(AhとかOhは歌に含まない)が無いかを0.0から1.0で。
ラップのようなThe歌詞みたいな部分が多いほど、この値は低くなります。
公式によると、0.5を超えてればだいたいインストなんじゃねーかと。
key 曲のキー
0 = C, 1 = C♯/D♭, 2 = D,...のように対応づけられた値が入ります。
liveness ライブっぽさ。0.0から1.0。
基準は「観客がいるかどうか(歓声とかかな)」で、0.8を超えたらまぁライブ音源でしょと。2階席聞こえるー?
loudness 平たく言ってうるささ。曲全体のデシベル値を平均したものです。
mode スケール。音楽やらない人は興味ないかな。
メジャーが1でマイナーが0。
speechiness 喋りっぽさ(0.0〜1.0)。トークショーやドラマトラックだと高くて、音楽なら低い。
以下が目安らしい。
0.66以上:ほぼ喋り
0.33〜0.66:喋りっぽい部分を含む曲(ラップとか)
0.33以下:(ほぼ)喋りなし
tempo 曲全体のBPMの平均
time_signature 曲全体の拍子。たぶん途中で拍子が変わる曲はダメ。
track_href トラックの詳細へのリンク
type オブジェクトの種類。確定で文字列”audio_features”
uri 曲のURI
valence 曲のポジティブさ(0.0〜1.0)。
これに関してはよくわからない。

ちなみに表の中で範囲が0.0から1.0までとしているものは、小数点以下が細かく出ます。
ぽちぽち打ってみたところ、小数点第三位とか第四位は出てくる。

とりあえずとってみる

ではとってみましょうか。
SpotifyAPIが初めてで、登録とかやってないしClientIDってなんやねん!!って方がいらっしゃったらとにかく使ってみる編とか読んでまずはAPI使ってみてくださいな。

以下のコードを書きます。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import sys
import pprint

client_id = 'ClientIDの値'
client_secret = 'ClientSecretの値'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

result = sp.audio_features('6KDmk0EF3Qk7zJfDDtRoF2')
pprint.pprint(result)

ちなみにsp.audio_features()の引数に指定しているIDはゴールデンボンバーさんの曲「令和」です。いい時代になるといいですね。

実行ドン

{'acousticness': 0.0939,
 'analysis_url': 'https://api.spotify.com/v1/audio-analysis/6KDmk0EF3Qk7zJfDDtRoF2',
 'danceability': 0.573,
 'duration_ms': 241680,
 'energy': 0.955,
 'id': '6KDmk0EF3Qk7zJfDDtRoF2',
 'instrumentalness': 0,
 'key': 7,
 'liveness': 0.336,
 'loudness': -3.352,
 'mode': 0,
 'speechiness': 0.135,
 'tempo': 142.021,
 'time_signature': 4,
 'track_href': 'https://api.spotify.com/v1/tracks/6KDmk0EF3Qk7zJfDDtRoF2',
 'type': 'audio_features',
 'uri': 'spotify:track:6KDmk0EF3Qk7zJfDDtRoF2',
 'valence': 0.619}

なるほどね?

「令和」が、なかなかエネルギッシュでそこそこポジティブな曲であることがわかりました(凡人の感想)
いろんな曲とって見てみたのですが、令和のdanceabilityは、もうちょっと高くてもいいような気がしないでもない。

似たような曲を探してみる

ある特定の曲を気に入った時に、

「あーこの曲と同じくらい盛り上がっていい雰囲気の曲ないかなー!?」

ってことがひょっとしたらできるんじゃないかと思って、

殴り書きですが、こんなコードを組んでみました。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import sys
import pprint

client_id = 'ClientIDの値'
client_secret = 'ClientSecretの値'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

# 令和を取得
result = sp.audio_features('6KDmk0EF3Qk7zJfDDtRoF2') # 令和
reiwa = result[0]

# プレイリストを取得
result = sp.user_playlist('ユーザID','プレイリストID')

features = []
id_list = []
cnt = 0
for track in result['tracks']['items']:
  cnt += 1
  # プレイリスト内の曲のidを抜き出してリスト化
  id = track['track']['id']
  id_list.append(id)

  if cnt == 50:
    # audio_features()は50個が最大なので、一回取得する
    features.extend(sp.audio_features(id_list))
    cnt = 0
    id_list = [] 

cnt = 0
for feature in features:
  if (reiwa['tempo']-1) <= feature['tempo'] <= (reiwa['tempo']+1) and \
   (reiwa['danceability']-0.1) <= feature['danceability'] <= (reiwa['danceability']+0.1) and \
   (reiwa['loudness']-1) <= feature['loudness'] <= (reiwa['loudness']+1) and \
   (reiwa['energy']-0.1) <= feature['energy'] <= (reiwa['energy']+0.1):

    # 条件に合致した曲を取得
    match = sp.track(feature['id'])

    print(match['name'], "は、令和と同じくらい盛り上がる曲です。")

print('処理が終了しました。')

実行結果

長谷サンズ は、令和と同じくらい盛り上がる曲です。
バビロン天使の詩 は、令和と同じくらい盛り上がる曲です。
処理が終了しました。

ぼくが作ったとあるプレイリスト(100曲入り)からすべて検索し、audio_featuresがもつパラメータが令和に近い曲を探すプログラムです。

比較している箇所ではそれっぽい値を、範囲をもたせて比較するようにしました。

100曲のうち2曲ヒットしました。令和と同じくらい盛り上がるこの2曲(Spotify API調べ)なので、興味がおありの方はぜひ聴いてみていただきたいです。

まとめ

今回はaudio_featuresを紹介しました。

それぞれの値がどうやって算出されているのかは皆目見当も付きませんが、みなさんも遊べる機会があれば、自分の好きな曲をいろいろ見てみて、並べて比較するだけでもけっこうおもしろいとおもいますよ。

34
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
30