spleeterをインストールしなおしてハマったこと

LinuxマシンのSSDが死んだため、以前入れていたspleeterをインストールしなおしました。

今回はcondaを使わずインストールしましたが、いくつかハマったのでメモしておきます。

インストール

前回はよく分からないままcondaを使ってしまいましたが、今回はcondaを使いません。 spleeterの文書でもcondaを使うインストールを今は推奨はしていないと書かれていますね。

何も問題がなければ、インストールそのものは簡単にできます:
sudo apt-get install ffmpeg libsndfile
pip3 install spleeter

python 3.6 から 3.8でのみ動く

spleeterはtensorflow 2を使っている都合上、tensorflow 2が対応しているpythonのバージョンに合わせる必要があります。

システムのpythonが3.9だったので、pyenvで3.8系をインストールしました

libffi-devが入っていないままpythonをbuildした

ライブラリが足りないままpyenvでpythonをbuildすると、いくつかのpythonパッケージのインストールを失敗します。

No module named ‘_ctypes’はあるあるらしいので楽です。これはlibffi-devが足りない場合とのこと。

Collecting librosa==0.8.0
  Using cached librosa-0.8.0.tar.gz (183 kB)
    ERROR: Command errored out with exit status 1:
     command: /usr/local/share/pyenv/versions/3.7.11/bin/python3.7 -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-bkk_rj_j/librosa_0f3f722998da450883b6b6a7b4bafb22/setup.py'"'"'; __file__='"'"'/tmp/pip-install-bkk_rj_j/librosa_0f3f722998da450883b6b6a7b4bafb22/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-ho46vo6j
         cwd: /tmp/pip-install-bkk_rj_j/librosa_0f3f722998da450883b6b6a7b4bafb22/
    Complete output (11 lines):
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/share/pyenv/versions/3.7.11/lib/python3.7/site-packages/setuptools/__init__.py", line 19, in 
        from setuptools.dist import Distribution
      File "/usr/local/share/pyenv/versions/3.7.11/lib/python3.7/site-packages/setuptools/dist.py", line 34, in 
        from setuptools import windows_support
      File "/usr/local/share/pyenv/versions/3.7.11/lib/python3.7/site-packages/setuptools/windows_support.py", line 2, in 
        import ctypes
      File "/usr/local/share/pyenv/versions/3.7.11/lib/python3.7/ctypes/__init__.py", line 7, in 
        from _ctypes import Union, Structure, Array
    ModuleNotFoundError: No module named '_ctypes'

ということで、libffi-devをインストールしてpythonをインストールしなおします。

pyenv uninstall 3.8.11
sudo apt-get install libffi-dev 
pyenv install 3.8.11
pyenv local 3.8.11
python3.8 -m pip install --upgrade pip
pip3 install spleeter
python3.8 -m pip install --upgrade pip

はpip3を使うたびに「新しいpipがあるからupgradeしろ」と言われるので入れています。

liblzma-devが入ってないままpythonをbuildした

これもライブラリが足りないままpythonをbuildしたために起こるエラーです。

上と違うのはspleeterのインストールは成功したのに、実際にspleeterを使う段でエラーになる点です。

spleeter separate  -p spleeter:5stems -o output fuga.mp3 
/usr/local/share/pyenv/versions/3.8.11/lib/python3.8/site-packages/pandas/compat/__init__.py:120: UserWarning: Could not import the lzma module. Your installed Python is incomplete. Attempting to use lzma compression will result in a RuntimeError.
  warnings.warn(msg)

これはlibzma-devが足りない例です。

対処は上記の場合と同様に足りないライブラリをシステムにインストールしてからpythonをbuildしなおしです:

pyenv uninstall 3.8.11
sudo apt-get install liblzma-dev 
pyenv install 3.8.11
pyenv local 3.8.11
python3.8 -m pip install --upgrade pip
pip3 install spleeter