DemucsとPyQtでアプリ化

Demucsを使って音声ファイルからボーカルやベース、ドラムを分離するアプリを作りました。

音楽ファイルからボーカルや楽器を分離できる「Demucs」はコマンドツールやGUI付きツールが出回っていますが、今回はDemucsをPythonで呼び出し、GUIアプリとしてPyQtを使って構築してみました。
Tkinterが標準ですけどMacには古いバージョンが入っていて競合でうまく動作しなかったり画面もちょっと古臭いので今回はPyQt5を使います。
Qtは昔、細胞画像解析でも使っていたので正直「まだ残ってるんだ」という印象です。

さてDemucsの分離モデルには大きく2種類あり、「2分離モデル」と「4分離モデル」が存在します。
2分離モデルではボーカルと伴奏の2つに分かれ、separate_audio_file()メソッドの戻り値がタプル(テンソルとサンプリングレート)になります。
一方、4分離モデル(例: htdemucs)はボーカル・ドラム・ベース・その他の4つに分かれ、戻り値は辞書型となります。
ここがプログラム実装時に結構ハマった部分で、モデルによって返り値の型が異なるため、柔軟性をもたせるには型を確認した上で適切に処理を分岐する必要があります。
対策としては返り値の型をisinstance()で判定し、タプルなら2分離、辞書なら4分離として処理を分ける形です。

アプリ化は今回もPyInstallerを使用しました。
DemucsはPyTorch Hub経由でモデルファイルをダウンロード・キャッシュする仕組みが本来のため、通常、ユーザーのキャッシュディレクトリ(例: macOSなら~/Library/Caches/torch/hub/checkpoints/)に保存されます。
ただせっかくローカルで動作するのですからモデルファイルもアプリ内に持って環境依存しない形にしました。

実際にはfiles.txtやhtdemucs.yamlといった設定・管理ファイルを同梱した上で、モデルファイルのダウンロード抑制の工夫が必要でした。
Demucsは初回実行時、必要なモデルファイルや設定ファイルを自動的にインターネット経由でダウンロードしようとするためです。
files.txtやhtdemucs.yamlなどの設定ファイルにはモデルのパラメータや分離方法の定義が記載されており、欠落していると分離処理が正常に動作しません。
加えて、htdemucsモデル本体(yaml記載のランダムIDに基づく命名-xxx.thのようなファイル)も同梱し、PyTorch Hubのキャッシュディレクトリやアプリのリソースフォルダに配置しておくことで、実行時の自動ダウンロードを抑制できます。

また、DemucsやPyTorch、NumPyなどの依存ライブラリのバージョンにも注意が必要です。
特にNumPyは2.x系ではなく1.x系を使うことが推奨されており、「pip uninstall numpy」の後に「pip install “numpy<2"」でダウングレードする必要がありました。 他の音声処理系ライブラリと併用する場合は競合してしまいそうな部分ですが。 すでに既存のUI付きのがあるので需要はないと思いますが、自分で使うには便利にはなりそうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)