0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ボーカル分離の品質をどう評価するか:時間合わせ、SI-SDR、聴感チェック

0
Posted at

はじめに

ボーカル分離のデモは、意外と簡単に「成功したように」見せられます。原曲と伴奏を順番に再生して、歌声が小さくなっていれば、それだけで十分に感じるからです。

ただし、実際に使えるかどうかは別の話です。歌詞が数語だけ残る、ドラムのアタックが削れる、リバーブだけが広がって残る、といった問題は短い試聴では見落としやすいです。

先に立場を明記しておくと、私は Online Vocal Remover の開発者です。この記事は独立した製品レビューではなく、開発中の確認作業で使っている評価手順を、一般化してまとめたものです。

まず「何に使うか」を決める

同じ分離結果でも、用途によって合格ラインは変わります。

  • 個人練習用のカラオケ
  • 耳コピや楽器練習
  • リミックスの下処理
  • データセット作成
  • 公開・配布を前提とした制作

練習用なら少量の残響が許容できても、再配布する素材や学習データでは問題になることがあります。評価指標を見る前に、用途を決めておくほうが判断しやすくなります。

今回使った小さなテスト

著作権の問題を避けるため、テストには自分で用意したAI生成音源を使いました。長さは18.05秒です。

「ボーカル」は中央定位の合成メロディで、190msのエコーを加えています。伴奏はステレオのコードと短いリズムパルスです。周波数の重なりと残響を入れたので完全に簡単な素材ではありませんが、商用曲のマスタリング済み音源よりはかなり単純です。

この1回では、処理開始から結果画面の表示まで約51秒でした。これは18秒のファイルを処理したときの観測値であり、他のファイルでも同じ速度になるという意味ではありません。

出力はボーカルと伴奏の2本のMP3でした。参照用のWAVステムと比較すると、出力は25.06ms遅れていました。この差を直さずに波形を比較すると、分離品質ではなく単なる時間差を誤差として数えてしまいます。

1. 指標を計算する前に時間を合わせる

相互相関を使うと、参照信号と推定信号のずれを探せます。以下はモノラル信号を想定した最小例です。

import numpy as np
from scipy.signal import correlate


def align_by_xcorr(reference: np.ndarray, estimate: np.ndarray):
    reference = reference.astype(np.float64)
    estimate = estimate.astype(np.float64)

    corr = correlate(estimate, reference, mode="full", method="fft")
    lag = int(np.argmax(corr) - (len(reference) - 1))

    if lag >= 0:
        aligned = estimate[lag:]
    else:
        aligned = np.pad(estimate, (-lag, 0))

    if len(aligned) < len(reference):
        aligned = np.pad(aligned, (0, len(reference) - len(aligned)))

    return aligned[:len(reference)], lag

ステレオの場合は、左右を同じ条件でそろえるか、評価目的に合わせてチャンネルごとに処理します。サンプルレートが異なるファイルは、先に同じサンプルレートへ変換する必要があります。

2. SI-SDRは「近さ」を見るための一つの指標

SI-SDR(Scale-Invariant Signal-to-Distortion Ratio)は、推定信号の音量差を調整したうえで、参照信号に対する歪みを評価します。

def si_sdr(reference: np.ndarray, estimate: np.ndarray, eps=1e-12):
    reference = reference.astype(np.float64)
    estimate = estimate.astype(np.float64)

    reference = reference - reference.mean()
    estimate = estimate - estimate.mean()

    scale = np.dot(estimate, reference) / (
        np.dot(reference, reference) + eps
    )
    target = scale * reference
    error = estimate - target

    return 10 * np.log10(
        (np.sum(target ** 2) + eps) /
        (np.sum(error ** 2) + eps)
    )

相関係数も併せて確認しました。ただし、相関係数は音質の知覚を直接表すものではありません。短いクリックノイズや、重要な歌詞が一瞬残る問題を高い相関値が隠すこともあります。

3. このテストで得られた値

時間を合わせた後の結果は次のとおりでした。

比較対象 SI-SDR 相関係数
ボーカル出力 vs. ボーカル参照 29.93 dB 0.9995
伴奏出力 vs. 伴奏参照 27.65 dB 0.9991
2本の出力を再合成 vs. 入力ミックス 31.02 dB 0.9996

このテスト素材に限れば、2本の出力は参照ステムにかなり近く、再合成した信号も入力ミックスに近い結果でした。

ただし、これは「どんな曲でも同じ結果になる」ことを示していません。合成メロディには歌手の子音、複数のコーラス、強いマスタリング、複雑な部屋鳴りがありません。実際の楽曲では、ボーカルとギターやシンセサイザーが同じ周波数帯に重なり、リバーブがステレオ全体へ広がります。

4. 最後は聴いて確認する

数値を出した後、私は次の点を順番に聴きます。

  1. 歌詞が判別できる形で残っていないか
  2. リバーブの尾やコーラスだけが浮いていないか
  3. ドラム、シンバル、ギターなどが削れていないか
  4. 静かな部分と大きな部分で品質が急に変わらないか
  5. 最終用途で本当に使えるか

「ボーカルが小さい」ことと「伴奏として自然に使える」ことは同じではありません。金属的な響きや空洞感が強ければ、除去量が大きくても実用上は失敗です。

5. 再合成も確認する

ボーカル出力と伴奏出力を足し戻し、入力ミックスと比較する方法も役立ちます。

再合成で大きな差が出る場合は、位相、ゲイン、エンコード、切り詰め、時間ずれなどを疑えます。ただし、再合成が入力に近くても、各ステムの分離が正しいとは限りません。ある音が間違ったステムに入っていても、足し戻せば元に戻る場合があるためです。

そのため、次の3つを分けて見る必要があります。

  • 各ステムが参照に近いか
  • 2本を足したとき入力に戻るか
  • 実際に聴いて用途に耐えるか

まとめ

音源分離の評価は、SI-SDRを1回計算して終わりではありません。

  1. 権利を確認できる素材と、可能なら参照ステムを用意する
  2. サンプルレート、チャンネル数、長さをそろえる
  3. 時間ずれを測って補正する
  4. SI-SDRや相関係数を計算する
  5. 再合成を確認する
  6. 歌詞残り、残響、楽器損傷を実際に聴く
  7. 用途ごとの基準で合否を決める

参照ステムがない市販曲では、客観評価には限界があります。その場合は、複数箇所を聴き、問題の種類を具体的に記録するほうが、単に「きれいだった」と書くより再現性があります。

開示: 私は Online Vocal Remover の開発者です。自分が権利を持つ音源、または処理許可を得た音源だけを使用してください。処理結果は曲のミックスによって変わります。

ブラウザ上でボーカルと伴奏を分け、結果を試聴したい場合は、Online Vocal Remover で確認できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?