2021 . 6 . 25
プログラム班の小池です!
第3回のプログラム班の活動報告書です!
皆さんハローキティにはなぜ口が描かれていないか知っていますか?
キティちゃんの担当デザイナーによると「嬉しい,悲しい,怒っているという自分の気持ちをキティちゃんに投影し同じ気持ちだということを語りかけ,お客さんに寄り添うため.口を描いてしまうと語りかけてくれなくなる.」からだそうです.
これってすごくないですか?自分の感性のみではなく見る人の気持ちになってキャラクターデザインをするという点はもちろんですが,口を無くすという発想に驚きました.僕の考えではキャラクターが語りかけてくるためには表情が必要で,表情を最も良く表すのが口ではないかと思います.「いろんな気持ちに寄り添うには口どうしようか…じゃあ口ごと無くすか!」という発想は僕には到底出てこないと思います.デザイナーさんの思いやりと発想が,世界で愛されるキャラクターを作り上げているのではないかと勝手に考え勝手に感動しました.
Lynxでも会場の人々の気持ちや行動を投影できると面白そうですよね.浅倉くんと田中くん,期待して待っていますね.
長くなりましたが,プログラム班の活動報告です!
新メンバー加入!(とメンバー紹介)
6月からプログラム班に新メンバー田中君が加わりました.
はじめまして、たなかです!!産業技術高専ロボット工学コース5年の現役本科生です。音楽を聴くことが趣味になっています。まだまだ知識も浅く未熟ですが、これから必死に頑張ります👍👍
その他のプログラム班のメンバーは以下の3人です.
小池郁哉(ロボット制御)
研究:マイクロ流体デバイス
趣味:飲酒,サイクリング
浅倉 拓也(AI)
研究:Neural Architecture Search
趣味:飲酒
藤村健介(ロボット制御)
研究:気象予報
趣味:飲酒
プログラム班はロボット制御班とAI班に分かれています。
まずはロボット制御班の活動報告をさせていただきます。
ロボット制御班はボタン操作の正確さを増すためにMoveitによる逆運動解析の勉強・実装を行なってきました.
というのも,試作機では次の動画のようなミスが多く見られたためです.
これは「このツマミを操作するときは関節1を○度,関節2を△度にして…」という風に人間の手で調整しているためです.これではDJセットの位置が変わるたびに人間が調整しなければならず,現実的ではありません.
そこでボタン・ツマミの座標さえ分かれば関節角度が自動で決まるようにしたいわけです(逆運動問題).
逆運動問題は人間の手で実装しようと思うと非常に大変ですが,幸いなことにROSにはMoveItという非常に強力なツールが存在します.MoveItを用いることで逆運動解析はもちろんのこと,モーションプランニングも簡単に行うことができます.
まず,MoveItを使うためにロボットのモデリングをする必要があります.
前回までもロボットのモデリングを行なってきましたが,今回はより正確なモデルの構築を目指しました.
機械班から腕全体の寸法をもらい,それを元にロボットモデルを作成しました.




最初に比べてかなりまともになったと思うのですが,皆さんはどう思いますか…?
完成したモデルでMoveItを動かしてみました.
うーん…これではまだなんとも分かりませんね…
ロボットの筐体が完成次第テストをし,改良していこうと思います.
シミュレーションの目処が立ってきたため,全体のシステムの構築も開始しました.既に大枠は完成しており,概略図は次の画像のようになっています(右は旧システム).


試作機のシステムとの大きな違いは細かい機能ごとにノードを分けた点です.試作機のシステムでは「PlayController」というノードに全ての機能を詰め込んでいました.しかしこれではメンテナンス性も悪く,仕様を変更するとなると様々な箇所に手を加える必要が出てきます.そこで1つのノードが持つ機能を最小にすることででメンテナンス性・拡張性の向上を図りました.(ていうかROSではノードの機能を最小限にすることが推奨されているので前回のシステムは…)
最強のAIが考え出した演奏命令は、
xxのエフェクトをyyぐらいかける
ttのタイミングから次の曲のMIXを始める
というような感じで送信されます。一方で、ロボットの腕の制御で利用しているMoveItには、手の移動先の座標の形で命令を出す必要があります。
このギャップを埋めるために、
演奏命令(エフェクトなど)が対応するボタンと、その座標
DJコントローラのスライダーやノブなどの現在位置
を把握しておいて、AIからの演奏命令から”ハンドがどの座標に移動すればその命令を実行できるのか”を計算します。

演奏命令とDJコントローラのボタンとの対応はマニュアルを見ながら地道に定義しました。それらの座標はDJコントローラの3Dモデルから計測する予定です。
DJコントローラ上でのボタンの座標を頑張って定義しても、そもそもDJコントローラ自体の座標を知らなければ意味がありません。今のところはロボットとDJコントローラの位置関係は固定ですが、
厳密な位置関係を手動かつ静的に管理することは困難
ロボットやDJセットが多少は動いてずれる可能性がある
などの理由で、ロボットから見たDJコントローラの座標をリアルタイムで把握し続ける必要があります。
そこで、DJコントローラにARマーカーを貼り付け、カメラでそれを読み取って座標を把握しようという方針で開発を進めています。しかし、厳密にやろうとすると結構難しそうで、他にもっと良いやり方がないかということも検討中です。

続いてはAI班の浅倉が報告します。
選曲AIを作るには、それぞれの楽曲をAIに認識させる必要があります。現在手元に10万曲ほどの音源があるので、とりあえずコレを使うこととします。前回、AIが計算しやすいように楽曲のメタデータをエンコードしてベクトル化するとこまでは完了しました。残るは音源そのものです。音源は既にベクトルの形をとっているものですが、めっちゃ長いので非常に扱いづらいです。例えばサンプリングレートが44.1kHzで3分の曲では、音源の長さは800万近くなります。16kHzにダウンサンプリングしても300万近いです。さらに、長さは曲ごとにまちまちです。1分だったり3分だったりします。しかも、色んな周波数の音が重畳した状態でしか表現されておらず、長さの割に情報が少ないです。
これらを踏まえて、ここでは以下の手順で音源をエンコードしていきます。
音源を周波数解析して音響特徴量に変換
音響特徴量を固定長のベクトルに変換
音源は様々な周波数が重なり合った状態なので、周波数ごとに大まかに分割します。この類の特徴量として最も有名なのは、時間フーリエ変換を行うことで得られるスペクトログラムです。今回はちょっと特殊なメルスペクトログラムという特徴量を使います。と言っても音声認識界隈ではメジャーな特徴量で、人の聴覚に合わせてスケールしたスペクトログラムのことです。つまり、人間は低い音の変化には敏感で高い音の変化には鈍感である、という特性に合わせて計算を行います。より人が聞いた音に近い状態で特徴量を得られるので分析しやすいんじゃなかろうか、という理屈です。

こんな感じですね。設定にもよりますが、短時間フーリエ変換を行うことで長さは1/500とかになります。周波数軸の次元は80とか128なので、だいぶサイズは抑えられています。が、それでも10万曲分メモリにストックするとなるとまだまだ大きいです。
メルスペクトログラムの周波数次元数を128としたとき、今のところ音源は128×(n秒×サンプリングレート/500)くらいの行列として表されています。これをもっと小さくして、さらに(メタデータが1次元なので)1次元ベクトルに圧縮したいです。
前回の活動報告の時点では、AutoEncoderの類を使って圧縮すればなんとかなるんじゃないかと考えていましたが、意外とそうもいかず、BERTで行われるようなMLMでの埋め込み表現獲得も試しましたがさっぱり上手くいかず…この辺の試行に一か月を要しました(アホか?)。今思えば可変長は諦めて真ん中の1分を抜き出すとかすればよかったと思うのですが、いつまでもやってても埒が明かないので、とりあえず強引に周波数方向と時間方向に平均をとって、周波ベクトルと時系列ベクトルを作って音源ベクトルとしました。力任せすぎるので、この辺はいずれマシな方法を考えたいものです。
何はともあれ、楽曲のベクトル化は完了しました(させました)。そろそろ前準備にも飽きてきたので、選曲AIそのものを作っていこうと思います。選曲AIと一口に言っても、その目的や手法は様々に考えられます。
AIの選曲は何を基準にするのか?一つ前の曲をもとに続けて流す曲を選ぶセットリスト中で何番目に流す曲なのかをもとに選ぶ特定のジャンルや全体のバランスから選ぶ
選曲のアルゴリズムと評価方法は?本物のセットリストを選曲の正解値にする曲の分布を本物のセットリストに似せる音響特徴量から似た曲や合う曲を解析的に選び取る
と、軽く挙げただけでも色々思いつきます。今回は、全体のバランスを見つつ曲順を考慮した選曲AIを考えてみました。アルゴリズムは最後に挙げたものが面白そうですが、正直僕はDJの選曲過程をさっぱり理解していないので分布を似せる方向で進めます。
具体的には敵対的生成ネットワーク(GANs)という仕組みの学習モデルを立てます。どんなものか簡単に説明すると、偽物のデータを作るAIと、偽物データと本物データを見分けるAIを競争させながら学習することで、本物と見分けがつかないリアルなデータを生成できるようになる、という代物です。架空の美少女キャラクターを作るAIなんかが有名じゃないでしょうか。コレを使って、本物のセットリストと見分けがつかない選曲をしようというのが狙いです。

作りはこんな感じです。モデルの詳細なんか見ても面白くないので、ざっくりです。10曲~30曲分の初期値を与えて、10万曲の中から1曲1曲を選ぶイメージです。10万カテゴリからの分類問題に置き換えてセットリスト全体を並列に処理するので、順番を考慮しつつも全体のバランスを見た選曲ができる(はずの)作りになっています。選曲結果はargmaxにかけて10万曲の楽曲ベクトルと行列の積を取ります。こうすれば選曲結果を楽曲ベクトルで表して判別AIの学習に回せる、という寸法です。
で、肝心の選曲結果の一例はこんな感じです。

…どうなんでしょうね??はっきり言って僕には選曲の善し悪しがよく分かりませんが。その辺の評価はクラブによく行くメンバーに任せています。
とりあえず選曲AIのベースラインはこれでいきます。まだまだ改善ポイントがあるので、その辺はちまちまと改良していきます。今後はDJらしくミックスさせるAIにとりかかりますが、難点が二つほどあります。一つ目は、このAIはまだ体を持っていないのでDJセットを使って練習をすることができないという点です。もう一つは、僕がDJのミックスについてさっぱり理解していないことです。本当に大丈夫なのか?
ABOUT DJ Robotics
DJ Roboticsは、人と人型ロボットが共存し、ロボットが日常生活で活躍する社会を実現したいと考えています。そのために、エンターテインメントを通じて、人とロボットとの出会いの機会や体験を提供しています。