ChimeraNetで音/声分離

いわゆる人工知能の一種であるChimeraNetを使って、アニメのBGMと声を分離します。

はじめに

アニメやドラマのBGMはかっこいいですよね。でも目当てのBGMがサウンドトラックに収録されてなかったら悲しくなりますよね。そこでアニメやドラマの音声から、BGM(音)と人の声とを分離すればいいと考えました。

というわけで調査した結果、次のモデルがヒットしました。

ChimeraNet

[1611.06265] Deep Clustering and Conventional Networks for Music Separation: Stronger Together

今回は、このモデルを使ってBGM(音)と声に分離したいと思います。

結果

学習したモデルを使って音と声に分離しました。結果は以下です。

f:id:leichtrhino:20190121120703p:plainf:id:leichtrhino:20190121120659p:plainf:id:leichtrhino:20190121120654p:plain
分離結果 左から混合、音、声

聞いてみたところ、それっぽく分離できてました。

理論的背景

次のような(メル)スペクトログラムを考えます。

f:id:leichtrhino:20190121120703p:plain:w250

このスペクトログラムが複数のスペクトログラムの合成であると考えます。合成前のチャンネル数をC (今回の場合は音と声で2)、時間フレーム数をT、メル周波数のビン数をFとします。例のスペクトログラムではT=63,F=128です。

ChimeraNetモデルはDeep clusteringとマスク推定とのマルチタスク学習により、音声をいい感じに分離するようなマスクを学習します。誤差関数はそれぞれ次の通りです。

 \displaystyle \mathcal{L}_{DC}=\left\Vert \hat{A}-A\right\Vert_F^{2}=\left\Vert VV^{T}-YY^{T}\right\Vert_F^{2}

 \displaystyle \mathcal{L}_{mMSA}=\sum_{c}\left\Vert (O^{(c)}-M^{(c)})\odot S\right\Vert_2^{2}

雑に説明します。まず、Deep clusteringの誤差関数 \mathcal{L}_{DC}について説明します。  Y\in\mathbb{R}^{TF\times C}は学習データのスペクトログラムにおいて、 (t,f)要素がチャンネル cで最も強いなら 1、そうでなければ 0であるような行列です。 すると A=YY^{T} ( ( t_i , f_i ), ( t_j , f_j ) )要素は、同じチャンネルの成分なら 1、異なるチャンネルの成分なら 0になります。

一方、 V\in\mathbb{R}^{TF\times D}はChimeraNetが出力する行列で、 \mathcal{L}_{DC}が小さくなると V (t,f)行のベクトルはチャンネルに関する特徴を持っていると考えられます。 学習終了後、ChimeraNetが出力した Vの行ベクトルにクラスタ Cクラスタリングをかけることで、与えられたスペクトログラムの (t,f)成分がどのチャンネルで強いか、その推測結果を取り出します。

 A,\hat{A}はいずれも \mathbb{R}^{TF\times TF}の非常に大きな行列で、これをメモリに展開するのは難しい場合があります。 そこで、Deep clusteringの論文に示された方法で計算します。

 \displaystyle
\begin{eqnarray}
\mathcal{L}_{DC}
&=\left\Vert \hat{A}-A\right\Vert_F^{2}=\left\Vert VV^{T}-YY^{T}\right\Vert_F^{2} \\
&=\left\Vert V^{T}V \right\Vert_F^{2} -2\left\Vert V^{T}Y \right\Vert _F^{2}+ \left\Vert Y^{T}Y \right\Vert_F^{2}
\end{eqnarray}

次に \mathcal{L}_{mMSA}について説明します。式中の演算子 \odotは要素ごとの乗算を表します。  O^{(c)} M^{(c)}はそれぞれ、各チャンネル cに対する、学習データから得られるマスクおよびChimeraNetが出力するマスクを表します。  O^{(c)} (t,f)要素は、スペクトログラムの (t,f)成分がチャンネル cで最も強いなら 1、そうでなければ 0です。 Sは学習データのスペクトログラムをチャンネルにわたって足し合わせたものです。

ChimeraNetでは他に \mathcal{L}_{MSA}と定義された誤差関数も用意されていますが説明は割愛します。

Deep clusteringについては次を参照ください。

三菱電機 ニュースリリース マイク1本で録音した複数話者の同時音声の分離・再現に成功

[1508.04306] Deep clustering: Discriminative embeddings for segmentation and separation

Deep clusteringとChimeraNetについてはこちらに詳しい解説があります。

ICASSP2017読み会(関東編)・AASP_L3(北村担当分)

実験

プログラム

ChimeraNetを実装し、こちらにアップロードしています。

GitHub - leichtrhino/ChimeraNet: Unofficial implementation of music separation model by Luo et.al.

データセット

音のデータはこちらのmidiからMuseScoreでwavに変換したものを採用しました。

The Largest MIDI Collection on the Internet, collected and sorted diligently by yours truly. : datasets

声のデータはあるアニメ2クール分(26話分)から手動で取り出したものを採用しました。データの総時間は1時間くらいです(うろ覚え)。

学習

プログラムを用いてChimeraNetモデルを学習しました。 学習にはそこそこの容量のメモリが必要なので注意が必要です(T=63,F=128で32バッチでも40GB前後)。 さらに時間もかかるのでそこも注意です(1エポックを7200サンプルとして、100エポックでおよそ3週間)。 テンソルが疎なので、それ専用の命令があればもう少し効率よく計算できたかもしれません。 そんなことありませんでした。Deep clusteringの論文にメモリの使用量を削減するアイデアが書いてありました。 もっと読むべきでした。反省しています。

おわりに

今回は、ChimeraNetと呼ばれるモデルを使って音と声を分離するプログラムを作成しました。 以上になります。ありがとうございました。