話題の記事

機械学習(spleeter)を用いて音楽からドラムを抽出してDJに利用してみた

2019.11.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

エンジニアの皆さん、DJしていますか?

していない方は次の記事とこの記事を読んで、機運を高めてください。

エンジニアに捧ぐDJのススメ、あるいはDJコントローラの簡単なハック

はじめに

DJというものは、複数の音楽を繋げていかなければなりませんが、その際に繋げるタイミングの他にも気を使う点があります。

次の動画をご視聴ください。

これは2つの楽曲を単に混ぜています。つまり、1つ目の曲を流しながら単に2つ目の曲の音量を上げ、その後単に1つ目の曲の音量を下げています。

2つの曲が同時に流れている際、ドラムの音がちょっと2つ混ざってわちゃわちゃしていると思いませんか?

それでは今度次の動画をご視聴ください。

こちらでは、2つ目の曲の音量を上げる前に2つ目の曲の低音域(つまりドラムの音域)を下げてから、2つ目の曲の音量を上げて、1つ目の曲の低音域を下げながら2つ目の曲の低音域を上げ(つまりドラムを1つ目の曲から2つ目の曲にクロスフェードさせる)、1つ目の曲の音量を下げます。

さっきよりもいい感じに曲が変わっていませんか?あまりそう思えない場合は単に私が下手だからだと思いますが、このテクニックはどうもDJにとって有名なもののようです。

これを行う目的は、先程も挙げましたがドラムが両方の曲とも流れてわちゃわちゃしないようにするためです。しかし、単に低音域で絞ると、曲のドラム以外の低音域の要素も絞られてしまいますし、また低音域以外に紛れ込んでるドラム音域もあると思います。

そこで、曲の中からドラムだけを絞ると、もしかするともっといい感じに曲をミックス出来るかもしれないと私は考えました。

しかしながら、通常楽曲というものは、すべての楽器が同時に流れている波形データ(MP3等)として配布されています。

MIDIやDAWソフトのデータそのままを上げているアーティストもいるかもしれませんが、今だとかなり少ないのではないかと思います。

つまり、普通に配布されている曲からドラムだけを抜き出したりするのは困難でした…今までは。

spleeterとは

音楽ストリーミングサービスを提供しているDeezerが提供している、事前トレーニング済みモデルが付属した、機械学習によって音楽要素を分離するツールです。

https://github.com/deezer/spleeter

付属している事前トレーニング済みモデルでは、次の3タイプへの分離が可能になっています。

  • Vocals (singing voice) / accompaniment separation (2 stems)
  • Vocals / drums / bass / other separation (4 stems)
  • Vocals / drums / bass / piano / other separation (5 stems)

これを利用すると、すべての楽器やボーカルが一緒に流れている波形データから、上記のそれぞれを分離することができます。

つまり、下ごしらえなしのコマンド一発でボーカルやベースやドラムを別個に抜き出せるのです!

実際にspleeterを実行する前の楽曲(以下の曲はCC BY 3.0、あるいはCC BY-SA 3.0でライセンスされているので、条件のもとで加工可能な楽曲です)と結果(4 stems)を次に貼ります、かなりいい感じに分離できていると思いませんか?

DJしてみた

さて、では実際にこれでDJしてみましょう。

ドラムとそれ以外の楽器やボーカルのモデルを作ればいいのですが、ちょっと手間そうなので、上記のVocals / drums / bass / other separation (4 stems)で切り出して、次のようなコマンドでドラム以外を一緒にしてしまいます。

ffmpeg -i bass.wav -i vocals.wav -i other.wav -filter_complex amerge=inputs=3 -ac 2 out.wav

この状態で、DJソフトウェアで4デッキにし、1曲目のドラム以外、1曲目のドラムだけ、2曲目のドラム以外、2曲目のドラムだけ、をそれぞれセットします。

私が持っているDJコントローラは2デッキなので、とりあえず動かすために(1, 2)デッキの再生ボタンで(3, 4)デッキの再生ボタンが押されるようにMIDIマッピングを変更しました。

この状態でドラム以外、ドラムだけのキューを合わせて、本当にやっつけですが流したものが次のとおりになります。

1曲目を流しながら、2曲目のドラム以外だけを流して、2曲目のドラムだけを上げながら1曲目のドラムだけを下げて、1曲目のドラム以外を下げています。

ううんどうでしょう…肝心のDJが上手くなくて申し訳ないです、はっきりと「はじめに」の項に書いたものより良いとは言えないかもしれませんが、ひとまず私のやりたかったことはできました。

ミックスしたもう一曲もこちらに貼ります。

おわりに

高音域をボーカル、中音域をシンセ、低音域をベースとドラムにそれぞれ分けてDJコントローラにマッピングして、各要素をデッキに割り当てて再生すると結構面白いことになりそうです。ただ、普通のDJソフトウェア・コントローラではせいぜい4デッキぐらいなので難しいかもしれません。

Native Instrumentsが公開している、Stemsというオープンなフォーマットがあります。これはまさにspleeterで行った結果のような4つの音楽要素に分けた波形データを格納しているコンテナフォーマットのようです。

Stemsフォーマットでない楽曲もspleeterを使いつつStemsフォーマットに変換してしまえば、おそらくStemsフォーマットに対応したDJソフトウェア・コントローラを用いてStemsフォーマットで紹介されている動画のような全く新しいDJを行うことができそうです。

その変換まではどうにかできそうですが、そこから先のうまくDJをするということに関してはやはり私はまだまだのようなので、ここで筆を置かせてください。

最後になりますが、素晴らしいツールを公開してくれたDeezerと開発者の方々、そしていつもドイツからイカす音楽を届けてくれるFrozen Starfallのメンバーに感謝を伝えたいです。

この記事を読んだ人が、DJという行為を更なる高みへと持っていくことを切に希望して、記事にさせていただきます。