HuBERT+subseq DTW+Viterbi+Forced Alignmentまで実装しても、別アレンジRemixの後半でリップシンクが崩れる
以前こちらで BPMと構成が違うRemixのリップシンク について質問し、回答いただいた構成(Demucs → HuBERT → subsequence DTW → Viterbi → 局所DTW → 子音ピーク合わせ → 映像warp)をほぼそのまま実装しました。さらに Forced Alignment(faster-whisperの単語タイムスタンプ)と multi-scale DTW も追加しています。
おかげで原曲Edit版や、テンポが素直なRemixはかなり合うようになったのですが、構成を激しく組み替えたRemixの「後半」だけ、どうしても崩れます。その原因切り分けと、定番の対処を伺いたいです。
実装済みのパイプライン
Demucs で remix / 原曲MV 双方からボーカルstem分離
HuBERT(facebook/hubert-base-ls960)の中間層(層9)特徴量を抽出
multi-scale subsequence DTW(5秒窓 + 10秒窓)で窓ごとに top-k 候補抽出
Viterbi で全体経路推定(等速を基準に時間順を保つ遷移ペナルティ)
局所DTWで微調整
子音オンセット(onset_strength)で ±0.5s 微合わせ
Forced Alignment:双方を faster-whisper で単語タイムスタンプ化し、同一単語へスナップ
ffmpeg で setpts warp / 等速配置のどちらかで mux
WhisperX も試しましたが、こちらの環境が Python 3.14 で ctranslate2==4.4.0 が解決できず導入できなかったため、faster-whisper で代替しています。
症状
具体例:曲尺 311秒 / 原曲MV 257秒、テンポ一致度が極端に低い(chroma一直線度9%)激しいRemix。
得られた remix秒→MV秒 の対応(抜粋):
remix 0s → MV 43s
remix 55s → MV 70s
remix 105s → MV 108s
remix 188s → MV 166s
remix 217s → MV 87s ← 後半でMVが逆走(過去に飛ぶ)
remix 297s → MV 172s
前半〜中盤は概ね単調で口も合う
後半になるほど対応が非単調になり、MVが行ったり来たりする
サビの繰り返し部分で、同じ歌詞が原曲MVの別箇所に誤マッチしているように見える
自分なりの原因分析
MVが曲より物理的に短い(257s < 311s)。Remixがサビを増やしているため、後半はそもそも対応するMV区間が存在しない
サビ反復で「同じ歌詞」が複数箇所にあり、Forced Alignmentが最も近い1箇所に集中マッチしてしまう
試した対処と、その失敗
3分割(イントロ=最初の8小節、アウトロ=MV不足分を逆算、中盤だけ精密リップシンク)→ 後半の大きな逆走は減ったが、中盤に1点の誤マッチは残る
アンカーの単調化(PAVA)+傾き制限で後戻りを消す → 後戻りは消えたが、MVをスロー再生して尺を埋める形になり「同じ映像が繰り返される」副作用が発生
MVを広く使い切るよう再スケール → 今度は単語マッチ位置から離れて「口パクが全く合わない」状態に悪化したため撤回
つまり「口パク精度」と「映像の自然さ(繰り返し回避)」が真っ向からトレードオフになっていて、両立できずにいます。
質問
サビ反復で同一歌詞が複数回出るケースで、Forced Alignment / DTW の対応を「同じ歌詞の異なるテイクへ分散」させる定番手法はありますか?(1箇所集中ではなく、複数テイクを順番に使い回したい)
MVが曲より短く、対応が原理的に存在しない後半を、破綻なく扱う実務的な設計はどうするのが定石でしょうか?(フィラーへ逃がす以外に)
「フレーム精度の口パク」と「映像を満遍なく使う(繰り返し回避)」が衝突する場合、どちらをどう優先するのが一般的でしょうか。両立のための後段処理(コスト関数への使用済みペナルティ導入など)の知見があれば伺いたいです。
そもそも、ここまで構成が変わったRemixに対して原曲MVのリップシンクを追求するのは限界で、ビート同期のカット編集に切り替えるのが現実解、という理解で合っていますか?
環境:Python 3.14(librosa, scipy, Demucs, faster-whisper, ffmpeg)。アプローチの方向性自体への指摘も歓迎です。