無料・オフライン — アップロード不要、登録不要、ファイル数・サイズ・長さの制限なしダウンロード
Back to Blog
Vocal Removal

AI による音楽ソース分離

Hybrid Demucs を使った楽曲のステム分離を実践解説。楽曲をボーカル・ドラム・ベスなどのトラックに分離する手順を、コード・スペクトログラム・試聴結果つきで紹介します。

LyRuno Team
最終更新 2026年11月3日
目次

著者リファレンス: Sean Kim
モデルリファレンス: Hybrid Demucs(Défossez, 2021)


1. はじめに

このチュートリアルでは、Hybrid Demucs モデルを使用した音楽ソース分離の実装方法を示します。目的は、ミックスされた楽曲を以下のような構成要素(stem)に分解することです:

  • ボーカル
  • ドラム
  • ベース
  • その他の伴奏要素

完全なワークフローは次のステージで構成されます:

  1. Hybrid Demucs 分離モデルの初期化
  2. 長い音声をオーバーラップ付きチャンクに分割
  3. チャンク単位のモデル推論
  4. 全セグメントから完全長オーディオを再構築
  5. 分離した stem のエクスポートとスペクトログラムの可視化

Hybrid Demucs はオリジナルの Demucs アーキテクチャを拡張したバージョンです。
以下を組み合わせています:

  • 波形ドメインの畳み込みモデリング
  • スペクトログラムドメインの特徴学習

時間領域と周波数領域の表現を併用することで、Hybrid Demucs は従来のアプローチと比較して、はるかに自然で高忠実度なソース分離を実現します。

関連リソース:


2. 環境構築

必要な依存関係をインストールします:

pip install torch torchaudio matplotlib

必要なモジュールをインポートします:

import torch
import torchaudio
import matplotlib.pyplot as plt

from IPython.display import Audio
from torchaudio.pipelines import HDEMUCS_HIGH_MUSDB_PLUS
from torchaudio.utils import _download_asset

インストール済みのバージョンを確認します:

print(torch.__version__)
print(torchaudio.__version__)

3. Hybrid Demucs モデルのロード

Torchaudio は事前学習済みの Hybrid Demucs パイプラインをすぐに使える形で提供しています:

bundle = HDEMUCS_HIGH_MUSDB_PLUS
model = bundle.get_model()

選択したモデル:

  • MUSDB18-HQ データセットで学習済み
  • 追加の専用拡張データを含む
  • 高品質な 44.1kHz オーディオ処理に最適化

モデル構成:

  • FFT サイズ: 4096
  • ネットワーク深度: 6

実行デバイスを設定します:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

sample_rate = bundle.sample_rate

print(f"Sample rate: {sample_rate}")

4. オーディオ分離パイプラインの構築

HDemucs は計算負荷が高くメモリ要求も大きいため、曲全体を一度に推論することは現実的ではありません。

実運用では長い音声を以下のように処理するのが一般的です:

  • チャンクベースのセグメント化
  • オーバーラップするウィンドウ
  • フェードイン/フェードアウトのスムージング

この戦略が必要な理由:

  • ニューラルモデルはセグメント境界付近でアーティファクトを生成しがち
  • オーバーラップ領域は不連続性や境界ノイズの低減に役立つ

処理戦略を以下に示します:


4.1 分離関数の実装

from torchaudio.transforms import Fade


def separate_sources(
    model,
    mix,
    segment=10.0,
    overlap=0.1,
    device=None,
):
    """
    Perform music source separation using chunked inference.

    Args:
        segment: Length of each audio chunk in seconds
        overlap: Overlap ratio between consecutive chunks
        device: Inference device
    """

    if device is None:
        device = mix.device
    else:
        device = torch.device(device)

    batch, channels, length = mix.shape

    chunk_len = int(sample_rate * segment * (1 + overlap))

    start = 0
    end = chunk_len

    overlap_frames = overlap * sample_rate

    fade = Fade(
        fade_in_len=0,
        fade_out_len=int(overlap_frames),
        fade_shape="linear",
    )

    final = torch.zeros(
        batch,
        len(model.sources),
        channels,
        length,
        device=device,
    )

    while start < length - overlap_frames:

        chunk = mix[:, :, start:end]

        with torch.no_grad():
            out = model.forward(chunk)

        out = fade(out)

        final[:, :, :, start:end] += out

        if start == 0:
            fade.fade_in_len = int(overlap_frames)
            start += int(chunk_len - overlap_frames)
        else:
            start += chunk_len

        end += chunk_len

        if end >= length:
            fade.fade_out_len = 0

    return final

5. スペクトログラムの可視化

スペクトログラム可視化のためのヘルパー関数を定義します:

def plot_spectrogram(stft, title="Spectrogram"):
    magnitude = stft.abs()

    spectrogram = 20 * torch.log10(
        magnitude + 1e-8
    ).numpy()

    _, axis = plt.subplots(1, 1)

    axis.imshow(
        spectrogram,
        cmap="viridis",
        vmin=-60,
        vmax=0,
        origin="lower",
        aspect="auto",
    )

    axis.set_title(title)

    plt.tight_layout()

6. ソース分離の実行

Torchaudio が公式に提供するデモ音源を使用します:

SAMPLE_SONG = _download_asset(
    "tutorial-assets/hdemucs_mix.wav"
)

waveform, sample_rate = torchaudio.load(SAMPLE_SONG)

waveform = waveform.to(device)

mixture = waveform

推論パラメータを設定します:

segment = 10
overlap = 0.1

波形を正規化します:

ref = waveform.mean(0)

waveform = (
    waveform - ref.mean()
) / ref.std()

ソース分離を実行します:

sources = separate_sources(
    model,
    waveform[None],
    device=device,
    segment=segment,
    overlap=overlap,
)[0]

sources = sources * ref.std() + ref.mean()

分離した stem を保存します:

sources_list = model.sources

sources = list(sources)

audios = dict(zip(sources_list, sources))

7. モデルの出力

デフォルトの Hybrid Demucs モデルは 4 つの stem を出力します:

Stem説明
drumsパーカッションとドラムトラック
bassベース楽器
vocalsリードおよびコーラスボーカル
other残りの伴奏

8. スペクトログラム分析

STFT パラメータを設定します:

N_FFT = 4096
N_HOP = 4

stft = torchaudio.transforms.Spectrogram(
    n_fft=N_FFT,
    hop_length=N_HOP,
    power=None,
)

9. 音声セグメントの抽出

150 秒から 155 秒の区間を抽出します:

segment_start = 150
segment_end = 155

frame_start = segment_start * sample_rate
frame_end = segment_end * sample_rate

対応するリファレンス stem をロードします:

drums_original = _download_asset(
    "tutorial-assets/hdemucs_drums_segment.wav"
)

bass_original = _download_asset(
    "tutorial-assets/hdemucs_bass_segment.wav"
)

vocals_original = _download_asset(
    "tutorial-assets/hdemucs_vocals_segment.wav"
)

other_original = _download_asset(
    "tutorial-assets/hdemucs_other_segment.wav"
)

予測セグメントを抽出します:

drums_spec = audios["drums"][:, frame_start:frame_end].cpu()
bass_spec = audios["bass"][:, frame_start:frame_end].cpu()
vocals_spec = audios["vocals"][:, frame_start:frame_end].cpu()
other_spec = audios["other"][:, frame_start:frame_end].cpu()

mix_spec = mixture[:, frame_start:frame_end].cpu()

10. スペクトログラムと音声の描画

可視化と再生のためのユーティリティ関数を定義します:

def output_results(
    original_source: torch.Tensor,
    predicted_source: torch.Tensor,
    source: str,
):

    plot_spectrogram(
        stft(predicted_source)[0],
        f"Spectrogram - {source}"
    )

    return Audio(
        predicted_source,
        rate=sample_rate
    )

11. ミックスのスペクトログラム

plot_spectrogram(
    stft(mix_spec)[0],
    "Spectrogram - Mixture"
)

Audio(mix_spec, rate=sample_rate)

12. ドラム分離の結果

output_results(
    drums,
    drums_spec,
    "drums"
)

13. ベース分離の結果

output_results(
    bass,
    bass_spec,
    "bass"
)

14. ボーカル分離の結果

output_results(
    vocals,
    vocals_spec,
    "vocals"
)

15. その他の伴奏の結果

output_results(
    other,
    other_spec,
    "other"
)

16. 完全長オーディオの再生

分離された完全な stem を聴くには、以下のコードをコメント解除します:

# Original mixture
# Audio(mixture, rate=sample_rate)

# Drums
# Audio(audios["drums"], rate=sample_rate)

# Bass
# Audio(audios["bass"], rate=sample_rate)

# Vocals
# Audio(audios["vocals"], rate=sample_rate)

# Other accompaniment
# Audio(audios["other"], rate=sample_rate)

17. まとめ

Hybrid Demucs は以下を統合しています:

  • 時間領域の畳み込みモデリング
  • 周波数領域のスペクトログラム学習

従来のソース分離アプローチと比較して、以下を提供します:

  • より高い分離忠実度
  • よりクリーンなボーカル分離
  • 伴奏の漏れの低減

このチュートリアルはさらに、以下のような実践的なエンジニアリング戦略を採用しています:

  • チャンクベースの推論
  • オーバーラップ再構築
  • フェードスムージング

これらの手法は長時間音声の推論課題に効果的に対処し、実運用シナリオに非常に適しています。

典型的な応用例:

  • AI 歌声変換
  • ボーカル抽出
  • カラオケ生成
  • 音楽リミックス
  • 自動アレンジ
  • オーディオポストプロセス

参考文献

以下の参考文献は、Hybrid Demucs、音楽ソース分離、ディープラーニングベースの音声処理をカバーしています。


1. Hybrid Demucs

[1] Hybrid Spectrogram and Waveform Source Separation

著者: Alexandre Défossez
発表: ISMIR 2021 Workshop
年: 2021

Défossez, A. (2021).
Hybrid Spectrogram and Waveform Source Separation.
arXiv preprint arXiv:2111.03600.

論文:

https://arxiv.org/abs/2111.03600

この研究は、以下を組み合わせた Hybrid Demucs アーキテクチャを提案しました:

  • 波形ドメインの畳み込み
  • スペクトログラムドメインの表現学習

現在でも現代の音楽ソース分離において最も影響力のあるアーキテクチャの一つです。


[2] Music Source Separation in the Waveform Domain

著者: Alexandre Défossez, Nicolas Usunier, Léon Bottou, Francis Bach
会議: ISMIR 2019
年: 2019

Défossez, A., Usunier, N., Bottou, L., & Bach, F. (2019).
Music Source Separation in the Waveform Domain.
Proceedings of the 20th International Society for Music Information Retrieval Conference (ISMIR).

論文:

https://arxiv.org/abs/1911.13254

この論文はオリジナルの Demucs アーキテクチャを提案し、波形ベースのエンドツーエンド音楽ソース分離を開拓しました。


2. データセット参考文献

[3] The MUSDB18 Corpus for Music Separation

著者: Zafar Rafii et al.
データセット: MUSDB18-HQ
年: 2017

Rafii, Z., Liutkus, A., Stöter, F.-R., Mimilakis, S. I.,
Bittner, R., & Pardo, B. (2017).
The MUSDB18 Corpus for Music Separation.

データセット:

https://zenodo.org/record/3338373

MUSDB18-HQ は音楽ソース分離研究で最も広く採用されているベンチマークデータセットの一つです。


3. PyTorch / Torchaudio ドキュメント

[4] Torchaudio 公式ドキュメント

PyTorch Audio Team.
Torchaudio Documentation.

ドキュメント:

https://pytorch.org/audio/stable/index.html


[5] 公式 Hybrid Demucs チュートリアル

PyTorch Audio Team.
Music Source Separation with Hybrid Demucs.

チュートリアル:

https://docs.pytorch.org/audio/stable/tutorials/hybrid_demucs_tutorial.html

本記事の実装構造と実験ワークフローは、公式チュートリアルに部分的に触発されています。


4. 音楽ソース分離の古典研究

[6] Open-Unmix — A Reference Implementation for Music Source Separation

著者: Fabian-Robert Stöter et al.
ジャーナル: Journal of Open Source Software
年: 2019

Stöter, F.-R., Liutkus, A., & Ito, N. (2019).
The 2018 Signal Separation Evaluation Campaign.
Journal of Open Source Software.

プロジェクト:

https://sigsep.github.io/open-unmix/


[7] Wave-U-Net: A Multi-Scale Neural Network for End-to-End Audio Source Separation

著者: Andreas Jansson et al.
会議: ISMIR 2017

Jansson, A., Humphrey, E., Montecchio, N.,
Bittner, R., Kumar, A., & Weyde, T. (2017).
Singing Voice Separation with Deep U-Net Convolutional Networks.

論文:

https://ismir2017.smcnus.org/wp-content/uploads/2017/10/171_Paper.pdf


5. 評価指標

[8] BSS Eval Metrics

Vincent, E., Gribonval, R., & Févotte, C. (2006).
Performance Measurement in Blind Audio Source Separation.
IEEE Transactions on Audio, Speech, and Language Processing.

論文:

https://ieeexplore.ieee.org/document/1643671

この研究は、以下を含むソース分離の古典的な評価指標を導入しました:

  • SDR(Signal-to-Distortion Ratio)
  • SIR(Signal-to-Interference Ratio)
  • SAR(Signal-to-Artifacts Ratio)

6. 音声処理のためのディープラーニング

[9] Deep Learning for Audio Signal Processing

Kellman, M., et al.
Deep Learning for Audio Signal Processing.

出版社:

Cambridge University Press


[10] Fundamentals of Music Processing

Müller, M. (2015).
Fundamentals of Music Processing.
Springer.

書籍サイト:

https://www.music-processing.de/


7. さらなる学習のための推奨リソース

トピックリソース
Demucs 公式リポジトリhttps://github.com/facebookresearch/demucs
PyTorch Audiohttps://pytorch.org/audio/stable/index.html
ソース分離コミュニティhttps://sigsep.github.io/
MUSDB データセットhttps://zenodo.org/record/3338373
ISMIR 学会https://ismir.net/