ドラムサンプル素材を二次元空間で可視化させてみよう(1)

人気音源メーカーのXLN Audioが最近、XOという「ドラムサンプル管理ツール」をリリースし、その革新的なインターフェイスは少なからず話題になりました。

管理が面倒なドラムサンプルを「XO space」なる二次元空間に展開して、直観的に素早く欲しいサンプルにたどり着く手助けをするという、あるようで無かったアイデア。実際に製品化されてみるとなかなか興奮しますね。

音楽情報処理に取り組んでいる者としては、音素材の音響特徴分析、分類、類似性比較等の要素を含んでいて、背後の技術がとても気になるソフトです。

そこで今回から、手持ちの知識と道具を使って、XOと似たような可視化空間が作れないか試していきたいと思います。

XOができること

まず実装の方向性を決めるために、XOの機能をもう少し詳しくまとめてみましょう。

  1. サンプルの類似性を二次元空間に展開:さきほども触れたXOの目玉技術。とりあえず、適切な類似性尺度と類似性が測れる音響特徴量を考える必要がある。また、それらをスクショのように均等に二次元空間に配置するには?
  2. サンプルの自動分類:XO空間の点の色は当然サンプルの種類をあらわしているが、具体的にはサンプル種類の「確率」だそう。つまりなんらかの分類モデルが出力した「連続値」である。教師あり機械学習モデルの出番である。
  3. カスタムサンプルの追加:自分のサンプルをXO空間へ展開させることができる。もちろん自動で色(種類)を付けてくれる。あとから追加できるということは、音響特徴からXO空間への投影は、サンプルごとに「決定論的」なものである(サンプルごとに置く位置は一意に決まる)はず。与えられたサンプル集合をいい感じに低次元空間に展開してくれる手法があるが(t-SNEなど)、そういのは直接利用できなさそう。
  4. サンプルフィルター機能:サンプルの種類だけでなく、音色などの特徴をもとにXO空間にフィルターをかけて、サンプルを探しやすくしてくれる。たぶん比較的わかりやすい音響処理問題。ただ「Druminess」という、「ドラムサンプルっぽさ」に対してフィルターする項目は、たぶんまた別に2クラスの分類モデルを学習して使っているのであろう。

こうしてまとめてみると、よく見る次元削減問題に似ているようで若干違う問題設定であることがわかります。特に「決定論的な投影をつくる」という要求がだいぶキツく、工夫が求められるところだと思います。

第一歩として、今回は適切な音響特徴量と類似性尺度まで考えてみます。

音声データの形式

実験で使う音声データとして、ドラム音源Native Instruments Battery 4の付属サンプル(10275個)を使います。サンプルの種類ごとにフォルダにまとめられているので、可視化の際に便利です。

まずは音声データの形を考えます。音声は1次元の時系列ですが、これをまず一定間隔に周波数域特徴に変換して、いわゆるスペクトログラムを作るのがお約束。「次元数は程々くらいでいいかな」という程度の動機で、音声認識で使われているらしいMel-scaleスペクトログラムを使ってみましょう。1フレームごとに128次元になります。

また、サンプルの印象はだいたいオンセットの瞬間に決まると思うので、音声は先頭の0.1秒くらいだけ残して、そのあと(ほとんどの場合ただの余韻)は切り捨てます。

簡単のため、先頭が無音(リバース系サンプルなど)、あるいは0.1秒すら無いようなサンプルは今回の実験では存在しないものとします。

どんな感じになったか見てみましょう。

キックやタムは高域が弱い、金属系は減衰が少なくある程度倍音構造が見えてたりと、それなりに特徴は見いだせますね。

0.1秒はスペクトログラム化したら10フレーム分になるので、1サンプルごとの次元数は1280。これの次元数を削減していき、最終的に良い感じの2次元空間(似てるサンプルどうしは近く、似てないサンプルどうしは遠くなる空間)に落とし込むことを目指します。

主成分分析(PCA)でとりあえず変換してみる

高次元ベクトル→低次元ベクトルへ変換する方法でもっとも単純なのが線形変換。768次元のベクトルに、768×2の行列をかければ、2次元ベクトルになります。

主成分分析(PCA)による次元削減は、情報損失を最大限抑えた線形変換を見つけてくれる方法です(詳しい理論は割愛)。また、サンプルごとに一意に決まる変換でもあります。

scikit-learnのPCA実装で走らせた結果、二次元データの分布はこうなりました。実際の音源の種類に応じて色を付けました。

あんまり分別度はよくありません。キックとタム、スネアとクラップが完全に混ざっています。音を鳴らしてみると、なんとなく音色が近いものどうしが集まってる感じもしますが、全然似てないサンプルが近くに置かれてるケースも多いですね。

t-SNE

t-SNE(t-distributed Stochastic Neighbor Embedding)という非線形的な次元削減手法を試してみます。

t-SNEによるイケてる次元圧縮&可視化

によると、可視化(2,3次元への圧縮)にだいぶ向いているし、「イケてる」らしい。

t-SNEを含めた非線形次元削減手法は、サンプル間の距離尺度に基づいて最適化するので(まさにそういう事がしたいのですが)、サンプルごとに位置が一意に決まる、という要求を満たせません。しかし特徴量や距離尺度がちゃんと働いているか確かめるには有用でしょう。

距離尺度をベクトル間のコサイン距離と定義して、同じくscikit-learnの実装でt-SNEを走らせた結果、分布はこうなりました。

キック、スネア、クラップ、金属系のゾーンをだいたい見出すことができます。音を鳴らしてみてもいい感じで、たまに変なのが混じるくらいですね。

実際のサンプル種類の情報を与えずにここまでできるということは、使っている特徴量と距離尺度はそこそこ機能しているということでしょう。サンプル追加を考えないのなら、この方法も十分サンプル探しに使えそうですね。

追記:

ほぼこれと同じ考えを実行したInfinite Drum Machineという実験がありました。

ドラムサンプルのスペクトログラムをt-SNEするところは同じ。「標準の」キック・スネア・ハイハット・シンバルのサンプルとの周波数域セントロイドと帯域幅の差を計算する、という素朴な方法で各サンプルの種類を判定してるみたいです。やはり、自前のサンプルを追加するということはできないみたいですね。

まとめ

Mel-scaleスペクトログラムは類似性の比較に使える、ということをとりあえず実験で示せたかと思います。

上に述べた通り、XOのシステムには分類モデルも存在しているようなので、たぶんXO空間への射影も分類結果に基づいているのかもしれません。次回は、サンプルの種類を判別する分類モデルを作り、さらに二次元空間への配置問題とどう組み合わせることができるか、考えてみたいと思います。

技術の使い道を考えるのは楽しい!