RHEL系Linux（Oracle Linux）でSpleeterをセットアップしてみる

# はじめに
minicondaを使わないRHEL系LinuxでのSpleeterセットアップの情報が全く見つからず、やってみましたが思いの外難しかったので実施したことをメモしておきます。

これをやってみようと思った背景は、DAW(StudioOne)で録音した楽器のパート別音源に、録音のやり方が悪かったのか別パートの音が混じってしまっていたため、これをなんとか分割できないか調べているうちにSpleeterにたどり着いた、というところから始まっています。
また、セットアップのために極力ローカルPCを汚したくなく、OCIの無料のAlwaysFreeインスタンスでやってみることにしました。

# 環境
Oracle Cloud Infrastructure Always FreeのOracle Linuxで試しています。

> OS: Oracle Linux 8.4
> VM: VM.Standard.E2.1.Micro（Always Free対象）
> Python: python3.6

# Spleeterインストールまで

### ffmpegというものが必要？
頑張って調べると[このページ](https://rpmfusion.org/Configuration)にたどり着く。
以下コマンドでリポジトリ追加。

```bash
$ sudo yum install epel-release
$ sudo dnf install --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
```

とりあえずインストールを試すがエラー。

```bash
$ sudo yum install ffmpeg ffmpeg-devel
RPM Fusion for EL 8 - Free - Updates                                                                                                                             182 kB/s | 290 kB     00:01    
エラー: 
 問題 1: conflicting requests
  - nothing provides libSDL2-2.0.so.0()(64bit) needed by ffmpeg-4.2.4-2.el8.x86_64
 問題 2: package ffmpeg-devel-4.2.4-2.el8.x86_64 requires libavdevice(x86-64) = 4.2.4-2.el8, but none of the providers can be installed
  - package ffmpeg-devel-4.2.4-2.el8.x86_64 requires libavdevice.so.58()(64bit), but none of the providers can be installed
  - conflicting requests
  - nothing provides libSDL2-2.0.so.0()(64bit) needed by libavdevice-4.2.4-2.el8.x86_64
(インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)
```

[これも必要](https://www.remix.asia/blog/remix/2020/12/centos832011_64bit_ffmpeg_424.html)っぽい。なんとかインストール成功。

```bash
$ sudo dnf install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm
$ sudo yum install ffmpeg ffmpeg-devel
```
これで良いっぽい？

```bash
$ ffmpeg -version
ffmpeg version 4.2.4 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (GCC)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100
```

### spleeterのインストール
とりあえず一回インストール試してみるも失敗？

```bash
$ sudo pip3 install spleeter
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting spleeter
  Downloading https://files.pythonhosted.org/packages/fb/2e/5d2cd3d0179d3f749d03eddf0172f1dbababbc371c1b5cbd7fc27d741070/spleeter-2.2.2-py3-none-any.whl (50kB)
    100% |████████████████████████████████| 51kB 6.6MB/s 
Collecting importlib-resources<5.0.0,>=4.1.1; python_version < "3.7" (from spleeter)
  Downloading https://files.pythonhosted.org/packages/e1/44/a4d7387e5207e66e567c04f87b652a9a174335043838ee7f85ef05f28945/importlib_resources-4.1.1-py3-none-any.whl
Collecting importlib-metadata<4.0.0,>=3.0.0; python_version < "3.8" (from spleeter)
  Downloading https://files.pythonhosted.org/packages/52/d0/bdb31463f2d9ca111e39b268518e9baa3542ef73ca449b711a7b4da69764/importlib_metadata-3.10.1-py3-none-any.whl
Collecting typer<0.4.0,>=0.3.2 (from spleeter)
  Downloading https://files.pythonhosted.org/packages/90/34/d138832f6945432c638f32137e6c79a3b682f06a63c488dcfaca6b166c64/typer-0.3.2-py3-none-any.whl
Collecting numpy<1.19.0,>=1.16.0 (from spleeter)
  Downloading https://files.pythonhosted.org/packages/b3/a9/b1bc4c935ed063766bce7d3e8c7b20bd52e515ff1c732b02caacf7918e5a/numpy-1.18.5-cp36-cp36m-manylinux1_x86_64.whl (20.1MB)
    100% |████████████████████████████████| 20.1MB 28kB/s 
Collecting httpx[http2]<0.17.0,>=0.16.1 (from spleeter)
  Downloading https://files.pythonhosted.org/packages/2d/c6/59aa4188e7eddb9e89ec67a51598ca6bfc09f1b38c9b45f7ee45af7a4df4/httpx-0.16.1-py3-none-any.whl (65kB)
    100% |████████████████████████████████| 71kB 6.3MB/s 
Collecting pandas==1.1.2 (from spleeter)
  Downloading https://files.pythonhosted.org/packages/1c/11/e1f53db0614f2721027aab297c8afd2eaf58d33d566441a97ea454541c5e/pandas-1.1.2-cp36-cp36m-manylinux1_x86_64.whl (10.5MB)
    100% |████████████████████████████████| 10.5MB 56kB/s 
Collecting tensorflow==2.3.0 (from spleeter)
  Could not find a version that satisfies the requirement tensorflow==2.3.0 (from spleeter) (from versions: 0.12.1, 1.0.0, 1.0.1, 1.1.0rc0, 1.1.0rc1, 1.1.0rc2, 1.1.0, 1.2.0rc0, 1.2.0rc1, 1.2.0rc2, 1.2.0, 1.2.1, 1.3.0rc0, 1.3.0rc1, 1.3.0rc2, 1.3.0, 1.4.0rc0, 1.4.0rc1, 1.4.0, 1.4.1, 1.5.0rc0, 1.5.0rc1, 1.5.0, 1.5.1, 1.6.0rc0, 1.6.0rc1, 1.6.0, 1.7.0rc0, 1.7.0rc1, 1.7.0, 1.7.1, 1.8.0rc0, 1.8.0rc1, 1.8.0, 1.9.0rc0, 1.9.0rc1, 1.9.0rc2, 1.9.0, 1.10.0rc0, 1.10.0rc1, 1.10.0, 1.10.1, 1.11.0rc0, 1.11.0rc1, 1.11.0rc2, 1.11.0, 1.12.0rc0, 1.12.0rc1, 1.12.0rc2, 1.12.0, 1.12.2, 1.12.3, 1.13.0rc0, 1.13.0rc1, 1.13.0rc2, 1.13.1, 1.13.2, 1.14.0rc0, 1.14.0rc1, 1.14.0, 2.0.0a0, 2.0.0b0, 2.0.0b1)
No matching distribution found for tensorflow==2.3.0 (from spleeter)
```

pipのバージョンが古いとダメな場合があるようで。とりあえずバージョン上げてみる。

```bash
$ sudo pip3 install --upgrade pip
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting pip
  Downloading https://files.pythonhosted.org/packages/7c/02/9ab8b431aca1b46fcc1ac830a5870a28a12ba1abfa681904b1d2da876a86/pip-21.2.1-py3-none-any.whl (1.6MB)
    100% |████████████████████████████████| 1.6MB 299kB/s 
Installing collected packages: pip
Successfully installed pip-21.2.1
```

今度こそインストールできた。（Warning出てきたがpip直だたきは良くない？python勉強します。）

```bash
$ sudo pip3 install spleeter
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.

〜略〜

Successfully installed absl-py-0.13.0 appdirs-1.4.4 astunparse-1.6.3 audioread-2.1.9 cachetools-4.2.2 charset-normalizer-2.0.3 click-7.1.2 contextvars-2.4 dataclasses-0.8 ffmpeg-python-0.2.0 future-0.18.2 gast-0.3.3 google-auth-1.33.1 google-auth-oauthlib-0.4.4 google-pasta-0.2.0 grpcio-1.39.0 h11-0.12.0 h2-3.2.0 h5py-2.10.0 hpack-3.0.0 httpcore-0.12.3 httpx-0.16.1 hyperframe-5.2.0 immutables-0.15 importlib-metadata-3.10.1 importlib-resources-4.1.1 joblib-1.0.1 keras-preprocessing-1.1.2 librosa-0.8.0 llvmlite-0.36.0 markdown-3.3.4 norbert-0.2.1 numba-0.53.1 numpy-1.18.5 oauthlib-3.1.1 opt-einsum-3.3.0 packaging-21.0 pandas-1.1.2 pooch-1.4.0 protobuf-3.17.3 pyasn1-0.4.8 pyasn1-modules-0.2.8 requests-2.26.0 requests-oauthlib-1.3.0 resampy-0.2.2 rfc3986-1.5.0 rsa-4.7.2 scikit-learn-0.24.2 scipy-1.4.1 setuptools-57.4.0 six-1.16.0 sniffio-1.2.0 soundfile-0.10.3.post1 spleeter-2.2.2 tensorboard-2.5.0 tensorboard-data-server-0.6.1 tensorboard-plugin-wit-1.8.0 tensorflow-2.3.0 tensorflow-estimator-2.3.0 termcolor-1.1.0 threadpoolctl-2.2.0 typer-0.3.2 typing-extensions-3.10.0.0 werkzeug-2.0.1 wheel-0.36.2 wrapt-1.12.1 zipp-3.5.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
$ spleeter --version
Spleeter Version: 2.2.2
```

とりあえず[GitHubのREADME](https://github.com/deezer/spleeter/blob/master/README.md)のクイックスタートに書いてあったサンプルで実際に試してみる。
が、またエラー...

```bash
$ wget https://github.com/deezer/spleeter/raw/master/audio_example.mp3
--2021-07-27 21:27:32--  https://github.com/deezer/spleeter/raw/master/audio_example.mp3
github.com (github.com) をDNSに問いあわせています... 140.82.114.3
github.com (github.com)|140.82.114.3|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://raw.githubusercontent.com/deezer/spleeter/master/audio_example.mp3 [続く]
--2021-07-27 21:27:33--  https://raw.githubusercontent.com/deezer/spleeter/master/audio_example.mp3
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 262867 (257K) [audio/mpeg]
`audio_example.mp3' に保存中

audio_example.mp3                                100%[=======================================================================================================>] 256.71K  --.-KB/s 時間 0.007s   

2021-07-27 21:27:33 (34.9 MB/s) - `audio_example.mp3' へ保存完了 [262867/262867]
$ spleeter separate -p spleeter:2stems -o output audio_example.mp3
Traceback (most recent call last):
  File "/usr/local/bin/spleeter", line 8, in <module>
    sys.exit(entrypoint())
  File "/usr/local/lib/python3.6/site-packages/spleeter/__main__.py", line 256, in entrypoint
    spleeter()
  File "/usr/local/lib/python3.6/site-packages/typer/main.py", line 214, in __call__
    return get_command(self)(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/typer/main.py", line 497, in wrapper
    return callback(**use_params)  # type: ignore
  File "/usr/local/lib/python3.6/site-packages/spleeter/__main__.py", line 114, in separate
    from .separator import Separator
  File "/usr/local/lib/python3.6/site-packages/spleeter/separator.py", line 27, in <module>
    from librosa.core import istft, stft
  File "/usr/local/lib/python3.6/site-packages/librosa/__init__.py", line 211, in <module>
    from . import core
  File "/usr/local/lib/python3.6/site-packages/librosa/core/__init__.py", line 5, in <module>
    from .convert import *  # pylint: disable=wildcard-import
  File "/usr/local/lib/python3.6/site-packages/librosa/core/convert.py", line 7, in <module>
    from . import notation
  File "/usr/local/lib/python3.6/site-packages/librosa/core/notation.py", line 8, in <module>
    from ..util.exceptions import ParameterError
  File "/usr/local/lib/python3.6/site-packages/librosa/util/__init__.py", line 84, in <module>
    from .files import *  # pylint: disable=wildcard-import
  File "/usr/local/lib/python3.6/site-packages/librosa/util/files.py", line 11, in <module>
    import pooch
  File "/usr/local/lib/python3.6/site-packages/pooch/__init__.py", line 10, in <module>
    from .core import Pooch, create, retrieve
  File "/usr/local/lib/python3.6/site-packages/pooch/core.py", line 17, in <module>
    import requests
  File "/usr/local/lib/python3.6/site-packages/requests/__init__.py", line 43, in <module>
    import urllib3
  File "/usr/lib/python3.6/site-packages/urllib3/__init__.py", line 8, in <module>
    from .connectionpool import (
  File "/usr/lib/python3.6/site-packages/urllib3/connectionpool.py", line 11, in <module>
    from .exceptions import (
  File "/usr/lib/python3.6/site-packages/urllib3/exceptions.py", line 2, in <module>
    from .packages.six.moves.http_client import (
ModuleNotFoundError: No module named 'urllib3.packages.six'
```

***No module named 'urllib3.packages.six'*** でググるとurllib3アップデートするとよい的な情報があったので試してみる。

```bash
$ pip3 install -U urllib3
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: urllib3 in /usr/lib/python3.6/site-packages (1.24.2)
Collecting urllib3
  Downloading urllib3-1.26.6-py2.py3-none-any.whl (138 kB)
     |████████████████████████████████| 138 kB 9.3 MB/s 
Installing collected packages: urllib3
  WARNING: Value for scheme.platlib does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /home/opc/.local/lib/python3.6/site-packages
  sysconfig: /home/opc/.local/lib64/python3.6/site-packages
  WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /home/opc/.local/include/python3.6m/urllib3
  sysconfig: /home/opc/.local/include/python3.6/urllib3
  WARNING: Additional context:
  user = True
  home = None
  root = None
  prefix = None
WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
distutils: /home/opc/.local/include/python3.6m/UNKNOWN
sysconfig: /home/opc/.local/include/python3.6/UNKNOWN
Successfully installed urllib3-1.26.6
```

もう一度やったら今度こそ成功...

```bash
$ spleeter separate -p spleeter:2stems -o output audio_example.mp3
INFO:spleeter:Downloading model archive https://github.com/deezer/spleeter/releases/download/v1.4.0/2stems.tar.gz
INFO:spleeter:Validating archive checksum
INFO:spleeter:Extracting downloaded 2stems archive
INFO:spleeter:2stems model file(s) extracted
INFO:spleeter:File output/audio_example/vocals.wav written succesfully
INFO:spleeter:File output/audio_example/accompaniment.wav written succesfully
$ ll output/audio_example/
合計 3752
-rw-rw-r--. 1 opc opc 1919406  7月 27 21:39 accompaniment.wav
-rw-rw-r--. 1 opc opc 1919406  7月 27 21:39 vocals.wav
```

# 実際の音源で試してみる
StudioOneから対象のパート(バックで他の楽器が流れてしまっているやつ)をmp3でエクスポート。とりあえずscpでサーバーへ送る。

```bash
# ローカル環境のmacOSターミナルから
$ scp -i <秘密鍵> *.mp3 opc@<PublicIP>:/home/opc/
Fair_And_Warmer_AS1.mp3       100% 1633KB  82.4KB/s   00:19    
Fair_And_Warmer_Tb1.mp3       100% 1633KB  98.8KB/s   00:16    
Time_Stream_AS1.mp3           100% 1652KB 165.0KB/s   00:10    
Time_Stream_Tb1.mp3           100% 1652KB 134.0KB/s   00:12    
```

[こちら](https://github.com/deezer/spleeter/wiki/2.-Getting-started)や`spleeter separate --help`を参考にコマンド試してみるも強制終了...
どうやらメモリ不足のときにそうなることがあるそうで...

```bash
$ spleeter separate -o FairAndWarmer_AS1 -p spleeter:5stems Fair_And_Warmer_AS1.mp3
INFO:spleeter:Downloading model archive https://github.com/deezer/spleeter/releases/download/v1.4.0/5stems.tar.gz
INFO:spleeter:Validating archive checksum
INFO:spleeter:Extracting downloaded 5stems archive
INFO:spleeter:5stems model file(s) extracted
強制終了  # 残念...
$ spleeter separate -o TimeStream_Tb1 -p spleeter:5stems Time_Stream_Tb1.mp3 
強制終了  # もう少し短い音源でもダメ...
$ spleeter separate -o TimeStream_Tb1 -p spleeter:4stems Time_Stream_Tb1.mp3
INFO:spleeter:Downloading model archive https://github.com/deezer/spleeter/releases/download/v1.4.0/4stems.tar.gz
INFO:spleeter:Validating archive checksum
INFO:spleeter:Extracting downloaded 4stems archive
INFO:spleeter:4stems model file(s) extracted
強制終了  # 分割するアイテム数減らしてもダメ...
```
たしかにメモリは最大まで使ってしまってるみたいです...
![20210727_spleeter_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/c4dad9c0-ea12-3748-2e65-7767e48ceabc.png)

# まとめ

残念ながらOCIのAlwaysFreeインスタンスではSpleeterを使うには非力すぎたようです。
Linuxの方がセットアップが簡単だと思ったから挑戦してみましたが、意外とハマりポイントが多い＆結局使えずとあんまりな結果でした。

ただ、コマンドを実行させるところまではいけているので、インスタンスを有料のメモリ多いやつに変更したらたぶん行けるのではないかと思います。

# 追記
仕方ないのでMacかWindowsで環境作ってリトライするかと思っていたところ、[こんな](https://qiita.com/YasaiDev/items/65acd38f4034800388c0)素晴らしい記事＆ツールがあると知りました。ツールの素晴らしさもさることながらGoogle Colaboratoryの存在も初めて知り、とても興味深いなと思いました。いろいろ調べてみよう。

ちなみにこちらのツールで実際に5パートへ分割してみたところ、期待通りの結果は得られず。トレーニングさせることもできるようなので、そうやってやっていくしかないか...
いろいろ調べるきっかけになっていい経験だったなと思うことにしました！