spleeterを使うと、音楽をパートごとに分離できるらしいので試してみると、予想以上に素晴らしかった。周波数帯域を設定して必要な音を分離する時のような、細かな設定は必要ない。
インストール環境
かなり非力なマシン(Mac Mini 2009)にインストールした。
- 2.0GHzのIntel Core 2 Duoプロセッサ
- メモリ4GB
spleeterのインストール
一番簡単な方法でUbuntu 18.04.1 LTS (Bionic Beaver)インストールした。特に問題なく、インストールとサンプルの実行が確認できた。
git clone https://github.com/Deezer/spleeter conda install -c conda-forge spleeter spleeter separate -i spleeter/audio_example.mp3 -p spleeter:2stems -o output
パートごとの分離実行
失敗例
最初に3分位の曲を試したら、次のようなエラーが出た。メモリが足りないらしい。やはりこのマシンでは無理か?と思いつつ色々試していると、曲の長さを10秒位にするとエラーが出なくなった。
OMP: Info #212: KMP_AFFINITY: decoding x2APIC ids. OMP: Info #213: KMP_AFFINITY: cpuid leaf 11 not supported - decoding legacy APIC ids. OMP: Info #149: KMP_AFFINITY: Affinity capable, using global cpuid info OMP: Info #154: KMP_AFFINITY: Initial OS proc set respected: 0,1 OMP: Info #156: KMP_AFFINITY: 2 available OS procs OMP: Info #157: KMP_AFFINITY: Uniform topology OMP: Info #159: KMP_AFFINITY: 1 packages x 2 cores/pkg x 1 threads/core (2 total cores) OMP: Info #214: KMP_AFFINITY: OS proc to physical thread map: OMP: Info #171: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 OMP: Info #171: KMP_AFFINITY: OS proc 1 maps to package 0 core 1 OMP: Info #250: KMP_AFFINITY: pid 6569 tid 6569 thread 0 bound to OS proc set 0 OMP: Info #250: KMP_AFFINITY: pid 6569 tid 6600 thread 1 bound to OS proc set 1 OMP: Info #250: KMP_AFFINITY: pid 6569 tid 6601 thread 2 bound to OS proc set 0 OMP: Info #250: KMP_AFFINITY: pid 6569 tid 6630 thread 4 bound to OS proc set 0 OMP: Info #250: KMP_AFFINITY: pid 6569 tid 6629 thread 3 bound to OS proc set 1 Traceback (most recent call last): File "/home/chopin/anaconda3/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1356, in _do_call return fn(*args) :(中略) _ProcessNewOps for new_op in graph._add_new_tf_operations(compute_devices=False): # pylint: disable=protected-access File "/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 3751, in _add_new_tf_operations for c_op in c_api_util.new_tf_operations(self) File "/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 3751, in <listcomp> for c_op in c_api_util.new_tf_operations(self) File "/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 3641, in _create_op_from_tf_operation ret = Operation(c_op, self) File "/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 2005, in __init__ self._traceback = tf_stack.extract_stack()
成功例
10秒程度の簡単な曲(demo2s.wav)を、4 stemsの設定でvocals/drums/bass/otherの4種類に分離してみた。結果は、指定したディレクトリの下にwav形式で出力される。実行時間はこのマシンだと約1分半。GPUを使うと100倍の速度になるらしい。
time spleeter separate -i demo2s.wav -p spleeter:4stems -o output OMP: Info #212: KMP_AFFINITY: decoding x2APIC ids. INITY: pid 3738 tid 3788 thread 1 bound to OS proc set 1 :(中略) INFO:spleeter:File output/demo2s/vocals.wav written INFO:spleeter:File output/demo2s/bass.wav written INFO:spleeter:File output/demo2s/drums.wav written INFO:spleeter:File output/demo2s/other.wav written real 1m23.705s user 2m11.568s sys 0m2.922s
元の曲
テストに使用した曲は、残念ながらボーカルが入ってない。
パート分離結果
drums
最後の方にちょっとギターが入ってる。
other
主にギター。
bass
ベース。
vocal
ボーカルは元々入っていない。
まとめ
クリーントーンの曲じゃないと難しいのかな、と勝手に想像していたので、予想以上にうまくパートごとに分離されて驚いた。