ChimeraNetで音/声分離
いわゆる人工知能の一種であるChimeraNetを使って、アニメのBGMと声を分離します。
はじめに
アニメやドラマのBGMはかっこいいですよね。でも目当てのBGMがサウンドトラックに収録されてなかったら悲しくなりますよね。そこでアニメやドラマの音声から、BGM(音)と人の声とを分離すればいいと考えました。
というわけで調査した結果、次のモデルがヒットしました。
[1611.06265] Deep Clustering and Conventional Networks for Music Separation: Stronger Together
今回は、このモデルを使ってBGM(音)と声に分離したいと思います。
結果
学習したモデルを使って音と声に分離しました。結果は以下です。
聞いてみたところ、それっぽく分離できてました。
理論的背景
次のような(メル)スペクトログラムを考えます。
このスペクトログラムが複数のスペクトログラムの合成であると考えます。合成前のチャンネル数を (今回の場合は音と声で2)、時間フレーム数を、メル周波数のビン数をとします。例のスペクトログラムではです。
ChimeraNetモデルはDeep clusteringとマスク推定とのマルチタスク学習により、音声をいい感じに分離するようなマスクを学習します。誤差関数はそれぞれ次の通りです。
雑に説明します。まず、Deep clusteringの誤差関数について説明します。 は学習データのスペクトログラムにおいて、要素がチャンネルで最も強いなら、そうでなければであるような行列です。 するとの要素は、同じチャンネルの成分なら、異なるチャンネルの成分ならになります。
一方、はChimeraNetが出力する行列で、が小さくなるとの行のベクトルはチャンネルに関する特徴を持っていると考えられます。 学習終了後、ChimeraNetが出力したの行ベクトルにクラスタ数のクラスタリングをかけることで、与えられたスペクトログラムの成分がどのチャンネルで強いか、その推測結果を取り出します。
はいずれもの非常に大きな行列で、これをメモリに展開するのは難しい場合があります。 そこで、Deep clusteringの論文に示された方法で計算します。
次にについて説明します。式中の演算子は要素ごとの乗算を表します。 とはそれぞれ、各チャンネルに対する、学習データから得られるマスクおよびChimeraNetが出力するマスクを表します。 の要素は、スペクトログラムの成分がチャンネルで最も強いなら、そうでなければです。は学習データのスペクトログラムをチャンネルにわたって足し合わせたものです。
ChimeraNetでは他にと定義された誤差関数も用意されていますが説明は割愛します。
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に変換したものを採用しました。
声のデータはあるアニメ2クール分(26話分)から手動で取り出したものを採用しました。データの総時間は1時間くらいです(うろ覚え)。
学習
プログラムを用いてChimeraNetモデルを学習しました。
学習にはそこそこの容量のメモリが必要なので注意が必要です(で32バッチでも40GB前後)。
さらに時間もかかるのでそこも注意です(1エポックを7200サンプルとして、100エポックでおよそ3週間)。
テンソルが疎なので、それ専用の命令があればもう少し効率よく計算できたかもしれません。
そんなことありませんでした。Deep clusteringの論文にメモリの使用量を削減するアイデアが書いてありました。
もっと読むべきでした。反省しています。
おわりに
今回は、ChimeraNetと呼ばれるモデルを使って音と声を分離するプログラムを作成しました。 以上になります。ありがとうございました。