SpotifyAPIで楽曲分析をしてみよう

# はじめに
こんにちは！MYJLab Advent Calendar 2024の20日目を担当する3年の髙梨です。
私は先日のテックプレゼンでも使用したSpotify APIについて紹介したいと思います。Spotify APIは今年卒業研究でも使われている方がいらして、勝手に親近感が沸いてしまいました。笑　結構簡単に扱えるものなので、ぜひ使ってみてください！

# 必要なもの
- Spotifyアカウント：アプリケーションの作成に必要です
- Google Colaboratory：今回はPythonのSpotipyというライブラリを使います

# Spotify Developers アプリケーションの作成
Spotify APIで情報を取得するためにアプリケーションの作成が必要になります。

### 1）Spotify Developersユーザーの作成、ログイン
まず[Spotify Developers](https://developer.spotify.com/)にアクセスし、Sign up for a free Spotify account here.をクリックして、ユーザーアカウントを作成します。
普段使っているSpotifyアカウントを持っている場合はそのまま"Log in"をクリックしてログインすることが出来ます。

### 2）アプリケーションの作成
Spotify Developersにログインしたら、Dashboardの"Create App"からアプリケーションを作成します。アプリケーションの名前、詳細、リダイレクトURIを設定します。リダイレクトするURIはポート番号3000番など適当に設定します。規約同意にチェックをして保存すると、アプリケーションが作成できます。

# 楽曲分析
では、いよいよ楽曲分析をしてみます。例として星野源さんの楽曲情報を出力していきます。星野源さんの楽曲の中でもとくに有名であろう「恋」と「喜劇」を分析して比較してみましょう。

### 「恋」の楽曲分析
~~~ruby:Spotipyのインストール
!pip install spotipy
~~~

~~~ruby:恋の楽曲情報
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import pprint

client_id = 'xxxxx'
client_secret = 'xxxxx'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

music_id = '1flvuaMS27JxpEBL0u2cWc'
result = spotify.audio_features(music_id)
pprint.pprint(result)
~~~

client_idとclient_secretは、アプリケーションを作成したときに取得したものを入れます。
music_idは、Web版Spotifyの楽曲ページのリンクから取得できます。（open.spotify.com/intl-ja/track/～の部分）

![スクリーンショット 2024-12-19 112824_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935387/43e2c628-a6ba-0c5b-717e-11d8b51ac5c7.png)

これらを実行すると以下のような結果が出力されます。

~~~ruby:出力結果
[{'acousticness': 0.00081,
  'analysis_url': 'https://api.spotify.com/v1/audio-analysis/1flvuaMS27JxpEBL0u2cWc',
  'danceability': 0.598,
  'duration_ms': 251267,
  'energy': 0.819,
  'id': '1flvuaMS27JxpEBL0u2cWc',
  'instrumentalness': 0,
  'key': 9,
  'liveness': 0.218,
  'loudness': -2.619,
  'mode': 1,
  'speechiness': 0.0911,
  'tempo': 158.115,
  'time_signature': 4,
  'track_href': 'https://api.spotify.com/v1/tracks/1flvuaMS27JxpEBL0u2cWc',
  'type': 'audio_features',
  'uri': 'spotify:track:1flvuaMS27JxpEBL0u2cWc',
  'valence': 0.878}]
  ~~~

色々出てきました。SpotifyAPIには様々なパラメータがあり、楽曲を数値的に分析できます。

- tempo…曲の全体的な推定テンポをBPMで表したもの
- danceability…曲がダンスに適しているかを0.0から1.0で表したもの
- instrumentalness…曲がインストゥルメンタルである確率を0.0から1.0で表したもの
- energy…曲がエネルギッシュである程度を0.0から1.0で表したもの
- liveness…曲がライブで演奏されている確率を0.0から1.0で表したもの
- valence…曲が陽性の感情（例：幸せ、楽観的、陽気）を伝える確率を0.0から1.0で表したもの
など

例えば、energyは0.819なので、比較的エネルギッシュな曲であることが分かります。またvalanceも0.878と高く、明るい感情を表した曲であることが分かります。

### 「喜劇」の分析
では次に、「喜劇」の分析をしてみましょう。

~~~ruby:喜劇の楽曲情報
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import pprint

client_id = 'xxxxx'
client_secret = 'xxxxx'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

music_id = '6pllZAdgBf4QTcFUrF3DzL'
result = spotify.audio_features(music_id)
pprint.pprint(result)
~~~

~~~ruby:出力結果
[{'acousticness': 0.0322,
  'analysis_url': 'https://api.spotify.com/v1/audio-analysis/6pllZAdgBf4QTcFUrF3DzL',
  'danceability': 0.676,
  'duration_ms': 230667,
  'energy': 0.461,
  'id': '6pllZAdgBf4QTcFUrF3DzL',
  'instrumentalness': 1.01e-06,
  'key': 1,
  'liveness': 0.358,
  'loudness': -6.746,
  'mode': 0,
  'speechiness': 0.143,
  'tempo': 87.917,
  'time_signature': 4,
  'track_href': 'https://api.spotify.com/v1/tracks/6pllZAdgBf4QTcFUrF3DzL',
  'type': 'audio_features',
  'uri': 'spotify:track:6pllZAdgBf4QTcFUrF3DzL',
  'valence': 0.715}]
  ~~~

  「恋」と比較すると、vaenceは0.715とあまり変わらないものの、energyは0.461と低くなっています。またdanceabilityは「恋」が0.598に対して、「喜劇」は0.676で、喜劇の方がダンスに適しているという結果になりました。

  # おわりに
  このように、SpotifyAPIを使うことで簡単に楽曲の分析が出来ました！楽曲の分析の他にもアーティストの分析も出来ますし、ユーザ情報を使えば個人のユーザに対する分析も出来ます。私は前期に自分で作ったランキング表示サイトを今でも定期的に見ています^^ 皆さんもぜひ好きなアーティストを分析をしてみてください！