Spleeterを使って音源分離してみた

spleeterを使って音源分離してみました。

spleeterとは

ニューラルネットワークを使い、曲を複数トラックに分離するソフト。
普通の2Chのオーディオデータを入力すると、
「ドラム、ベース、ボーカル、ピアノ、その他」 のパートに分離してくれます。

詳細は日本語Wiki参照。

分離サンプル

www.youtube.com

打ち込み途中の耳コピ曲を使い、分離の具合を確認してみました。
ドラムがここまではっきりと分離できるのに驚きです。耳コピが捗りそう。

※ボーカル無しの打ち込みを使ったので、ボーカルの分離はできていません
※音声がチリチリ言っているのは、キャプチャの都合です

使い方(Win10 / 64bit、Anaconda環境)

以下URLのとおりです。
https://github.com/deezer/spleeter/wiki/1.-Installation

インストール

  1. Anacondaでspleeter用の環境を作成する
  2. コマンドプロンプトから、conda install -c conda-forge spleeter

※ 強いGPUが使える人は、かわりに spleeter-gpu を指定すると高速です。
 自分の環境(GTX980 4GB)ではすぐGPUのメモリ不足になったので、本当に強いマシン向けっぽい。

実行(コマンドプロンプト

  1. 適当なディレクトリに移動する
  2. spleeter separate -i (入力ファイル.wav) -o (出力フォルダ) spleeter:5stems-16kHz

これで、出力フォルダに5トラックに分離された音声データが出力されます。

※ 「librosaがない」と怒られる場合は、conda install -c conda-forge librosa すればOK。

実行(pythonスクリプト

from spleeter.separator import Separator
import os

def main():
    # Use CPU
    os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
    
    input_audio = "./input/ed.wav"
    outdir_path = './output/5stems'
    os.makedirs(outdir_path, exist_ok=True)
    
    separator_ = Separator('spleeter:5stems-16kHz')
    separator_.separate_to_file(input_audio, outdir_path)

if __name__ == "__main__":
    main()

通常DLしてくるpre-trained-modelとは別に、fine-tunedなモデルも公開されています。 スクリプトと同じフォルダに「pretrained_models」フォルダを作り、
githubのreleaseページの「-finetune」モデルをリネーム/展開しておくと、音質が多少よくなります。(多分)

その他オプション

  • 5stems となっているところは、4stems2stems に変更できます。

    • 4stems の場合は「ドラム、ベース、ボーカル、その他」
    • 2stems の場合は「ボーカル、その他」
      に分離します。
  • -16kHz 指定をやめると、低い周波数までしか計算しなくなります。