ソロコレからBGMを抽出する(eeic Advent Calendar 2020)

この記事は eeic アドベントカレンダー 16 日目の記事です。

12/16 はアイドルマスターシンデレラガールズの美穂と亜季、ミリオンライブ! の育ちゃんのお誕生日です。

さて、アイドルコンテンツには、ソロコレクションという独特の文化が存在する。

ソロコレクションとは、ある楽曲を、何人かのキャラクターがそれぞれ歌った歌の CD のこと(例 1例 2)。このソロコレクションから、歌声のない BGM だけを抽出したい。なぜかというと、ときどきカラオケ音源が販売されていない楽曲があるからである。

図にするとこう。ちなみに真ん中の子が今日誕生日の小日向美穂ちゃんです。

この問題を解きたい。

題材

今回は図の 3 人が歌っている「ラブレター」を題材にする。

オリジナルのソロコレに収録されている音源は次のような感じ。これが 3 人分ある。

そして、この記事で得たい目標となるカラオケ音源(Ground truth)は次のような感じ。

既存手法

センターチャンネル抽出

CD はステレオで収録されているが、一方歌声はモノラルなので、センターの音だけ取り除くとボーカルを取り除くことができる。この手法はそれなりに単純で、ボーカルリデューサーや Adobe Audition、Audacity などでも利用できる。これならば、1 つの音源のみからカラオケ音源を作ることができる。

欠点として、ステレオなリバーブやエコーが残ってしまったり、中央に位置するドラムなどが除去されたりしてしまう。

Audition でやってみた例は次のような感じ。センターの音量を相当下げているがボーカルは強く残っているし、一方伴奏のドラムなどが落ちてしまっている。

ブラインド音源分離

Spleeter など、声と BGM の特徴を機械学習で学習することで、声と BGM を分離するツールがある。こういったツールも、1 つの音源からカラオケ音源を作ることができる。便利だし、意外とよく動く。

便利だが、歌声なのか楽器音なのかの区別を誤ることも多いため、高い品質の BGM が得られるわけでは必ずしもない。

Spleeter でやってみた例は次のような感じ。センターチャンネル抽出と比べるとはるかにマシだが、若干ボーカルが残ったり不自然に楽器が影響を受けたりしている。

センターチャンネル抽出を利用する手法

出典はあるがどこかにいってしまった。

センターチャンネル抽出の「左右の同じ部分だけを取りだす・除去する」という特徴を利用して、歌唱者 A のミックス音源を左、歌唱者 B のミックス音源を右に配置した仮想音源を作成し、これに対してセンターチャンネル抽出をする手法がある。この手法は、2 人分のソロコレが必要になる。

やってみると、次のような感じになる。ボーカルはほとんど聞こえないが、楽器音が影響を受けている感じがする。2 つの音源が使えている分、品質はそれなりに高い。

(おまけ)センターチャンネル抽出のアルゴリズム

センターチャンネル抽出は、L と R が直交するようにセンターチャンネル C を求めることで行う。直交条件だけでは一点に定まらないので、センターチャンネルは観測 XL と XR の二等分線上にあるという重要で適当な仮定をしている。センターチャンネル抽出が単純なアルゴリズムでないのは、こういった点にある。実際に実装してみると意外と難しい。

最終的には二次方程式を解くことになる。計算誤差に注意しないといけない。また、二次方程式のため解が 2 つある。より原点に小さい場所を選べばよいらしい。

実際のソフトウェアに載っているアルゴリズムはもう少し複雑らしく、これがこのまま実装されているわけではない。

事前準備

分析と合成

音は波だが、波のままでは扱いにくい。そこで、こういう音響信号処理では、音に対応する複素スペクトログラムを分析することで、扱いやすい形にして処理することが多い。

複素スペクトログラムから信号を復元するのは Griffin-Lim 法などが知られていて、簡単に実装できる。

目標は、いくつか(人数分)の複素スペクトログラムを集めて、その複素スペクトログラムの各時刻・周波数の点の複素数から、対応する点の BGM の複素数を求めることにある。

時間的対応づけ

3 人分のソロコレがあっても、サンプル単位でぴったり時刻が同期できていないと正しく処理ができない。相互相関関数を使って揃える。

また、音源によって全体の音量が若干違うので、これも上手に揃える。

提案法

近い二人でセンターチャンネル抽出する方法

二人の声が近いと、その二人ともそんなに声が乗っていないので、その二人の間でセンターチャンネル抽出することで BGM だけとれる気がする。

やってみた結果は次のとおり。あんまりボーカルきれいに消せてない……。

絶対値が最小値の要素を選ぶ方法

歌声は、人が歌っているので、ちょっとだけずれている。人数が十分あれば、誰かの時間周波数の点は BGM に近いことを期待してもいい。

結果は次のような感じ。さっきのよりは少しマシ?

ボーカルが乗っていそうな場所の音量を小さくする

ボーカルがありそうな場所を消してしまえばいいじゃない! 発想としてはソフトマスクによる音源分離に近い。

絶対値最小の要素を選ぶ方法と組み合わせた結果は次のような感じ。BGM がちょっと歪むけど、ボーカルはそこそこきれいに消えた。カラオケ目的なら十分使えそう。

結論

意外とむずかしかった。Adobe Audition のセンターチャンネル抽出が再現できると強くなれそう。なかなか単純には解けないですね。


コメントを残す

メールアドレスが公開されることはありません。