LoginSignup
9
6

5分で動かせる!Pythonで音源分離(demucs)

Last updated at Posted at 2023-09-25

demucsって?

2021年4月ごろに、facebookのメタ研究チームが開発した音源分離ライブラリです。これまでspleeterなども提供されていましたが、畳み込みニューラルネットワーク(CNN)を使ったモデルとして最近注目されています。

ただ、ライブラリの細かいメソッドが紹介されているドキュメントはまだ用意されておらず、現状、使い方の参考となっているのはこのGitHubリポジトリのリードスのみなのです。

やること

すでに多くのライターがdemucsについて紹介していますが、Pythonスクリプト(かつmacOS)で紹介しているものは少なかった気がするので、今回は開発環境の構築からスクリプトでの実行まで紹介できればと思います。

環境構築

まずは環境を作っていきます。今回は以下の環境で作成していきます。pythonとpythonのパッケージマネージャーが用意できていれば大丈夫です。pipenv以外でも構いませんが、condaなどは対応していない可能性があります。細かいセットアップは別の記事を参考にしてみてください。

  • Mac OS Ventura 13.5.2
  • チップ:Apple M1
  • 実行環境:pipenv(Python 3.11.3)

テキトーにディレクトリを作って、環境を用意します。

$ mkdir demucs
$ cd demucs
$ pipenv install --python 3.11.3(最新ver)

pipenvを使ってらっしゃる場合、Githubに今回使う環境のリポジトリを用意しておきましたのでもしよければ使ってみてください。事前にpipenvをインストールしておく必要があります。

$ git clone https://github.com/pdmuds4/demucs-test (もしくはDL&unzip)
$ cd demucs-test
$ pipenv install

demucsを動かそう

ライブラリをインストールします。

$ pip install demucs

実行コードを書きます。ベースとなるプログラムはたったこれだけです。
optionsについて説明してきます。

test_demucs.py
import demucs.separate

options = []
demucs.separate.main(options)

options

簡単に言うと、コマンドラインで実行する時のコマンドを入れるだけです。
環境下のターミナルで確認できます。以下、重要な要素だけ紹介します。

$ demucs -h
...
positional arguments:
  tracks                Path to tracks
options:
  -n NAME, --name NAME  Pretrained model name or signature. Default is htdemucs.
  --two-stems STEM      Only separate audio into {STEM} and no_{STEM}.
  --int24               Save wav output as 24 bits wav.
  --float32             Save wav output as float32 (2x bigger).
  --flac                Convert the output wavs to flac.
  --mp3                 Convert the output wavs to mp3.

tracks

分離する音源のファイルパスです。これは必須なので入れておきましょう。
macOSは.mp3だとエラーを吐いてしまうので、ffmpegで.wavに変換してから使うことを推奨します。

test_demucs.py
options = ["sample/no_vocal.wav"]

-n NAME

使用するモデルの名前です。demucsにはいくつかの分離モデルを使用できるようになっており、ここで設定できます。何も指定がない場合は、デフォルトのhtdemucsが使用されます。

分離モデル名 説明
htdemucs デフォルトのモデル。[two-stems](#--two-stems STEM)がなければbassdrumvocalotherの4種類に分類する。
htdemucs_ft 微調整版、4倍の時間がかかるが、精度は高くなる。
htdemucs_6s 加えてpianoguiterに分類する。あまり精度は良くない。
hdemucs_mmi 旧モデル
mdx コンテスト用に作成されたモデル。優勝したらしい。
mdx_extra 追加のトレーニングデータを含むモデル。2位にランクイン。
mdx_q 軽容量化モデル。品質が悪くなる可能性がある。

こんな感じで設定します。

test_demucs.py
options = ["sample/on_vocal.wav",
           "-n", "htdemucs"]

--two-stems STEM

これを入れると、vocalotherの2種類に分類します。STEMには、分離後のファイル名(`vocal -> {STEM} / other -> no_{STEM})を設定できます。

test_demucs.py
options = ["sample/on_vocal.wav",
           "-n", "htdemucs",
           "--two-stems", "vocal"]

--int24

24bitの.wavファイルで出力します。

--float32

32bitの浮動小数点数で.wavファイルを出力します。
--int24よりもサイズが2倍になります。

--flac

.flacファイルで出力します。

--mp3

.mp3ファイルで出力します。



以下同様でこんな感じです。

test_demucs.py
options = ["sample/on_vocal.wav",
           "-n", "htdemucs",
           "--two-stems", "vocals",
           "--mp3"]

結果

実行すると、こんな感じでカレントディレクトリ直下にseparatedディレクトリが作成され、モデル・曲名ごとに分割されます。

$ cd separated
$ tree .
.
├── htdemucs
│   ├── music1
│   │   ├── bass.wav
│   │   ├── drums.wav
│   │   ├── other.wav
│   │   └── vocals.wav
│   ├── music2
│   │   ├── no_vocals.mp3
│   │   └── vocals.mp3
└── htdemucs_6s
    └── music3
        ├── no_vocals.mp3
        └── vocals.mp3

最後に

再生ディスプレイを埋め込めないので視聴はできませんが...^^;
代わりにさっき紹介したリポジトリに実行結果の音声ファイルも入ってるのでよかったら聞いてみてください。また、引数にオプションをつけると動く関数も用意してみたので(function_demucs.py)使ってみてください。

参考

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6