Spleeterを使って楽曲を楽器別に分離する

# はじめに
普段音楽を聞いていて「この曲ボーカルだけ抜き出して聞いてみたい」とか、反対に「ボーカルを削除して聞いてみたい」と思うことがあります。  
本記事では、そんな願いを叶えてくれるツール「Spleeter」の使い方について記載します。

# Spleeterとは
[Spleeter](https://github.com/deezer/spleeter)は、AI技術を用いた音源分離ツールです。  
大量の楽曲を学習したモデルに楽曲ファイルを与えることで、最大5種類の楽器に分離してくれます。
* ボーカル
* ドラム
* ベース
* ピアノ
* その他
  * ギター、シンセサイザ、効果音etc...

Spleeterは無料で使えますが、iZotope社のRX8に代表されるプロ仕様のソフトウェアにも組み込まれており、品質の高さが伺えます。

# インストール手順
基本的に[公式のインストール手順](https://github.com/deezer/spleeter/wiki/1.-Installation)に則って構築しました。  

## 前提
以下環境にインストールを行っていきます（Python, pipはインストールされていることを前提とします）。

| ソフト | バージョン |
| ---- | ---- |
|  OS  | Windows 11     |
|  Python    |   3.10.11   |
|  pip    |   23.0.1   |

## 依存ライブラリのインストール
Spleeterで音源分離を行うにあたり「ffmpeg」が必要となります。  
以下の記事を参考にインストールを行ってください。  
[WindowsにFFmpegをインストールする](https://self-development.info/windows%e3%81%abffmpeg%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b/)

最終的にコマンドプロンプトで`ffmpeg`コマンドが実行できればOKです。  
```
> ffmpeg -version
ffmpeg version N-110972-gbaa9fccf8d-20230601 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf)
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230601
libavutil      58. 12.100 / 58. 12.100
libavcodec     60. 16.100 / 60. 16.100
libavformat    60.  5.100 / 60.  5.100
libavdevice    60.  2.100 / 60.  2.100
libavfilter     9.  8.101 /  9.  8.101
libswscale      7.  3.100 /  7.  3.100
libswresample   4. 11.100 /  4. 11.100
libpostproc    57.  2.100 / 57.  2.100
```

## Spleeterのインストール
Spleeterはpipでインストールすることができます。  
具体的には、コマンドプロンプトで以下のコマンドを実施するだけです。  
```
> pip install spleeter
```

インストール後は、`spleeter`コマンドが実行できることを確認してください。
```
> spleeter --version
Spleeter Version: 2.3.2
```

# 実際に分離してみる
それでは実際に音源分離を行っていきます。  
Spleeterの実行方法は「CLI」と「Pythonライブラリ」の2通りが用意されていて、それぞれについて説明します。  

## 準備
分離用のサンプル音源が公開されているので、以下リンクよりダウンロードします。
https://github.com/deezer/spleeter/raw/master/audio_example.mp3

## CLI編
以下のコマンドを実行して、音源を分離することができます。
```
> spleeter separate -p spleeter:5stems -o output-cli audio_example.mp3
```

`-p`オプションで音源分離のモードを指定します。  
どのように分離したいかによって、以下の通り指定を変更してください。  
* `spleeter:2stems`
  * ボーカル/伴奏に分離されます。
* `spleeter:4stems`
  * ボーカル/ベース/ドラム/その他に分離されます。
* `spleeter:5stems`
  * ボーカル/ベース/ピアノ/ドラム/その他に分離されます。

実行が成功すると、以下のように楽器別に分離されたwavファイルが出力されています。
```
> ls .\output-cli\audio_example\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023/08/21     17:45        1919406 bass.wav
-a----        2023/08/21     17:45        1919406 drums.wav
-a----        2023/08/21     17:45        1919406 other.wav
-a----        2023/08/21     17:45        1919406 piano.wav
-a----        2023/08/21     17:45        1919406 vocals.wav
```

## Python編
以下のPythonコードで音源分離が可能です。
```python
from spleeter.separator import Separator

if __name__ == '__main__':
    # インプット音源ファイルを指定
    input_file = "./audio_example.mp3"
    # 分離モードを指定
    separator = Separator("spleeter:2stems")

    # インプットファイルと出力ディレクトリを指定して分離実行
    separator.separate_to_file(input_file, "./output-python")
```

私の環境の場合、`if __name__ == '__main__':`が無いとエラーとなり実行できませんでした。  
[公式GitHubのIssue](https://github.com/deezer/spleeter/issues/104)を参考に解決することができました。

# 感想
出力された音源を試聴したところ、概ね楽器別に分離されているなぁという印象でした。  
「概ね」というのは、別楽器の音が紛れ込んでいたり音質が悪いと感じるところもあったためです。  
ただ今後より多くのデータを学習することで改善が期待できることから、まだまだ発展途上のツールと言えそうです。

# 余談
Apple Musicには「Apple Music Sing」という機能があり、楽曲のボーカル音量を調整してカラオケを楽しむことができます。  
この機能にSpleeterが使われているのではと思い調べてみたのですが、関係はないとのことでした。
https://github.com/deezer/spleeter/issues/812
```
We've not been involved at all on this, nor in touch with folks at cupertino. 
I believe they are running their own model, tailored for their hardware.

私たちはこの件にはまったく関与していないし、クパチーノの人々とも連絡を取っていない。
彼らは自分たちのハードウェアに合わせた独自のモデルを運営していると思う。
```

今後より色んなところで開発が進んで、品質が上がっていけばよいなと思いました！