TL;DR
いろんな方法で後撮り音声のリップシンクを試みたよ。うまくいったりいかなかったりしたよ。
はじめに
デスゲームをやってみたい!!というわけで、おあつらえ向きにサークル合宿幹事の機会が与えられたのでやってみることにしました。
普段からデスゲームの主催者っぽい風格のある部員Aに協力してもらい、次のようなシナリオを立てます。
① 全員が部屋に集められる
② 突然電気が消えてテレビ画面からデスゲームの主催者が登場。ルール説明。
③ 殺し合い(レクリエーション)
本来であればどこかのスタジオでも借りて生中継をしたかったわけですが、予算とか場所とかの都合で「事前にカラオケのコンセプトルームで動画を撮って当日流す」というところに落ち着きました。
カラオケBOX特有のノイズ問題
カラオケのコンセプトルームは一般的なスタジオと比べて非常に安いのが嬉しい点ですが、録画音声に結構な騒音が乗ります。それをソフトウェア制御で何とかしよう というのが今回のテーマです。
※ なお、プライバシーの都合上「音声がこう変わりました!」みたいな例はこの記事には載りません。
直接ノイズを取り除く方針
いつも通り、それっぽいモデルを探しに hugging face を見に行きます。今回お世話になったのはSpeechBrain さんの sepformerシリーズです。(ちなみにpython3.8でも3.12でも動かなかったので3.10を新たに入れる羽目になりました。)
結論から言うと、かなり微妙な出力でした。モデルによって大分出力が違いましたが、声が全部消えるかノイズが全部乗るかのどちらかでした。SN比が大きいことに加え、カラオケのノイズはもっぱら別の人の歌声なので分離がしにくいのかもしれません。
後撮りした音声を合成する方針
当初の思惑が外れたため、部員Aに土下座して音声だけ後撮りしてもらい、元動画と上手いことリップシンクする方向性で頑張ります。
メルスペクトログラムと伸縮マッチングを用いたマッチング
メルスペクトログラムとは
短い区間の周波数スペクトルを時間方向で積んだものをスペクトログラムと呼びます。人間の聴覚特性により近い特徴量となるように周波数をlogスケールにしたものがメルスペクトログラムです。
実際の音声に対するメルスペクトログラムはこんな感じ。 「また、東寺のように、五大明王と呼ばれる主要な明王の中央に配されることも多い」 - jvs corpus
伸縮マッチングとは
dpマッチングとも呼ばれます。ある系列を部分的に伸縮して別の系列にするような場合で、最もそれらしいマッチングを見つける問題です。詳しくはこの辺の記事が分かりやすいです。
隣接(斜めを含む)するマスに辺を張り、そのコストを「向かう先のマスの嬉しくなさ(類似度に対して単調現象する指標)+位置ずれコスト
」として、左上から右下への最短経路問題を解くことで、良い感じに類似度の高いところを選択しながら進むルートが得られます。
ちなみに、最短経路は
という単純なdpで求めることができ、これがdpマッチングと呼ばれる所以です。
メルスペクトログラムの各時間セクションに対して類似度を計算
元動画の音声と後撮り音声のそれぞれについてメルスペクトログラムを計算し、正規化した後に行列の内積を取ると「音声1のi番目の時間セクションと音声2のj番目の時間セクションのcos類似度」の行列ができます。 非常にうっすらとですが斜めに走る線を確認できます。類似度が高い(より黄色い)マスは同じような音を発しているという仮説に立てば、黄色い線をうまいことなぞるルートで時間マッチングを行うことで適切なリップシンクが得られます。
ただ、カラオケBOXでのセリフと家での後撮りだと声の質がそれなりに異なることもあり、大きくマッチングを外す事例も複数ありました。
文字起こしを用いたマッチング
最近の音声認識AIは優秀で、多少ノイズが大きくてもちゃんと言ってる内容(とタイムスタンプ)を検出してくれます。
で、タイムスタンプさえ分かれば適当に音声を伸縮させれば(少なくとも文字単位では)リップシンクができます。ただし、2つの音声の文字起こしが完全に一致していることが前提であり、1文字でもずれるとこちら側で修正を掛けなくてはいけないという嬉しくなさがあり、また、無音区間の扱いや文字と文字の間にやや不自然な切れ目が生まれるなど、上手くいく例と行かない例が顕著に分かれました。
部員Aに頑張ってもらう
後から知ったのですが、後撮りを送ってもらう際、気を聞かせて元の動画とリップシンクを合わせようとしてくれていました。それゆえ、録音区間によっては直接音声を張るのが(変な加工を行わない分)一番自然な合成になる という状況がそれなりにありました。
結論
様々な手法を試しましたが結局万能な手法は存在せず、複数手法のうまくいってる部分を手動で切り貼りして合成するという手段を取りました。技術者としての敗北を感じます。
おまけ
デスゲームのadmin側の醍醐味として「突然の出来事で右往左往する参加者を別室から優雅に眺める」があります。
時間と予算が限られる中、私物のパソコン2台とスマホ1台を組み合わせて実現を試みました。
宿に到着後、宿のWIFI環境があまりに貧弱で大変な目にあったというのが今回のオチです。