python-audio-separatorで好きなモデルを使う

tl;dr

メソッドをモンキーパッチ(?)する

import os
import logging
from audio_separator.separator import Separator
from unittest.mock import patch

# モデルが置いてあるディレクトリを指定
model_file_dir = "./model"
model_filename = "karaoke_bs_roformer_anvuew.ckpt"
# yaml_config_filename = "*.yaml" #モデルと同名.yamlを読むように変更

# 入力/出力 ディレクトリを指定
input_dir = "./original"
output_dir = "./converted"

# MDXC Params
# 他のは https://github.com/nomadkaraoke/python-audio-separator/blob/main/audio_separator/separator/separator.py あたりを見る
mdxc_params={
    "segment_size": 2800,
    "override_model_segment_size": True,
    "batch_size": 2,
    "overlap": 17,
    "pitch_shift": 0
}

# Separator.download_model_filesの置き換え先
def download_model_files(self, model_filename):
    model_type="MDXC" # モデルごとに書き換える
    model_friendly_name=model_filename
    model_path = os.path.join(self.model_file_dir, f"{model_filename}")
    yaml_config_filename=os.path.splitext(model_filename)[0] + ".yaml"

    return model_filename, model_type, model_friendly_name, model_path, yaml_config_filename


with patch('audio_separator.separator.Separator.download_model_files', download_model_files):
    # パラメタ・出力するstemについては https://github.com/nomadkaraoke/python-audio-separator?tab=readme-ov-file#full-command-line-interface-options とか。
    separator = Separator(model_file_dir=model_file_dir, output_dir=output_dir, output_format="m4a", mdxc_params=mdxc_params, output_single_stem="Instrumental")

    # モデル読み込み
    separator.load_model(model_filename=model_filename)

    # <曲名>_(Instruments).m4aにしてほしかったのでこれ。
    # separator.separate(ディレクトリ)すれば適当に全部出してくれるのでそれで良い
    for filename in os.listdir(input_dir):
        if filename.endswith(".m4a") or filename.endswith(".wav"):
            input_path = os.path.join(input_dir, filename)
            name_without_ext = os.path.splitext(filename)[0]
            custom_names = {
                "Instrumental": f"{name_without_ext}_(Instruments)"
            }

            print(f"処理中: {filename} ...")
            out_filename = separator.separate(input_path, custom_names)

どうも.yamlのinference:部分より小さい値は無視されるっぽいので注意する。

あと、Overlayを大きくすればそのぶん処理に時間がかかると思ったら、そうでもないらしい。
desired_step = int(self.overlap * self.model_data_cfgdict.audio.sample_rate)

結果

一括処理+batch_sizeの設定 ができて良い

コメント

タイトルとURLをコピーしました