第2回 活動報告書 プログラム・AI班

 プログラム班・AI班リーダーの小池です!

 早いもので新年度になってから1ヶ月が経ちましたね.DRのメンバーも心新たに開発に励んでいます.

 話は変わりますが,3度目の緊急事態宣言下,皆さんはどうお過ごしでしょうか.僕はあまり外に出ないのでもっぱら家でお酒を飲んでいます.しかし大学院に進学してからめっきり運動しない+お酒ばかり飲むので半年ぐらい前から段々とお腹周りが出てきました…。そこで太らないお酒の飲み方について調べたところ,ビタミンやミネラル,食物繊維,タンパク質を一緒に摂取すると良いらしいです.なので酒のつまみに枝豆や焼き鳥などを食べると良いみたいです.僕はこの方法で3kg増えました.皆さんおすすめです.

それではロボット制御班の活動報告です.

新メンバーの加入

4月よりプログラム班に新たに藤村くんが加入いたしました.リーダーの山崎と同じ高専を卒業し,在校時はロボット研究会に所属していました.趣味はプログラミングとバイクだそうです!
今後ともよろしくお願いいたします.

ロボット制御班の活動

ロボット制御班の活動報告は小池と藤村がお送りいたします.

前回の報告書では試作機の反省点を踏まえ以下の改善点を提案いたしました.

①関節のサーボモーターをPWMからコマンド方式のものに変更することで関節角度の細かな調整、現在角度の取得が可能になる
②ロボットのモデリングを行い、Move It!(ROSの機能)を利用することで逆運動問題を解く。これによりLynxの位置が変わっても正確にDJセットを操作できるようになると期待される
③AI開発のためPython3を利用したく,ROS1からROS2に移行する

今回は以上の3つの項目に対する活動を報告させていただきます.

関節のモーターについて

先ほど述べたように,制御の観点からサーボモーターはコマンド制御できるものが望ましいです.この要望をメカ設計に伝え,初号機にはコマンドサーボを使って設計してもらいました.これによりフィードバック制御の導入,ひいてはLynxの細かな制御が可能になると考えています.(ソフトウェア班の活動なのかな…?笑)
 コマンドサーボは次の2つのモータを使用します.
1. KRS-6003RHV ICS(KONDO):速度調整,現在の角度の取得が可能
2. RS405CB(Futaba):速度調整,現在の角度の取得が可能

Move It!の勉強

 当たり前ですが,DJがDJらしいこと(曲のミックス等)をするためにはDJセットの操作が不可欠です.LynxがDJになるためにも,DJセットの操作を確実に行えなければなりません.前回の報告書では試作機では定性的な制御であったために正確な操作ができなかった,その改善のために逆運動問題を解くと述べさせていただきました.

 前回の報告以降,ロボット制御班は逆運動問題を解決するためにMove It!の勉強を行ってきました.Move It!とはROSで利用することができ,逆運動問題やモーションプランニングを解くための非常に強力なツール群です.しかしチーム内で誰1人使ったことがなかったため,ロボット制御班は3〜4月をMove It!の勉強の時間に充てました.今〜6月中旬を目処にPC上でのシミュレーションができるようになることを目標に現在も開発を続けている最中です.

 また,メカ班の設計が大方固まってきたので新たにLynxのURDFを作成し直しました.関節配置とサイズが重要となるのでスケルトンのようになっています.左が以前作ったモデル,右が最近作ったモデルになります. 前回(上)と今回(下),皆さんはどっちが良いと思いますか??

ROS1 or ROS2 ?

前回の報告書ではAI開発のためにPython3を利用したくROS2への移行を検討している,と報告させていただきました.しかし,ソフトウェア班で話し合いをしたところ,コードの修正や勉強コストの高さからシステムの全てROS2である必要はなく,基本的な操作以外はAI部のみにROS2を用いた方が良いという結論になりました.ROS1とROS2は「ROS1 Bridge」を利用することで簡単に連携することができるため,ROS1だけではできなかったAI開発も行えるようになりました.

今後の予定

〜6月中旬 シミュレーション完成
〜6月下旬 Move It! を含めたシステムの再構築
〜7月下旬 演奏ができるかの確認

ロボット制御班は以上になります.(小池・藤村)

音源集め

ここからはAI開発役の浅倉がお送りします。
第1回の活動報告書でも述べた通り、選曲するにもMIXするにも音源が無ければ始まりません。幸いなことに、最近は著名なアーティストたちがSoundCloudなどに音源をたくさんアップロードしてくれていて、勝手に売ったり流したりしない限り自由に使えます。とりあえず、以前作成した曲名データベースに保存されている楽曲からダウンロード可能なものを片っ端から落とします。

壮観ですね。自動収集で現在6万5000曲ほど集まっていて、今現在も収集中です。容量削減のためにmp3形式で保存していますが、それでも500Gくらいの容量を圧迫しています。余談ですが、音源処理時の読み込み/書き込みにかかる時間を削減するために外部ストレージにはSSDを採用しています(1曲1秒の差でも7万曲で20時間!)。ざっと1TBで1万円ですね。皆様のご支援をお待ちしております。

選曲AIに向けたメタデータのベクトル化

現在20万サンプルのセットリスト、6.5万曲の音源が手元にあります。これをもとに選曲AIを組んでいくわけですが、問題がいくつかあります。

  1. 作者や年代といったメタデータは、音源そのものには含まれていない
  2. 音源の秒数が一定でない
  3. 音源の長さが平均して200秒ほどで、1曲あたりのサイズが大きすぎる

1についてもう少し詳細にお話しすると、実際のDJがセットリストを組むとき、必ずしもジャンルや曲調だけで選曲をしているとは限りません。例えばその日の客層に合わせて楽曲の年代を考えたり、アーティスト間の繋がりを考慮したりするはずです。人間はアーティストの名前や楽曲の年代をそのまま記憶して選曲に生かせますが、一般的にAIはベクトル化されていないデータを扱うことを苦手としています。そのため、得られたデータからメタデータをどうやってベクトル化(エンコード)しよう、という問題に突き当たります。

Word Embedding

このようなベクトル化に関する技術として、自然言語処理(人間の言葉の解析)の分野ではWord Embeddingという技術が普及しています。これは『同じ文脈で現れる単語は、同じような意味合いを持った単語である』という仮説(分布仮説)にもとづいた単語のベクトル化手法です。分布仮説について例を挙げてみると

  • I drink beer everyday.
  • I drink whisky everyday.

という似通った2つの文章に着目したとき、”drink”と”everyday”の間に挟まれた単語はお酒である、という共通点があります。この共通点を利用し、大量の文章データを用いて『2つの単語をもとに、その間の単語を推定する』もしくは『ある単語から、その前後の単語を推定する』というタスクをAIに解かせることで、単語という『文字の羅列』をAIが理解しやすい『単語の意味を表現したベクトル』という形に変換する、といった技術がWord Embeddingとよばれています。

楽曲データへの応用

Word Embeddingは自然言語処理の世界では既に必須の技術となっていて、あらゆる研究に利用されています。この素晴らしい技術をぜひLynxのAIにも利用したいです。Word Embeddingでは分布仮説に基づいて文章から単語をベクトル化しますが、この分布仮説はセットリストにもある程度当てはまるんじゃないか?というのが私の考えです。具体的には、セットリスト中のある曲に着目したとき、その前後の曲のジャンルや曲調が全く異なる、というケースはあまり無いと思います。逆に、同じ作者の曲や近い年代の曲を続けて流すというパターンは大いに考えられます。そのため、文章をセットリストに、単語を曲名に置き換えて、ある曲名からその前後の曲名を推定するタスクを解かせることで同じようなベクトル化ができそうです。

一言でWord Embeddingといっても様々なアルゴリズムが存在しますが、今回はデータ数や計算リソースを考慮してGloVeという手法を採用しました。ありがたいことにスタンフォード大学お手製のプログラムがGitHubに転がっているので、これを利用します。以前作成したデータベースからセットリストのデータを抜き出し、全体を通して最低5回以上使われた楽曲をベクトル化の対象として学習にかけます。ベクトルの次元はなんとなく256次元にしてみました。論文だと300次元くらいが良いとか…でもキリが悪いので256にしちゃいました。

できたメタデータベクトルを比較してみる

学習自体は3~4時間くらいで終わり、無事に各曲名をベクトル化できました。できたベクトルがどんなものか確認してみたいです。ベクトル化する利点の一つは、楽曲間での関係性を数値で判断できることです。すなわち、ある楽曲のメタデータベクトルと類似したベクトルを持つ楽曲を探し出すことが可能です。そこで、何曲か適当に選んで、似たベクトルを持つ曲をリストアップしてみました。普通こういう評価はちゃんとしたデータセットを使って行うものなんですが…そもそもセットリストに適用した事例が(おそらく)無いのでデータセットも無いのと、まぁ学術研究じゃないしそこまで厳密にやらんでも…という甘えから3曲くらいでテストしてみます。

  • 1曲目:Daft Punk – Get Lucky と類似したメタデータを持つ曲
順位アーティスト曲名スコア
1Daft PunkHarder Better Faster Stronger (Alive 2007)0.568
2Rush WestDear Friends0.428
3Bob SinclarCinderella (She Said Her Name) (Joe K Remix)0.403

最も似た(メタデータをもつ)曲は、同じDaft Punkの曲みたいです。作者の情報をちゃんと保持できていそうですね。スコアはただのベクトル間類似度なのであまり重要ではないのですが、1位と2位のスコアが大きく開いていることは注目すべきかもしれません。

  • 2曲目:Avicii – Waiting For Love と類似したメタデータを持つ曲
順位アーティスト曲名スコア
1Chicago (US Band)Street Player (Avicii Bootleg)0.580
2AviciiLevels (Vitzi Old School Intro Bootleg)0.433
3Katy PerryNever Really Over (R3HAB Remix)0.363

この例ではAviciiの曲をサンプルに試してみましたが、最も似ているのは異なるアーティストの曲という結果になりました。しかし、よく見てみるとAviciiがアレンジした曲であることがわかります。このことから、RemixやBootlegのメタデータベクトルは元の作者よりもアレンジした人の影響を強く受けるのではないか?という仮説が成り立ちます。

  • 3曲目:Avicii – Waiting For Love (Marshmello Remix) と類似したメタデータを持つ曲
順位アーティスト曲名スコア
1MarshmelloWant U 20.571
2CazzetteSleepless (Jenaux & Prince Fox Remix)0.553
3Marshmello & SlushiiTwinbow0.506

2曲目の結果をうけて、Remix曲について試してみた結果です。無論この結果だけで決めつけるのは早計ですが、確かにもとの作者よりもRemixした人の影響が出ているようにみえます。

本当は全ての曲の作者やRemixした人を抜き出して似ている曲を計算して…という比較手法を検討すべきだと思いますが、まぁそれはいずれ…今はとりあえず先に進みたいと思います。

可視化してみる

せっかく作ったので、どんなベクトルができたのかこの目で見てみたい気もします。とは言え、256次元のデータ群はそのまま可視化できないので、UMAPという次元削減手法を用いて3次元に投影して可視化します(UMAPの説明については割愛しますが、超すごいPCAだと思ってくれて大丈夫です)。得られたメタデータベクトルから、(ややこしくなりそうなので)Remix、Mashup、Bootlegの曲を取り除き、出現数TOP10に入る作者の曲のみを抜き出して可視化しました。

各ドットが各ベクトルを表す。異なる色は異なる作者の曲。
各ドットをアーティスト名で表した図。

画面上では小さいので、ぜひクリックして拡大した画像をご覧ください。少しばらついてはいますが、同じ作者の曲のベクトルは同じような領域に固まっていることがわかります。ちなみにTiëstoのëが文字化けしています。これをみる限り、少なくとも作者の情報はベクトル化できていそうです。アーティスト間の距離についても考察できたら面白いかもしれないです。

今後やること

とりあえず、メタデータのベクトル化は一段落ついたと思われます。これが選曲AIにどれだけ活きてくるかは私にも分かりませんが、きっと役立ってくれると信じています。

次にすべきは音源の前処理です。前述の通り、手に入れた音源の長さはまちまちで、30秒だったり5分だったりします。また、一般的に音声や楽曲の分析にはスペクトログラムを用いますが、曲数が膨大で一曲当たりの長さがそこそこあり、さらに残念なことに私たちはスパコンを持っているわけではないので、このスペクトログラムをそのまま利用するわけにもいきません。もっと軽量な音響特徴量を利用するというのも手ですが、得られる特徴量とのトレードオフです。

そこでこれらの問題を解決するために、現在AutoEncoderという技術を応用したスペクトログラムのエンコードを検討中です。これが成功すれば、メタデータとあわせて1曲を1つのベクトル(≠行列)で表せるようになり、数万曲からの選曲AIがかなり現実的なものとなってくるはずです。上手くいくことを祈っています。

コメントを残す