spleeterが予想以上にすごい

スポンサーリンク

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

ボーカルは元々入っていない。

まとめ

クリーントーンの曲じゃないと難しいのかな、と勝手に想像していたので、予想以上にうまくパートごとに分離されて驚いた。

タイトルとURLをコピーしました