これは「IBM Cloud Advent Calendar 2018」の24日目の記事です。
Get Wild、好きですか?
アスファルト、タイヤを切りつけながら、暗闇走り抜けてますか?
TM NETWORK の アルバムに「GET WILD 30th Anniversary Collection(GET WILD SONG MAFIA)」があります。
収録曲が 36 曲あるのですが、そのすべてが Get Wild のバージョン違いというアルバムです。
2017年4月5日に、「トップ100にチャートインしたCDアルバムに収録された同じ曲のバージョン/リミックスの最多数」で、ギネスに認定( https://www.oricon.co.jp/news/2107304/full/ )されました。
な...何を言っているのか、わからねーと思うので...。
とりあえず、Get Wild のバージョン違い、聴いてみましょう。
TM NETWORK - Get Wild (“FINAL MISSION -START investigation-” Version)
https://youtu.be/LgBxze0ye94
イントロの小室哲哉の激しいパフォーマンスからも、いわゆる Get Wild のオリジナルバージョンとは、また異なったものであることがわかると思います。
音楽ストリーミングサービス Spotify では、「avex Edition」として、また異なるバージョン入り(!)の 22曲 版が配信されています。
GET WILD 30th Anniversary Collection(avex Edition)
https://open.spotify.com/album/6SHOYTaWp1ChOO4UhJquhA
収録曲は以下の通り。
- M1:Get Wild (“Incubation Period” Version)
- M2:Get Wild (“FINAL MISSION -START investigation-” Version)
- M3:GET WILD (2013 SUMMER)
- M4:Get Wild 2014
- M5:Get Wild 2014 (“the beginning of the end” Version)
- M6:Get Wild 2014 (“30th 1984~ QUIT30” Version)
- M7:Get Wild 2014 (“QUIT30 HUGE DATA” Version)
- M8:Get Wild 2015 -HUGE DATA-
- M9:Get Wild 2015 (“30th FINAL” Version)
- M10:Get Wild / Dave Rodgers
- M11:Get Wild (GET WILD MEETS TECHNO STYLE Version) / Dave Rodgers
- M12:Get Wild / 桃井はるこ
- M13:Get Wild / globe
- M14:Get Wild / Purple Days
- M15:GET WILD '89 / TETSUYA KOMURO
- M16:Get Wild(Metal Machine mix)/ globe
- M17:Get Wild (2016 Remode2) / globe
- M18:GET WILD 2017 TK REMIX
- M19:GET WILD (Takkyu Ishino Latino Acid Remix)
- M20:GET WILD (SICK INDIVIDUALS Remix)
- M21:GET WILD (Dave Rodgers Remix)
- M22:GET WILD (Takkyu Ishino Latino Remix)
あなたは、どの Get Wild が好きですか?
選べない。
これだけ Get Wild していると、まさに、ひとりでは解けない愛のパズルを抱いている状態。
駅の伝言板にXYZと書き込みたい気分です。
そんなとき、ふと声が聞こえたのです。
「俺を呼んだのは・・・君だろう」
そうだ、Watson がいるじゃないか。僕はひとりじゃない。
Watson に、俺に最適な Get Wild を選んでもらおう!
* * *
マッチングに使う Watson の API といえば、Personality Insights。
一定量のテキストから、その人の性格を分析して、ビッグファイブと呼ばれる、基本的な心理特性を判断してくれるというもの。ビッグファイブとは、人間の基本的な性格を構成する5つの要素で、知的好奇心、外向性、協調性、誠実性、感情起伏を指します。
Personality Insights
https://www.ibm.com/watson/services/personality-insights/
ところで、意外と知られていないようですが、Spotify の API からも、じつに多彩な情報を得ることができまます。
とくに興味深いのは「Get Audio Features for a Track」という、曲の特徴を取得できる API。
Spotify APIs
https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/
具体的には、曲について、次の情報を取得できます。
例:
- アコースティック性:トラックがアコースティックかどうかを示す0.0〜1.0の信頼度。1.0は、トラックがアコースティックであるという高い信頼性を表す。
- ダンス性:テンポ、リズムの安定性、ビートの強さ、全体的な規則性などの音楽要素の組み合わせに基づいて、ダンスのためのトラックの適性を記述します。0.0の値は、最もダンス的でなく、1.0は、最もダンス的である。
- トラックの持続時間(ミリ秒)
- エネルギー性:エネルギーは、0.0〜1.0の尺度であり、強度および活動の知覚的尺度を表す。典型的には、エネルギッシュなトラックは、速く、大きく、騒々しい感じがする。例えば、デスメタルは高いエネルギーを持っているが、バッハのプレリュードは、このスケールでは低い得点になる。この属性に影響する知覚的特徴は、ダイナミックレンジ、知覚できる音量の大きさ、音色、開始レート、および一般的なエントロピーを含む。
- インストゥメンタル性:トラックにボーカルがないかどうかを予測します。この文脈では、「オー」や「アー」の声は楽器として扱われます。 ラップや話し言葉は明らかに「ボーカル」です。インストゥメンタル性の値が1.0に近いほど、トラックにはボーカルが含まれていない可能性が高くなります。0.5を超える値は、インストゥメンタル曲を表すことを意図していますが、値が1.0に近づくほど信頼度が高くなります。
- ライブ性:録音中の聴衆の存在を検出します。ライブ性の値が高いほど、トラックがライブで実行された可能性が高くなります。値が0.8を超えると、トラックがライブである可能性が高くなります。
- ラウドネス:トラックの全体的なラウドネスをデシベル(dB)で表したものです。 ラウドネス値はトラック全体で平均化され、トラックの相対的なラウドネスを比較するのに役立ちます。ラウドネスは、物理的強度(振幅)の主要な心理的相関関係であるサウンドの品質です。値の典型的な範囲は-60〜0dbです。
- モード:モードは、曲の雰囲気(メジャーまたはマイナー)、その楽曲から導かれるスケールのタイプを示します。メジャーは1、マイナーは0です。
- スピーチ性:スピーチ性は、トラック内の話された単語の存在を検出します。録音(例えば、トークショー、オーディオブック、詩)のような、より独占的な音声ほど、属性値に1.0に近くなります。0.66を超える値は、おそらくは完全に発声された単語で構成されているトラックを表します。0.33と0.66の間の値は、ラップ音楽などの場合を含む、セクションまたはレイヤーのいずれかで、音楽とスピーチの両方を含む可能性があるトラックを表します。 0.33未満の値は、音楽やその他の非音声のようなトラックを表す可能性が最も高いです。
- テンポ:ビート/分(BPM)でのトラックの全体的な推定テンポ。
- 感情価:トラックによって伝えられる音楽的なポジションを表す0.0から1.0の値を測定します。 高い感情価のトラックはより陽性(例えば、幸せ、陽気、陶酔)であり、低い感情価のトラックはより陰性となる(例えば、悲しい、落ち込んだ、怒る)。
これだけの情報が取れるのであれば、何かできそうな感じがします。
Personality Insights で分析するテキストは、いちばん手っ取り早いのは、Twitter の投稿です。
Twitter の投稿から、Personality Insights で性格を分析して、Spotify で取得した曲の情報と照らして、いちばんオススメの Get Wild を教えてくれる。
というのはどうだろう。
* * *
Personality Insights の値は 0(その心理特性の傾向が弱い)〜 1(その心理特性の傾向が強い)の範囲で、返ってきます。
Spotify の API も、基本的には 0(その特徴にあてはまらない)から 1(その特徴にあてはまる)の範囲の数字で返ってきます。
そのまま突合できそうな感じがしますが、ここでちょっと悩みが生じました。
そもそも、それぞれの Get Wild で、Spotify から得られる情報にどれくらい差があるだろう。
同じ Get Wild なわけで、ぜんぶ同じかもしれない。
差がなければ、マッチングもできない。
ということで、Spotify の API リファレンスを参考に、Spotify のアルバムIDを入れると、アルバムに入っている楽曲の情報を、全曲取ってきて、JSON と csv に落としてくれる Python を書きました。
Spotify の Python 用 SDK には Spotipy というライブラリがあるので、それを使っています。
GitHubにあげました。
SpotifyToJSON:
https://github.com/storywriter/SpotifyToJSON
また、Spotify の API を使ったアプリケーションをつくるためには、Spotify 開発者向けサイトで、アプリ登録が必要です。アプリ登録をしたら、Client ID と Client Secret をメモして、先の Python のバッチに書き込みます。
Spotify 開発者向けサイト
https://developer.spotify.com/dashboard/
Spotify のアルバムIDの取得方法は、API で取得することもできるのですが、カンタンなのは Spotify のスマホアプリで曲を選んで「シェアする」→「リンクをコピー」すると、アルバムID入りのURLが取得できます。
たとえば、「GET WILD 30th Anniversary Collection(avex Edition)」であれば、 https://open.spotify.com/album/6SHOYTaWp1ChOO4UhJquhA?si=FfBdBz7PS6eFTFCcRwyVWQ というURLがコピーされます。この 6SHOYTaWp1ChOO4UhJquhA 部分がアルバムIDです。
Spotify の API は認証まわりが Watson に比べると厳密で、SDK の使いかたを理解するのに手間取りました。
コマンドラインからのバッチ実行でも、途中で、ブラウザによるログインを経由します。
具体的には、Spotify 開発者向けサイトで、アプリ登録をするさいに、Redirect URIs という項目を入力します。認証後にリダイレクト表示するページのURLを記入します。かつてはどんなURLでもよかったらしいのですが、今は、実在するページでないとエラーになるようでした。また localhost もダメなようで、Spotify 側からアクセスできるページである必要があるようすです。なんでもよいので、インターネット上にダミーページを1枚用意します。
バッチを実行すると、認証で「Enter the URL you were redirected to:」というメッセージが出て、ブラウザが開きます。ブラウザのURLを、そのままコピーして、コンソールに貼り付けてエンターキーで進みます。注意としては、 http://example.com/?code=... の「 http://example.com/?code= 」部分も含めてコピーすること(code=以降だけではなく)です。
さて、こうして取得した、22曲分のデータを一覧にしてみました。
もうひと工夫が必要です。先にもお話したとおり、Spotify の情報は、基本的には 0(その特徴にあてはまらない)から 1(その特徴にあてはまる)の範囲の数字で返ってきます。
ただし、「テンポ」や「曲の収録時間」「ラウドネス」という項目は、絶対値で返ってきます。
スケールが異なるとわかりづらいのと、将来に Personality Insights と突合させることを考えると、すべての項目が 0 から 1 の範囲にある必要があります。
これらの項目については、アルバム内で数字を比較して、0 から 1 の範囲になるように変換する。これを「正規化」といいます。
正規化は、次の式で求められます。
x′ = ( x − min( x ) ) / ( max( x ) − min( x ) )
「テンポ」「曲の収録時間」「ラウドネス」という項目について、正規化をしました。
ここで、ふと気になりました。正規化すると、強制的に、最大値をもつ曲が 1 になり、最小値をもつ1曲が 0 になります。アルバム内の曲の分布が偏っていると、その偏りを正しく表現しない懸念があるなと思いました。そこで、絶対値の項目については、手で上限値と下限値を入力してみました。
手で上限下限を入力したところ、今度は、曲ごとの差がなくなりすぎて、後に大半のマッチングが、「電気グルーヴ 石野卓球 リミックスバージョン」に吸い込まれるようになってしまいました。上限下限を指定せず、正規化するだけにしました。
こうして、正規化したデータでレーダーチャートにして見てみました。
けっこうデコボコしています。曲ごとにパラメータに差があるということを示しています。これならマッチングできそうです。同じ Get Wild なのに、けっこう差があって驚いた。
それでは、Personality Insights と Spotify をつないでみましょう。
ここで、はたと気がつきました。
Personality Insights で、どの性格特性が高ければどの曲が好み、というのは、どうやって判断すればよいのでしょう。
念のため、過去の論文も漁ってみたが、ビッグファイブと音楽の嗜好の関連性などという論文は見つからなかった。
というか、ビッグファイブではざっくりしすぎていて、音楽の嗜好との相関性など、どうも、ないのではないか。そうだよね。ふつうに考えて、例えば、外向性が高いからクラシックが好き、とか、そんな単純な関係じゃないよね・・・。
とすると、ここはもう決めの問題なので、感覚で決めていきました。
また、Personality Insights は、音楽の嗜好性についても、じつはパラメータを持っています。
- 'consumption_preferences_music_rap'(ラップを聞く)
- 'consumption_preferences_music_country'(カントリーを聞く)
- 'consumption_preferences_music_r_b'(リズムアンドブルースを聞く)
- 'consumption_preferences_music_hip_hop'(ヒップホップを聞く)
- 'consumption_preferences_music_live_event'(ライブイベントに行く)
- 'consumption_preferences_music_playing'(音楽を聞く)
- 'consumption_preferences_music_latin'(ラテン音楽を聞く)
- 'consumption_preferences_music_rock'(ロックを聞く)
- 'consumption_preferences_music_classical'(クラシックを聞く)
ただ、これらはあまり細かい数字を返してはくれず、0、0.5、1の3段階だったりするので、あくまで補正値として用いることにした。
もうひとつ、今回は Twitter に連携するので、Twitter アプリの登録も必要です。Twitter Developer Platform で登録する。
Twitter Developer Platform
https://developer.twitter.com/
これで、ようやく、あとはプログラムを書くだけとなりました。
* * *
性格判定プログラムは、Personality Insights のサンプルコードが公開されています。
サンプルは Node.js のアプリケーションです。
Personality Insights のサンプルコード
https://personality-insights-demo.ng.bluemix.net/
このサンプルコードをフォークして、つくろうと思いました。
カンタンかと思ったら、依存ライブラリが多くて、ひとりでは解けない愛のパズルかと思った、本気で。
サンプルは思いのほか多機能なので、いろいろ入り組んでいるのです。
(あと、今はもう使っていないコードとか残ってる)
とくに、フロントエンドが jQuery ベースなのですが、DOM と JavaScript が密結合すぎて、チープなスリルに身をまかせている感じだった。
せめて名前空間は分けておいてほしかった。
相性判定の処理はフロントエンドでされているので、がりがり読み解いて、がりがり実装します。
つくったものはGitHubにあげています。
https://github.com/storywriter/personality-insights-nodejs
* * *
ついにできた・・・!
俺に最強の Get Wild を Watson が選んでくれる
https://getwild.mybluemix.net/
* * *
さっそく試してみます。
俺に最強の Get Wild は・・・。
#3 GET WILD - 2013 SUMMER / TM NETWORK
https://open.spotify.com/track/2KS8ATNMmHVSMK1MMJGQqb
と判定されました。
聴いてみていただくとわかりますが、AメロBメロがなくて、いきなりサビという超展開バージョン。
俺は結論を急ぐタイプということでしょうか・・・。
他の人でやるとどうなるのでしょう。
せっかくなので、妻にも試してもらいました。
#18 GET WILD - 2017 TK REMIX / Tetsuya Komuro
https://open.spotify.com/track/1JYBcw4VOc4wvPTiBllvXY
神秘的なリミックスです。
妻には何か隠された秘密が・・・!?
あと、イントロがとても長くて、曲がぜんぜん始まりません。焦らすタイプなのでしょうか。
* * *
まとめです。
[1] Personality Insights の真価は、ほかのサービスやシステムとつなぐことで発揮される。Personality Insights 単体で性格診断をしていても、面白いですが、そこから先の展開というのがなかなかありません。他のシステムと連携させてマッチングさせることで、性格診断の本当の価値が出てきます。
[2] 性格特性と曲の好みは、理論で結ぶのは無理でした。今回の「俺に最強の Get Wild を Watson が選んでくれる」は、言ってしまえば「Get Wild 占い」という域を出ていません。それは、心理特性と音楽の嗜好を結びつける理論がないからです。これではビジネスでは使えません。ビジネス利用においては、Personality Insights のマッチングは、理論背景が命です。
[3] みんな大好き Get Wild。
* * *
お楽しみいただけましたでしょうか。これで傷ついた夢を取り戻せそうです。
最後にもう一度、URLを載せておきます。お試しいただき、結果をTwitterでシェアいただけると嬉しいです。
俺に最強の Get Wild を Watson が選んでくれる
https://getwild.mybluemix.net/
(SE:ここで Get Wild のイントロが入る)
2019年には、シティーハンターの映画も公開になるということで、楽しみですね。
エンディングテーマは、もちろん Get Wild だそうです。
メリークリスマス!
* * *
羽山 祥樹のtwitterアカウントは @storywriter です。ぜひフォローお願いします。