@pandesu04

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

BPMと構成が違うRemixを、原曲MVになるべくリップシンクさせたい

【質問】BPMと構成が違うRemixを、原曲MVになるべくリップシンクさせたい
DJミックス用に、Remix音源(mp3)に対して原曲の公式MV映像を自動で同期させ、歌っている区間で口の動きが合うようにするツールを作っています。原曲そのままのEdit版はうまく同期できるのですが、BPMと曲構成が変わったRemixで精度が出ず、アプローチについて知見をいただきたいです。
やりたいこと

Remixの音声タイムライン上の各時刻を、原曲MVのどの時刻に対応させるかを推定し、MV側を切り出し・時間伸縮して並べる
歌唱区間はリップシンク(口パク一致)、ドロップ/インスト区間は別映像に逃がす
前提となる難しさ

Remixは原曲とテンポが違う(しかも一定とは限らず、ハーフタイム区間やビルド/ドロップで揺れる)
構成が組み替えられている(サビの反復・順序入れ替え・原曲に無いセクションの追加)
ただし多くのRemixは原曲ボーカル(アカペラ)をそのまま流用している
現状のアプローチ

Demucsでremixと原曲MVそれぞれからボーカルstemを分離
ボーカルの振幅包絡(フレームRMS, ~50fps)を作り、数秒チャンクごとに正規化相互相関で原曲側の対応位置を探索
全体のテンポ比(remix BPM / 原曲 BPM)で原曲ボーカルを一律time-stretchしてから相関
一致した区間はMVを setpts で伸縮して配置、信頼度の低い区間はフィラー映像
うまくいかない点

テンポ比が一定でない(区間ごとに伸縮率が変わる)ため、一律stretchだと後半でズレる
構成の組み替えで時系列が非単調になり、単純な相互相関だと誤対応する
リップシンクとしてはフレーム精度(±数十ms)の単調な対応が欲しいが、そこまで詰められない
質問

テンポ・構成が異なる音源間の audio-to-audio アライメント の定番手法は何でしょうか? chroma/MFCC + DTW(特に subsequence DTW / partial matching)がこの用途に向いていますか?
ボーカルstem同士で合わせる場合、包絡相関よりも DTWやビート同期特徴量 のほうが頑健ですか?区間ごとに可変なテンポへの対応はどう設計するのが定石でしょうか?
構成が組み替えられている(非単調・繰り返しあり)ケースで、誤対応を防ぎつつ部分一致を拾うための実装上のコツやライブラリ(librosa, madmom, sync-toolbox 等)があれば教えてください。
「映像のリップシンク」という最終目的に対して、フレーム精度の対応付けを得るための後段処理(局所的な微調整、位相そろえ)の知見があればぜひ。
環境はPython(librosa, scipy, Demucs, ffmpeg)です。アプローチ自体の方向性が間違っていれば、その指摘も歓迎します。

0 likes

2Answer

方向性としてはかなり正しいです。ただ、現状の「振幅包絡 + 相互相関」は、まさに今回の問題(可変テンポ・構成変更・繰り返し)に弱い特徴量を使っているので、精度の壁に当たっているように見えます。

この手の問題は音楽情報検索(MIR)では audio synchronization / cover song alignment / score following に近く、定番はやはり 特徴量 + DTW系 です。

結論から言うと、

「Remixボーカル → 原曲ボーカル」の対応付けを作りたいなら、

Demucs → Vocal stem → 音素/歌唱特徴量 → multi-scale DTW → 局所補正

の構成が一番精度が出そうです。

特に「原曲ボーカル流用Remix」という前提はかなり有利です。

なぜ包絡相関が厳しいのか

RMS包絡は

母音が続くと平坦
歌詞情報を持たない
テンポ変化に弱い
ドラム被りで汚れる

ため、

「あーーー」

「おーーー」

がほぼ同じ形になります。

リップシンクしたいなら、

どの音節が歌われているか

を識別できる特徴量が欲しいです。

第一候補:MFCC + DTW

まず最も定番。

mfcc = librosa.feature.mfcc(
y=vocal,
sr=sr,
n_mfcc=20
)

で特徴量を作る。

距離

cosine_distance

または

euclidean

を使って DTW。

librosa なら

from librosa.sequence import dtw

D, wp = dtw(
X=mfcc_remix,
Y=mfcc_original,
metric="cosine"
)

MFCCは

テンポ変化に比較的強い
EQ変化に強い
Remix処理に強い

ので包絡よりかなり改善します。

さらに良い:Chromaではなく Vocal Features

一般的な音楽同期では

Chroma + DTW

が定番ですが、

今回は

歌詞同期

が目的です。

なので実はChromaは微妙。

理由:

Remixで

キー変更
ピッチシフト
ハーモナイズ

される可能性がある。

むしろ

MFCC

Mel spectrogram

の方がボーカル同期には向いています。

ベストに近い:Wav2Vec2 / HuBERT特徴量

最近の研究だと、

歌声同期は

MFCC
Chroma

より

HuBERT
Wav2Vec2
Whisper encoder

特徴量がかなり強いです。

例えば

facebook/hubert-base-ls960

から

hidden_states

を取り出して

T x 768

特徴量列にする。

すると

同じ歌詞
異なるテンポ
異なる音程
異なるミックス

でも一致しやすい。

実際かなり効きます。

可変テンポ対応

ここはDTWの本領です。
DTWは
1秒 → 0.8秒
1秒 → 1.4秒
みたいな局所伸縮を吸収できます。
つまり

原曲 BPM 128
Remix BPM 150

でも問題ない。

あなたの

BPM比で一律stretch

はむしろ不要になります。

理想的には

feature extraction

cost matrix

DTW

warping path

だけで十分。

しかし普通のDTWだけでは壊れる

Remixだと

Verse
Chorus
Verse
Drop

Verse
Drop
Chorus
Chorus

みたいになる。

ここで普通のDTWを使うと

強制的に単調対応を作るため、

誤マッチします。

subsequence DTW

ここで使う。

sync-toolboxにもあります。

考え方:

Remix区間

原曲全体のどこか

を探す。

つまり

local alignment

です。

例えば

Remixを

8秒〜12秒

の窓に分け、

それぞれ

原曲のどこに一致するか

を探す。

実務的には HMM 化する

私ならこうします。

Step1

Remixを

5秒

窓で分割

Step2

各窓について

top_k_matches

取得

Window 32

原曲 41.2s
score 0.92

原曲 102.8s
score 0.89

原曲 181.4s
score 0.87
Step3

Viterbi

または

networkx

全体として最も自然な経路

を選ぶ

すると

サビ反復
Verse再利用

にも強い。

sync-toolbox はかなり有力

おすすめです。

特に

Sync Toolbox

Chroma
onset
multiscale DTW

が実装済み。

論文ベース。

考え方も近い。

粗同期

局所DTW

高解像度補正

をやっています。

リップシンク精度を出す後段

ここが重要。

DTWだけだと

100〜300ms

程度の誤差が残る。

口パクは厳しい。

私なら二段階にします。

粗同期

HuBERT + DTW

±200ms

程度

微調整

音節レベル

具体的には

ボーカルstemから

spectral_flux

onset_strength

を計算。

歌唱の

子音開始

は強いピークになる。

例えば

k
t
p
s

など。

これを局所相関。

±500ms

範囲で探索。

結果

DTW

子音ピーク合わせ

になる。

さらに本気でやるなら Forced Alignment

歌詞が取得できるなら、

双方に対して

Whisper

forced alignment

をかける。

例えば

WhisperX
MFA (Montreal Forced Aligner)

など。

すると

"love"
2.53s

"is"
2.82s

"you"
3.14s

みたいな単語境界が得られる。

Remixと原曲で

同じ単語

を対応させる。

リップシンク精度としてはこれが最強です。

もし自分が組むなら

最終的にはこうします。

Demucs

Vocal stem


HuBERT feature


subsequence DTW


候補区間抽出


Viterbi/HMMで
全体経路推定


局所DTW


子音ピーク合わせ


映像warp

この構成なら、

BPM変化
ハーフタイム
サビ反復
構成変更

にかなり耐えられます。

特に現状の「RMS包絡 + BPM比stretch」から改善するなら、まずは 「ボーカルstem → HuBERT特徴量 → subsequence DTW」 を試す価値が高いです。ここだけでも同期精度はかなり上がるはずです。

1Like

Comments

  1. @pandesu04

    Questioner

    解答ありがとうございます!!良ければTwitter等で質問してもろよろしいでしょうか?

ボーカル部分が地声や録音なら無理ですが
自身で生成しているのであればそのアプリからリップシンクデータ(Lab)が出るのでそれで同期させれば良いです
リミックスだったら曲毎に先頭位置からの相対値でできそうですがどうしょうか?

0Like

Your answer might help someone💌