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
ボーカルは元々入っていない。
まとめ
クリーントーンの曲じゃないと難しいのかな、と勝手に想像していたので、予想以上にうまくパートごとに分離されて驚いた。

