python-audio-separatorで歌声のボーカルを抽出する

初めに

以下で歌声の音源からボーカルを抽出していました

ayousanz.hatenadiary.jp

改めて調査するとより多くのモデルと精度の高いモデルが選べるのものがあり、ローカル環境でも動くようになっていたので触っていきます

github.com

開発環境

環境構築

uv venv -p 3.12
.venv/Scripts/activate

必要なライブラリのインストールします

uv pip install "audio-separator[gpu]"
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu124 --force-reinstall

使用できるモデルの取得

使用できるモデルの一覧の表示やボーカルに特化した精度の高いものをCLIから取得できます。

以下にて、ボーカルの抽出において精度の高いものを取得することができます

audio-separator -l --list_filter=vocals --list_limit=5

こちらを実行すると以下のような情報が得られます

2025-05-17 17:32:15,454 - INFO - separator - Using model directory from model_file_dir parameter: /tmp/audio-separator-models/
-----------------------------------------------------------------------------------------------------------------------------------------
Model Filename                      Arch  Output Stems (SDR)     Friendly Name
-----------------------------------------------------------------------------------------------------------------------------------------
vocals_mel_band_roformer.ckpt       MDXC  vocals* (12.6), other  Roformer Model: MelBand Roformer | Vocals by Kimberley Jensen
melband_roformer_big_beta4.ckpt     MDXC  vocals* (12.5), other  Roformer Model: MelBand Roformer Kim | Big Beta 4 FT by unwa
mel_band_roformer_kim_ft_unwa.ckpt  MDXC  vocals* (12.4), other  Roformer Model: MelBand Roformer Kim | FT by unwa
melband_roformer_big_beta5e.ckpt    MDXC  vocals* (12.4), other  Roformer Model: MelBand Roformer Kim | Big Beta 5e FT by unwa
MelBandRoformerBigSYHFTV1.ckpt      MDXC  vocals* (12.3), other  Roformer Model: MelBand Roformer Kim | Big SYHFT V1 by SYH99999

ただし今回は 上記のものよりもさらに精度が高いと言われている mel_band_roformer_karaoke_becruily.ckpt を使っていきます

CLIからボーカルを抽出

以下にて指定した音源からボーカルを抽出およびボーカルの音声のみを出力することができます

audio-separator --model_filename mel_band_roformer_karaoke_becruily.ckpt --output_format=MP3 --single_stem=Vocals 'test.mp3'

Pythonから実行

以下のコードにてPythonスクリプトから処理することができます

from audio_separator.separator import Separator
import logging

# --- 設定項目 ---
input_audio_file = r'.\test.mp3'
model_name = 'mel_band_roformer_karaoke_becruily.ckpt'
output_audio_format = 'MP3'
stem_to_output = 'Vocals'

# Separatorクラスを初期化
separator = Separator(
    output_format=output_audio_format,
    output_single_stem=stem_to_output,
    log_level=logging.INFO
)

# モデルをロード
try:
    separator.load_model(model_filename=model_name)
    print(f"モデル '{model_name}' のロードに成功しました。")
except Exception as e:
    print(f"モデルのロード中にエラーが発生しました: {e}")
    exit()

# オーディオ分離処理を実行
print(f"オーディオファイル '{input_audio_file}' の分離を開始します...")
try:
    output_files = separator.separate(input_audio_file)
    if output_files:
        print(f"分離が完了しました。出力ファイル:")
        for file_path in output_files:
            print(f"- {file_path}")
    else:
        print("分離処理は実行されましたが、出力ファイルはありませんでした。")
except Exception as e:
    print(f"オーディオ分離処理中にエラーが発生しました: {e}")