AI による音楽ソース分離
Hybrid Demucs を使った楽曲のステム分離を実践解説。楽曲をボーカル・ドラム・ベスなどのトラックに分離する手順を、コード・スペクトログラム・試聴結果つきで紹介します。
目次
- 1. はじめに
- 2. 環境構築
- 3. Hybrid Demucs モデルのロード
- 4. オーディオ分離パイプラインの構築
- 4.1 分離関数の実装
- 5. スペクトログラムの可視化
- 6. ソース分離の実行
- 7. モデルの出力
- 8. スペクトログラム分析
- 9. 音声セグメントの抽出
- 10. スペクトログラムと音声の描画
- 11. ミックスのスペクトログラム
- 12. ドラム分離の結果
- 13. ベース分離の結果
- 14. ボーカル分離の結果
- 15. その他の伴奏の結果
- 16. 完全長オーディオの再生
- 17. まとめ
- 参考文献
- 1. Hybrid Demucs
- [1] Hybrid Spectrogram and Waveform Source Separation
- [2] Music Source Separation in the Waveform Domain
- 2. データセット参考文献
- [3] The MUSDB18 Corpus for Music Separation
- 3. PyTorch / Torchaudio ドキュメント
- [4] Torchaudio 公式ドキュメント
- [5] 公式 Hybrid Demucs チュートリアル
- 4. 音楽ソース分離の古典研究
- [6] Open-Unmix — A Reference Implementation for Music Source Separation
- [7] Wave-U-Net: A Multi-Scale Neural Network for End-to-End Audio Source Separation
- 5. 評価指標
- [8] BSS Eval Metrics
- 6. 音声処理のためのディープラーニング
- [9] Deep Learning for Audio Signal Processing
- [10] Fundamentals of Music Processing
- 7. さらなる学習のための推奨リソース
著者リファレンス: Sean Kim
モデルリファレンス: Hybrid Demucs(Défossez, 2021)
1. はじめに
このチュートリアルでは、Hybrid Demucs モデルを使用した音楽ソース分離の実装方法を示します。目的は、ミックスされた楽曲を以下のような構成要素(stem)に分解することです:
- ボーカル
- ドラム
- ベース
- その他の伴奏要素
完全なワークフローは次のステージで構成されます:
- Hybrid Demucs 分離モデルの初期化
- 長い音声をオーバーラップ付きチャンクに分割
- チャンク単位のモデル推論
- 全セグメントから完全長オーディオを再構築
- 分離した stem のエクスポートとスペクトログラムの可視化
Hybrid Demucs はオリジナルの Demucs アーキテクチャを拡張したバージョンです。
以下を組み合わせています:
- 波形ドメインの畳み込みモデリング
- スペクトログラムドメインの特徴学習
時間領域と周波数領域の表現を併用することで、Hybrid Demucs は従来のアプローチと比較して、はるかに自然で高忠実度なソース分離を実現します。
関連リソース:
- Hybrid Demucs 論文: https://arxiv.org/abs/2111.03600
- 公式リポジトリ: https://github.com/facebookresearch/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 final5. スペクトログラムの可視化
スペクトログラム可視化のためのヘルパー関数を定義します:
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 Audio | https://pytorch.org/audio/stable/index.html |
| ソース分離コミュニティ | https://sigsep.github.io/ |
| MUSDB データセット | https://zenodo.org/record/3338373 |
| ISMIR 学会 | https://ismir.net/ |