Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Pythonでボーカル・ドラム・ベース・伴奏を抽出できる楽器分離ライブラリ Spleeter の使い方・デモ

f:id:Kurene:20220312124604p:plain:w500
https://github.com/deezer/spleeter より

楽曲のメロディ・和音・リズムといった音楽的分析を行うには、個々の構成楽器ごとの分析が重要です。

楽譜・MIDIファイルは情報が各トラックごとに分かれているため メロディ・和音・リズムといった音楽的要素・文脈の分析に取り組みやすいです。

一方で、楽曲ファイル(音響信号)を入力とする音楽分析では全てのトラックがミックスされているという点が音楽的分析の障壁となります。

ミックスダウンされたファイルから複数の楽器のメロディ・和音・リズム分析処理は実装が難しく、また、計算コストや精度、汎用性が十分でないことが長年の課題でした。

しかし、近年は統計的手法の発展や深層学習の利用により、製品・サービスでも使えるレベルの処理が登場しています。

そんな最新の楽器分離を手軽に利用できるPythonライブラリとして Spleeter があります。

そこで、この記事ではSpleeterの使い方を説明します。

また、実際に分離した音源のデモを掲載しています。

github.com

Spleeter とは?

Spleeterは音楽配信サービスで知られているDeezer社によって開発された、楽器分離のPython向けOSSライブラリです。

research.deezer.com

Githubの説明によると、

といったプロオーディオソフトウェア製品でも利用されているそうです*1

そのようなライブラリがMITライセンスで利用できるのは非常に嬉しいことです。

また、深層学習フレームワークを使っているので、GPUがあれば高速に処理できます*2*3

インストール方法

pip install spleeter

Anacondaを利用している場合はcondaが使えます。

conda install -c conda-forge ffmpeg libsndfile

さらに、Python環境がない/インストール前に試してみたい人向けに、Google Colabが用意されています。

なお、深層学習のモデルの計算のためにTensorflowなどのライブラリも合わせて必要であるため、インストール時は若干時間がかかるかもしれません。

使い方

基本的には、Spleeter - GitHubWikiに記載されています。

また、Spleeterの楽器分離方法は3種類ありますので、目的や対象楽曲の楽器構成を考慮して選んでください。

  • ボーカル(歌声)/伴奏の分離(2ステム)
  • ボーカル/ドラム/ベース/その他 の分離(4ステム)
  • ボーカル/ドラム/ベース/ピアノ/その他 の分離(5ステム)

入力ファイルは、wav以外にも、flacやmp3も可です。

pretrained_modelsの各モデルごとの全ファイルサイズは以下のようになっていました。

  • 2stems: 75.7MB
  • 4stems: 151MB
  • 5stems: 189MB

このくらいのパラメタ数で収まると使い勝手がよいため、Spleeterのありがたいポイントの1つです。

コマンドラインで実行

以下を参考にしてください。 github.com

Pythonスクリプト

import os
from spleeter.separator import Separator
 
 
#======================================================
# Spleeterの設定
# vocals / accompaniment の2つのステムに分離
params_descriptor = "spleeter:2stems"
# vocals / bass / drums / other の4つのステムに分離
params_descriptor = "spleeter:4stems"
# vocals / bass / drums / piano / other の5つのステムに分離
params_descriptor = "spleeter:5stems"

# ソフトマスクかウィーナーフィルタが指定する。デフォルトはFalseでソフトマスク
MWF = True
#======================================================

基本的には、```params_descriptor```でモデル(2stem分離用,4stem分離用,5stem分離用)を選択し、入力音源のファイルパスを与えればOKです。


# 入力信号
filepath = "./test_spleeter.mp3"
basename = os.path.splitext(os.path.basename(filepath))[0]

# 保存するディレクトリ準備
save_dirpath = basename + "_" + params_descriptor[-6::]
os.makedirs(save_dirpath, exist_ok=True)

# Spleeter の処理を実行
if __name__ == '__main__':
    separator = Separator(params_descriptor, MWF=MWF)
    separator.separate_to_file(filepath, save_dirpath)

Separator()のその他引数については、ソースコードのSeparator関数の定義が参考になります。

github.com

注意点

Tensorflowを使っているため、以下のようにif __name__ == '__main__':無しでスクリプトを書くとエラーがでます。

#if __name__ == '__main__':
separator = Separator(params_descriptor, MWF=MWF)
separator.separate_to_file(filepath, save_dirpath)

エラー内容:

RuntimeError:
        An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module:
 if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

github.com

デモ

2, 4, 5 stems の各条件+ソフトマスクorウィーナーフィルタで比較してみました。

楽曲はピアノが含まれてない音源を使っています。

どれを聞いても、基本的には他の音源が混じっていない形でちゃんと分離できていることが分かります。

個々の楽曲に対する最適化なしでここまでできるのは非常に良い性能だと思います。

分離方法と音質に関しては、ソフトマスクのほうが良さそうですが大差はないように思います。強いて言えば、ウィーナーフィルタは若干削りすぎかもしれません。

モデルと音質に関しては4stemsが一番良いように感じました。これは、元の楽器構成とモデルの楽器構成との関連性があるかと思います*4


なお、同じ楽曲をRobust PCMでボーカル抽出した結果が以下になります。

どうしてもRobust PCA ベースだと消し残りが目立ちます。

また、計算にもRobustPCAよりもSleeperの方が速いです*5

まとめ

Pythonでボーカル・ドラム・伴奏を抽出できる楽器分離ライブラリSpleeterの使い方を説明しました。

自分の楽曲で試してみても、非深層学習ベースの既存手法よりもはるかに音質がよくなっています

ここからポスト処理でチューニングすれば更に音質は改善すると思います。

pip install spleeterで即導入できて、数行書けばよいのも魅力的です。

分離品質だけでなく、ライブラリの設計やライセンス的にも利用しやすいので、自身の音楽分析でも積極的に利用したいと思っています。

なお、もう少し発展的な内容として、Spleeterの入出力信号をNumpyで扱ったり、分離信号の音響特徴を抽出する方法を以下の記事にまとめております。

www.wizard-notes.com

ご興味がありましたらこちらもお読みいただければ幸いです。

補足:Spletterの処理の詳細について

Spleeterに関して、Deezer社所属の方が著者となっている論文が見つかりました。

2件目のほうがテクニカルな内容となっています。

1件目の方の要点をまとめてみました。

  • Spleeterについて
    • 分離性能だけでなく、使いやすさ、速度も考慮して設計している
    • モチベーションの一つは、自分のデータセット上で新しいモデルの性能を比較するベースラインを作ること
      • 公開データセットでの比較は従来もできた
      • プライベートなデータセット著作権により頒布できない
      • 一方、学習済みモデルは頒布することができる
  • 実装の詳細
    • U-net (Jansson et al., 2017)ベースであり、Prétet, et.al 2019 (2件目の論文)と同様の仕様
  • 速度
    • CNNベースなので効率的な並列計算が可能
    • 単一のGeForce RTX 2080 GPUを使用した条件では、100秒のステレオオーディオを1秒未満で処理することができた
  • 分離性能
    • musdb18データセット(Rafii et al., 2017)上で最先端モデルと競合(ただし、Spleeterは最適化されてない)
  • ライセンス
    • ソースコードと事前学習済みモデルはgithubで公開されており、MITライセンスのもとで配布されている
    • このリポジトリは、将来的に性能を向上させた他のモデルや、5本以上に分離したモデルを公開するために使用される予定

*1:Music Rebalanceはたまに利用しますが、分離精度・音質は十分に実用的です

*2:GitHubには100倍と記載されている

*3:バッファリングが必要なので非リアルタイム

*4:なお、5stemsでピアノトラックがちゃんと無音になっており、そういったところもちゃんと設計されているので素晴らしいです

*5:GPUなしでも