2020年5月23日土曜日

機械学習による音源ソース分離

楽器の経験があったりすると音楽の特定の楽器パートだけを聞きたいという事があると思います。例えばベースパートだけ聞きたいとか。ベースって他の楽器に埋もれてしまって音程わからなくなるんですよね。機械学習によってこれを可能にする「Spleeter」というPythonのライブラリがありましたので試してみました。音楽ファイルをボーカル/ドラム/ベース/ピアノ/その他のパート毎のファイルに分離することができるとのことです。


■ざっとお勉強
文献[1]をざっと見た感じ機械学習による音源分離は…音響信号を短時間フーリエ変換によって「スペクトログラム」というX軸:時間、Y軸:周波数、色:強さ(振幅)で表した画像にして、オリジナルのスペクトログラムと楽器毎のスペクトログラムを学習データとしてニューラルネットワークに入力し学習モデルを作成。学習モデルをもとに入力された音源をソース分離、音響信号を出力する。…という感じで行われているようです。


Spleeter[2]は「U-net」という畳み込みニューラルネットワークを12層重ねたものを使っているとのこと。前半のエンコード部で画像を粗くして(ぼかして)特徴を捉え、後半6層のデコード部でエンコード部で失われた情報をつかって詳細に復元する。ということをしているらしいです。音源ソース分離の学習・評価用のデータについては一般的にはMUSDBやBeanというデータセットがよく使われているようですがSpleeterは音楽ストリーミングサービスDeezerの独自のデータセットを使っているようですね。

その他にもサンプリング周波数を44100Hzから22050Hzにしたり楽曲を11.88秒間隔のセグメントに区切って楽曲毎にランダムな1セグメントを選んで使用とかイントロアウトロ20秒は使わないとか。ざっと読んでもわからない事たくさんです。


■実際に音源分離やってみた
実際にSpleeterで音源ソース分離を行ってみました。転載可能な楽曲で。
ベース :ベース音だけ抽出できてる!ちゃんと音程聞き取れてすごいです!
ドラム:思ってたよりかっこいいドラムでした(驚)
ピアノ:ちょっと耳が痛い。音源によって得意不得意あるのかも。
ボーカル:機械音声ですがボーカルとして抽出してくれてました。


ベース:おぉ!おしゃれでノリノリないい演奏♪
ドラム:いろんな打楽器がちゃんと抽出できてますね。
ピアノ:あんまり前に出てないですけどちゃんと演奏してるんですね。
その他:若干オルガン音と1:40~ギター音が抽出されてました。
ボーカル:コーラスはあんまし抽出しないみたい。

以上な感じ。雰囲気掴めたでしょうか?J-POPでもいくつか試していますが同様に分離してくれました(クラムボンのベースとかいい感じです)。ドラムとベースの抽出が優れているように思いました。一方でピアノやボーカルはシャワシャワ言ったり一部抽出できなかったりしていました。でもすごいです。耳コピとかする人には大変ありがたい技術だと思います!

今後もPython・機械学習の勉強で面白いの見つけたら取り上げたいと思います。

【参考文献】
[1] Z. Rafii, A. Liutkus, F. Stöter, S. I. Mimilakis, D. FitzGerald and B. Pardo, "An Overview of Lead and Accompaniment Separation in Music," in IEEE/ACM Transactions on Audio, Speech, and Language Processing, vol. 26, no. 8, pp. 1307-1335, Aug. 2018, doi: 10.1109/TASLP.2018.2825440.

[2] Romain Hennequin, Anis Khlif, Felix Voituret, Manuel Moussallam, "SPLEETER: A FAST AND STATE-OF-THE ART MUSIC SOURCE
SEPARATION TOOL WITH PRE-TRAINED MODELS", in ISMIR 2019 Late-Breaking/Demo 2019