DJの選曲にもレコメンドがあると楽じゃないか?それTraktorでもできませんかね!?

おはようございます。みなさまはDJですか?僕はどうでしょう。

KAI-YOUエンジニアのコウベ(@cabbagekobe)です。

さて、来たる10月29日にPOP TECH PARTYというイベントが開かれます。なんと1周年!

POP TECH PARTYとは

f:id:KAI-YOU:20191007151844j:plain

POP TECH PARTYとは、風呂グラマーとして知られるエンジニア masuidriveと、行政書士でフェチ東京創設者、近ごろはエンジニアと法律家をつなぐ勉強会StudyCode主催者の新井秀美、そしてKAI-YOUが共同開催する音楽イベントです。

「ゆるいつながり」をテーマとして、エンジニアを中心としたDJによる音楽とエンターテインメントを楽しみながら、技術話だけではなく音楽を通したコミュニケーションの場として本パーティを企画しました。

今まで来たことある人も、行けなかったようという方も、第4回ポプテクへ、ぜひ1周年のお祝いにきてください! 参加DJは随時おしらせしまーす!

参加はFacebookから!
https://www.facebook.com/poptechparty/


という感じのイベントですが、私もDJとして末席に名を連ねさせていただいております。

楽しいイベントになること間違いなし!みんな来てください!!

そんなこんなでちょいちょいDJをやらせていただくこともあるのですが、そのDJ周りでやりたいことを書かせていただきます!
ちょっと長くなりそうなので何度かに分けて…

やりたいことの説明!

私はTraktorというソフトを使っていわゆるPCDJという形でDJを行います。

PCDJのソフト自体はいくつかありますが、その中にAlgoriddim(https://www.algoriddim.com)からリリースされているDjayというアプリがあります。
Mac版、Windows版だけではなくiOSAndroidと多数のプラットフォームに対応しております。

f:id:KAI-YOU:20191007173121p:plain

このDjayには特徴的な機能があります。

それは端末内の音源だけではなくSpotifyの音源を使用してDJができるということです!
Spotify Premiumへの加入が必要)

f:id:KAI-YOU:20191007174022j:plain

また、マッチ機能というものがあります。

f:id:KAI-YOU:20191007174110j:plain

マッチ機能とは

楽曲にはアーティスト名・曲名・ジャンルという簡単なものから、キー(音程)や曲の速さ(BPM)などの情報があります。
これらの情報から割り出してくれているのかは不明ですが、マッチのタブを見るとMIXしても同じキーのもの、やBPMが近い楽曲などの不協和音になりにくい曲をリストアップしてくれます。
マッチで表示された曲リストからMIXしていたらスムーズなMIXが行えます!

例えばでIZ*ONEの日本デビューシングル、好きと言わせたいという曲を再生してマッチの画面を開くとこのようになります。

f:id:KAI-YOU:20191007153307j:plain

*ちなみにこちらに関してはThe Echo Nestというサービスを使っているようですね。(元々オープンソースの音楽レコメンデーションエンジンだったThe Echo Nestですが、2014年にSpotifyに買収されています)

これに近いレコメンドをTraktorから使えるようにするというのが目指すところになります!

とはいうもののThe Echo NestのAPIはもう使えなくなっているっぽいです。
The Echo Nest / Spotify Developer

ということで別の手段を使います。

その手段

Spotifyでは各楽曲にたくさんの情報が埋め込まれています。

参考: note.mu

このSpotifyAPIから取得できる楽曲情報からレコメンドの機能を構築出来ないかなぁ。ということです。

まずはSpotifyAPIを使用できるようにすることから始めましょう。(APIの使用に関してもPremium会員のみとなっています)

APIの申し込みはこちら(https://developer.spotify.com)からできますが、今回はAPIのテストをしてみましょう!

Console | Spotify for Developers

こちらでAPIの機能のテストができます。(適宜tokenを取得すれば適度に使えます)

Get Audio Features for a Track

上記の記事でも説明していたdanceability、energyなどはこちらを使って取得できます。

上で使った好きと言わせたいという楽曲ではこのようなデータになります。

{
  "danceability": 0.532,
  "energy": 0.938,
  "key": 8,
  "loudness": -1.409,
  "mode": 1,
  "speechiness": 0.0568,
  "acousticness": 0.122,
  "instrumentalness": 0,
  "liveness": 0.245,
  "valence": 0.716,
  "tempo": 132.023,
  "type": "audio_features",
  "id": "4cb65NgJOppTj6Ip5THclm",
  "uri": "spotify:track:4cb65NgJOppTj6Ip5THclm",
  "track_href": "https://api.spotify.com/v1/tracks/4cb65NgJOppTj6Ip5THclm",
  "analysis_url": "https://api.spotify.com/v1/audio-analysis/4cb65NgJOppTj6Ip5THclm",
  "duration_ms": 239333,
  "time_signature": 4
}

また、その楽曲からDjayのマッチ機能でリストアップされた楽曲情報を取得します。
(複数取得する場合はこちらからやりましょう Get Audio Features for Several Tracks Get Audio Features for Several Tracks

{
  "audio_features": [
    {
      "danceability": 0.697,
      "energy": 0.874,
      "key": 5,
      "loudness": -2.15,
      "mode": 0,
      "speechiness": 0.045,
      "acousticness": 0.0122,
      "instrumentalness": 0,
      "liveness": 0.627,
      "valence": 0.775,
      "tempo": 132.022,
      "type": "audio_features",
      "id": "2FXd6kKCtBIc6UfN1gH1pA",
      "uri": "spotify:track:2FXd6kKCtBIc6UfN1gH1pA",
      "track_href": "https://api.spotify.com/v1/tracks/2FXd6kKCtBIc6UfN1gH1pA",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/2FXd6kKCtBIc6UfN1gH1pA",
      "duration_ms": 213886,
      "time_signature": 4
    },
    {
      "danceability": 0.678,
      "energy": 0.909,
      "key": 6,
      "loudness": -2.361,
      "mode": 1,
      "speechiness": 0.0639,
      "acousticness": 0.108,
      "instrumentalness": 0,
      "liveness": 0.301,
      "valence": 0.774,
      "tempo": 130.998,
      "type": "audio_features",
      "id": "0uLhtkg7MSN0ZFZUwOfE0w",
      "uri": "spotify:track:0uLhtkg7MSN0ZFZUwOfE0w",
      "track_href": "https://api.spotify.com/v1/tracks/0uLhtkg7MSN0ZFZUwOfE0w",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/0uLhtkg7MSN0ZFZUwOfE0w",
      "duration_ms": 249878,
      "time_signature": 4
    },
    {
      "danceability": 0.555,
      "energy": 0.852,
      "key": 6,
      "loudness": -3.761,
      "mode": 1,
      "speechiness": 0.0439,
      "acousticness": 0.557,
      "instrumentalness": 0,
      "liveness": 0.314,
      "valence": 0.652,
      "tempo": 132.078,
      "type": "audio_features",
      "id": "0wRfhRWNX6WEJmxp5ed4Dy",
      "uri": "spotify:track:0wRfhRWNX6WEJmxp5ed4Dy",
      "track_href": "https://api.spotify.com/v1/tracks/0wRfhRWNX6WEJmxp5ed4Dy",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/0wRfhRWNX6WEJmxp5ed4Dy",
      "duration_ms": 270093,
      "time_signature": 4
    },
    {
      "danceability": 0.661,
      "energy": 0.898,
      "key": 7,
      "loudness": -2.482,
      "mode": 1,
      "speechiness": 0.108,
      "acousticness": 0.151,
      "instrumentalness": 0,
      "liveness": 0.118,
      "valence": 0.891,
      "tempo": 130.981,
      "type": "audio_features",
      "id": "4phwwHkDrqeUMPoOY4vI6I",
      "uri": "spotify:track:4phwwHkDrqeUMPoOY4vI6I",
      "track_href": "https://api.spotify.com/v1/tracks/4phwwHkDrqeUMPoOY4vI6I",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/4phwwHkDrqeUMPoOY4vI6I",
      "duration_ms": 194840,
      "time_signature": 4
    },
    {
      "danceability": 0.684,
      "energy": 0.893,
      "key": 6,
      "loudness": -3.266,
      "mode": 1,
      "speechiness": 0.0576,
      "acousticness": 0.113,
      "instrumentalness": 0,
      "liveness": 0.316,
      "valence": 0.81,
      "tempo": 130.963,
      "type": "audio_features",
      "id": "1ptM5l7tbT3QCbvYjtBEpV",
      "uri": "spotify:track:1ptM5l7tbT3QCbvYjtBEpV",
      "track_href": "https://api.spotify.com/v1/tracks/1ptM5l7tbT3QCbvYjtBEpV",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/1ptM5l7tbT3QCbvYjtBEpV",
      "duration_ms": 248696,
      "time_signature": 4
    },
    {
      "danceability": 0.702,
      "energy": 0.972,
      "key": 5,
      "loudness": -1.812,
      "mode": 0,
      "speechiness": 0.094,
      "acousticness": 0.686,
      "instrumentalness": 0,
      "liveness": 0.368,
      "valence": 0.739,
      "tempo": 133.034,
      "type": "audio_features",
      "id": "4gCKSBVrsOay3HYj5AvBq2",
      "uri": "spotify:track:4gCKSBVrsOay3HYj5AvBq2",
      "track_href": "https://api.spotify.com/v1/tracks/4gCKSBVrsOay3HYj5AvBq2",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/4gCKSBVrsOay3HYj5AvBq2",
      "duration_ms": 305853,
      "time_signature": 4
    },
    {
      "danceability": 0.692,
      "energy": 0.847,
      "key": 5,
      "loudness": -1.947,
      "mode": 0,
      "speechiness": 0.0534,
      "acousticness": 0.0238,
      "instrumentalness": 0,
      "liveness": 0.441,
      "valence": 0.712,
      "tempo": 132.053,
      "type": "audio_features",
      "id": "4pZA1GWGfG4JoZ0rbb8yG2",
      "uri": "spotify:track:4pZA1GWGfG4JoZ0rbb8yG2",
      "track_href": "https://api.spotify.com/v1/tracks/4pZA1GWGfG4JoZ0rbb8yG2",
      "analysis_url": "https://api.spotify.com/v1/audio-analysis/4pZA1GWGfG4JoZ0rbb8yG2",
      "duration_ms": 216147,
      "time_signature": 4
    }
  ]
}

という感じのデータがでてきました。


なんとなくの分析としますと…

現在上記の情報に相関関係があるのかどうかわかりません。
(楽曲キーや、BPMとかは近いんですよ。けどそれだけでは意味がない!)

いかがでしたか?

相関関係に関してはわかり次第随時追加していく予定です。ここまでご覧いただきありがとうございます。

次回予告:どうやって手持ちの楽曲をSpotifyAPIに投げるんだ……そしてそもそもの方向性はあっているのか……