LOOPS_P3460714

in Events, Music, Projects

AI DJ 技術解説 – 9/4「2045」at OKAZAKI LOOPS #2

ありがとうございました!

人工知能時代のDJ, VJ表現を考えるイベント 「2045 」を、OKAZAKI LOOPSのプログラムの一つとして、京都国立近代美術館で先の9月4日に行いました。 200名を超える方にご参加いただきました。お越しいただいた皆さま、ありがとうございました! 前回のブログの記事で告知した技術解説を(事後になってしまいましたが)書きます。

photo (c) OKAZAKI LOOPS 実行委員会

LOOPS_P3290348 LOOPS_P3320568 LOOPS_P3270205

DJは何をしているか…

まず前提からスタートしましょう.

DJのタスクには大きく分けて3つがあると思います。

  1. お客さんの雰囲気を読む – 盛り上がっている、踊り続けてちょっと疲れている etc
  2. 雰囲気に合わせた曲を(自分なりの個性を交えて)選択する (選曲)
  3. 選んだ曲を流れを途切れさせずに自然に/大胆に曲を繋いでいく (ミックス)

この辺のことは漫画のとんかつDJアゲ太郎(個人的に大好きです)とか読むと、大袈裟なくらいよく書かれてます。 (DJといってもスクラッチなどの技を競うバトルDJから、ラウンジDJなどいろいろなスタイルがあるので、ここに書いているのは大雑把な議論なのはご承知ください)

 

「2045」ではこれまでのイベントで1から3のそれぞれにアプローチしてきました。iBeaconやKinect、アルコールセンサーなどをつかってお客さんの状態を読む(1). 過去のDJのプレイリスト・ログの巨大なグラフ構造の解析による選曲(2)などです。

Qosmoチームとして、今回のOKAZAKI LOOPSでは、主に2と3にアップデートを加えました。 まず大きく違うのはいままで音楽データとDJソフトウェアを使ってやっていたミックスを、実際のレコードとターンテーブルを使ったやり方に変更した点です(3)。

 

ソフトウァアを使うとすぐにできることをあえて、外部化させた理由は、人とAIの「かけあい」、共同作業という理念をより明確にするためです(前回書いた通り)。また(2)の選曲に関しても、楽曲がどう使われきてかというログのデータではなく、曲自体のオーディオのデータの解析を選曲に使うように変更しました。 手持ちのレコードの中から、聞いた時の印象的に似通った曲を選択するというのが、 現時点での選曲方法です。

 ConvNetをつかった選曲

まずは(2)の選曲の方から説明します.

どうやって曲の印象を抽出するか? 同じような音響的な物理量(ボリューム、テンポ etc)を持つ曲でも聞いた時の印象が大きく異なるのはいうまでもありません。そこには曲の構成や楽器の編成などさまざまな要素が関与しています。人はそうした複雑な要素を聞き分けて、好き、嫌いあるいは似ている、似ていないといった判断を瞬時にしているわけです。言い換えれば、人間は音の物理的な特性を「印象量」にマッピングする仕組みを持っているわけです。それを擬似的に再現するために流行りのDeep Learningの仕組みを利用しています。ニューラルネットワークの「学習」には正解のデータ(教師データ)が必要になるわけですが、今回は「ジャンル分け」をタスクとして、教師データを用意しました。人はある曲を聞いた時に、あ、これはジャズだ、クラシックだ、ロックだという具合に音からジャンルを(なんとなく)推定することができます。同様にニューラルネットワークが音を「聞いた」ときに、きちんとジャンル分けができるようになれば、そのネットワークはなにかしらの印象量を物理的な音のデータから抽出できるようになったと言えるのではないか… ということです(もちろん、ジャンル分けというのは相対的なものですし、絶対的なジャンルわけというのは存在しませんが、音の印象についてある程度みなが合意できる正解があるという意味でジャンル分けというタスクを選びました)。

 

スクリーンショット 2016-09-07 17.39.46 image source: AUTOMATIC TAGGING USING DEEP CONVOLUTIONAL NEURAL NETWORKS by Keunwoo Choi

仕組み的には楽曲のスペクトログラム(周波数特性-時間のグラフ)を画像として、画像の分類器を学習したと考えていただければ概ね間違いないです。RGBの3つの平面がある画像とはちがい、2次元の平面が一つである点、また聴覚特性にあわせるために周波数軸方向の扱いには留意が必要なこと(Constant-Qなども試しましたがmel周波数が一番精度が上がりました)などが違います。また畳み込み層の構造も先行研究によっては、時間軸方向のみの1次元の畳み込みとするものから、時間軸周波数両方に畳み込むものまでいろいろな手法があり、それぞれ試してみました(結果的にそこでは有意な差は生まれませんでした)。

Nao Tokuiさん(@naotokui)が投稿した写真

ネットワークの詳細には立ち入りませんが、10個のジャンルを識別するニューラルネットワークを構築、Validationデータでの正答率は5割弱. まだまだ低いのですが、ランダムに選択するなら、約2割のはずですから、正答率が2倍強になったことになります。(GPUベースのCaffeで3日ほど学習した結果. 論文の正答率よりもだいぶ低いですが、向こうはジャズとクラシックなどの識別してるのに対して、こちらはトランスとミニマルテクノ、のように割と近いジャンルの識別をしているので正答率がそこまで出なかったのも仕方ないのかな) こうして学習した分類器の一番上の層(どのジャンルかを決める10個の出力)をとっぱらって、2番目の層の出力(ここでは1024次元のベクトル)を、楽曲の特徴を表すベクトルとして、類似度を計算します。あとは次元削減してt-SNEで3次元にマッピングするといったことをやってます。

Slack for iOS Upload

参考文献:

DQNによるテンポあわせ

もう一つのレコードを使ったミックスの方はというと…  これも詳しい説明が必要ですね。

DJ(主にハウスやテクノのような四つ打ちのDJ)が避けて通れないのが、曲のテンポとリズムを合わせてスムーズに曲を繋いでいくという技術の習得です。レコードを使ってテンポを合わせるためには、DJはレコードの再生速度を操作します。再生速度を変えると、当然再生される音の高さ(ピッチ)もかわるので、この操作のことをDJは「ピッチ合わせ」とも呼びます。二つの曲のリズムやテンポがきっちりあうと、あたかももともと一つの曲であったかのような、あるいはもともとの曲にはなかった新しいグルーヴが生まれる、それがこういう四つ打ちのDJの醍醐味だったりします。一方でテンポがずれていると悲惨なことになります。 僕も大学生の頃に狭い寮の部屋で独りひたすら練習してました。リズムがずれたドドっドドっドドっ…という音をまわりに撒き散らしていた気がします (すいませんでした!)

ターンテーブルは物理的に回転しているものですから、再生速度をスライダーで変えたからといって、即座に速度がその速度になるわけではありません(慣性があります)。徐々に変化していくわけですが、その変化の速度も機種によって違ったりします(トルクの違い)。DJは、そうした違いを体で覚えつつ、すこしずつ再生速度をかえてテンポを合わせていきます。またテンポがあうだけではだめでキックが入るタイミングを合わせるために(位相)、レコードのふちをこすってすこし遅らせたり、逆にちょっと先に送ったりといったこともしてます。これらの処理を人間と同じ条件でコンピュータにやらせたい! と思ったのがそもそもスタートです。

Nao Tokuiさん(@naotokui)が投稿した写真

トップダウンにルールを決めるのではなく、AIが試行錯誤を繰り返していく中で、徐々にミックスを覚えていくといったかたちが理想的です。そこで…  Atariのゲームを学習させたことで一躍有名になったGoogleの研究チームが提案するDQN(Deep Q-Network)の仕組みを利用しました。Q学習(Q-Learning)という強化学習の一種にDeepな(今のスタンダードからすると浅いですが)ニューラルネットワークをつかったというものです。 詳細は省略しますが、AIはまず「環境」を観測した上で、取りうる行動のうちから「なんらかの決まり」に則って次の「行動」を決めます。その行動をとることによって、AIは「報酬」を得ます。どういう環境の状態で、どう振る舞うとどれくらいの報酬が返ってくるのかを学習し、それに基づいて返ってくる報酬が最大になるように次の行動を決めていきます。

これが強化学習の大まかな枠組みです。この行動を決める「なんらかの決まり」にDeep Learningを利用するというのが、DQNになります。 今回やりたいことでいうと、もともとかかっている曲のビートと新しくかけようとしている曲のビート(とそのずれ)が環境、テンポを上下する(up/down)、レコードのふちを触って遅くする(pull)、すこし指で送る(nudgeとそれぞれ呼ぶことにします)が行動。行動の結果、テンポとリズムがどのくらいあっているかが報酬になります。 このDQNの学習を実際のレコードとターンテーブルを使ってやりました。肝心のターンテーブルの操作の自動化にはMIDIに対応したVestaxのPDX-3000というターンテーブルを使っています。PDX-3000はMIDIを送ることでテンポを変えることができるという優れもののターンテーブルです。 どのように環境を観測するか = ビートをニューラルネットワークに入力できる形に数値化するか、どう報酬を与えるか = テンポとリズムが合っている・合っていない度合いをどう定量的に評価するか、ほんとにいろんな試行錯誤がありました。書き出すと終わらないので、ここでは軽く触れるだけにしますが、一例を挙げると、単純にマッチしているビートの数だけでマッチングを取ると学習のカーブが急になりすぎます(合っているか合っていないかの0, 1的になりがち)。またテンポは完全にあっているけど、位相がずれているという場合にはマッチするビートがないので評価としては0点になるのに対して、テンポがまったくあっていないのにもかかわらずたまたまマッチするビートがあったりするとテンポがあっているものよりも高い評価になってしまいます.  その辺、エントロピーと情報ゲインの考え方を利用して、規則的にずれているものをランダムにずれているものよりも高い評価を与えるようにしました

Nao Tokuiさん(@naotokui)が投稿した動画


こうして作った仕組みでターンテーブルでひたすら学習させました。レコードは再生が終わったら針を戻さないといけないというのが当初ネックだったのですが(PDX-3000に備わっているリバース再生ボタンを機械的に押す機構を中西宣人さんに作って頂いたりもしました🙏) キックだけが延々ループするレコードをたまたま見つけて(ロックドグルーブ)からは学習が進みました。夜の間ひらすらキックを合わせる作業をターンテーブルにやらせて…朝来て進捗を確認するという毎日. だんだん溝が白く粉を吹いていくのを見て、レコードが針によって削れることを再認識しました(笑)

その結果、シンプルな4つ打ちのレコードであれば、それなりの確率でテンポを合わせられるところまできました. ただいくら学習を繰り返してもある程度のところで学習が止まってしまい、「確実に」「即座に」テンポを合わせられる… というところまでは到達できませんでした。

Screen Shot 2016-08-19 at 11.49.53 AMエラー率が徐々に下がっていく様子

Nao Tokuiさん(@naotokui)が投稿した動画

 

参考文献:

DQN

テンポ合わせの評価

LOOPS_P3460714

こうして迎えた本番.  ここまできたところで時間が切れ… 今回の問題点、そして次回に向けて見えてきた課題をまた改めて書きます!! to be continued.

謝辞

  • 選曲用のConvNetの学習には、ダンスミュージック配信サイト、wasabeatさんのジャンルタグがついた楽曲サンプルデータを利用させていただきました。  大量のサンプルデータを使わせていただいたwasabeatさん、ありがとうございます!  http://developers.wasabeat.com
    またConvNetの実装はQosmoで3月までインターンをしていた福井くんが基本的なシステムを作ってます。 新天地でもがんばってください
  • Qosmoインターンの梶原くん – レコードの音源を録音、楽曲情報を保存する仕組みと本番でも利用した二台のターンテーブルをカメラで写したAR的な表現.
  • 中西宣人さん – MIDIで操作できないPDX-3000のリバースボタンを機械的に押す機構.  無茶なお願いをしてすいませんでした.
  • 最後に、Qosmoに新しく加わった堂園さん – クラスタリングのビジュアライズ.

実装にあたっては以上の方々にお世話になりました!ありがとうございました。