ぜろいちのブログ

ピアノ弾き「ぜろいち」のブログ

好きな音楽の音源からボーカルのみとインストのみの音源を取り出してみた~深層学習(Deep U-Net)による歌声分離~

今回はミックスされた音楽から歌声のみの音源とカラオケ音源の抽出をやってみたので、その紹介記事になります。 前提として音楽は歌ありのものを想定しています。

仕組み(簡単に知りたい人向け)

超ざっくりとしたイメージですが流れとしてはこんな感じです。

f:id:zric01:20191008200540p:plain
歌声分離の流れ

オリジナルの音楽のオーディオデータ(wavやmp3など)をシステムに入れるとAI技術である深層学習によって処理が行われ、歌声と楽器を取り出してくれるというものです。 AIがミックスされた音楽からボーカルだけを取り出す方法を学び、学習済みのAIが音源を分離してくれるといった感じです。

デモ

ボーカルとインストの分離

実際にデモ音源を用意したので聞いてみましょう。 RWC-POPデータセットの音源を利用しています。

元の音源

分離後のボーカル

分離後のインスト

結構よく分離出来ている感じです。ものによってはあまりうまくいってないものもありましたが、おおむね良く抽出できているのではないでしょうか。

環境音に紛れている話し声の抽出

学習させるデータセットを変えて環境音に紛れている話し声の抽出もやってみました。

元の音源

抽出後の話し声

大分良く抽出できているように聞こえます。

仕組み(より詳しく知りたい人向け)

具体的なモデルの仕組みやソースコードなどはxiao_mingさんのこの記事を主に参考にさせていただきました。

qiita.com

というかこの記事が非常によくできており、めっちゃわかりやすくシステムの内容や学習モデルなどがまとまっているし実際のデモや実装したソースコードまで紹介しているので、正直こちらの記事を読めば事足りてしまうかと思います。 プログラムもこの方が実装されたコードを利用させていただきました。大変ありがたい限りです。

ここでは音源分離の手法としてDeep U-Netという深層学習モデルを使用しています。
元論文:https://ismir2017.smcnus.org/wp-content/uploads/2017/10/171_Paper.pdf

概要

やり方としてはシンプルで、入力として楽曲の振幅スペクトログラムを使用し、それと同サイズのマスクをU-Net(ニューラルネットワークモデル)が計算します。このマスクと入力に利用した楽曲のスペクトログラムとの積を取ることで、歌声部分だけを抽出できるという仕組みです。

ざっくりとした流れとしれはこんな感じ。

f:id:zric01:20191010154926p:plain

※補足知識:STFTについて

STFT短時間フーリエ変換(Short-time Fourier Transform)の略で、オーディオ波形を周波数と時間の関係で表現できる形に変換するための方法です。
STFTによって変換されたものを「スペクトログラム」とか言ったりします。 イメージとしてはピアノで弾いてる音楽があったとしたら、ある高さの「ド」の音の高さの音がどのタイミングで鳴っているのかみたいなものを目で見られるようにするためのもの、みたいな感じを想定してくれればと思います。
特に信号の振幅(パワー)を表現するものを振幅(パワー)スペクトログラム、位相情報を表現するものを位相スペクトログラムなんて言ったりしますが、この2つについてはよく分からなかったら適当に流してくれても大丈夫です。

ISTFT(Inverse Short-time Fourier Transform)はその逆で、STFTされている周波数と時間の関係で表現されているスペクトログラムを実際に私たちが普段聞いているオーディオ信号に戻します。

Deep U-Net(ニューラルネットワークモデル)について

f:id:zric01:20191010163609p:plain

上の図は元論文からの引用です。

見ての通りアルファベットのUの形っぽい感じですね。 全層がCNN(畳み込みニューラルネットワーク)で構成されており、それにエンコーダーデコーダーモデルを組み合わせた形になっています。 これだけならU-Netに限らず、この構造は他の研究の音源分離手法としても提案されています(Convolutional Encoder Decoder)。ちなみにこの図はこの研究(https://nsarafianos.github.io/icip16)からの引用です。

f:id:zric01:20191010164746p:plain
Convolutional Encoder Decoder

U-Netの場合それに加えて、ResNetで提案されているようなSkip Connection(Concatの部分)が追加されており、Encoderの層にある特徴量を、同じ階層にあるDecoder層にも伝播させます。これによって処理が進む前の大域的な特徴量も残しつつ学習していけるということなのでしょう。

ちなみにResNetについてはこちらの記事がわかりやすいかと思います。 deepage.net

損失関数は入力の振幅スペクトログラムと出力のマスクの積と、教師データとなるボーカルの振幅スペクトログラムとの差になります。

※論文における細かい設定(読み飛ばしてもOKです)

エンコーダ

デコーダ

  • ストライド幅: 2

  • カーネルサイズ: 5×5

  • Batch Normalization適用

  • 活性化関数はReLU

  • 上の3層にはDropout(50%)を適用

オプティマイザーはADAMを使用

マスク計算後の処理

Deep U-Netによってボーカルを抽出するために必要なマスクを計算するわけですが、これを元音源の振幅スペクトログラムにそのままかけてISTFTを行っても良い感じにボーカルを抽出することはできません。この時点では楽曲の位相情報を何も考慮していないからです。

では位相情報はどう復元するのかということですが、元楽曲の位相スペクトログラムを算出した位相スペクトログラムにそのままかけます。 これでISTFTするだけで良い感じのボーカルが抽出できます。ちなみに環境音に紛れている話し声の抽出も全く同じ要領で行いました。

インスト音源については、元音源の振幅スペクトログラムから算出したボーカルの振幅スペクトログラムの差を取り、同じように元楽曲の位相スペクトログラムをそのままかけてISTFすることで抽出しました。

位相情報の復元処理とかまでちゃんとやればもっと良い品質のものが出来そうな気がしますが、この論文では扱っていないので割愛します。Griffin Lim アルゴリズムとか、von Mises分布DNNに基づく振幅スペクトログラムからの位相復元(http://sython.org/papers/SIG-SLP/takamichi1806slp_paper.pdf)という研究もあるので、並行してやってみる価値はあると思います。めんどくさいので自分はやりませんが。

データセット

学習用のデータセットにはボーカル付きのミックスされている音源とそのボーカルのみの音源が必要になります。そのうち入手しやすいものを紹介します。

ミックス音源と、ボーカル音源、ベース音源、ドラム音源、他の楽器の音源が入った曲が100個提供されている。

こちらもDSD100同様ステムデータが提供されており、バージョン1と2合わせて200曲近くあるが、インストのみの音源も少なくないのであらかじめ選別が必要。

環境音に紛れた話し声の抽出に使ったデータセットは以下。

おわりに

今回はDeep U-Netという深層学習モデルによる歌声分離、話し声抽出を紹介しました。 前回記事でアッパーストラクチャーの話の続きをやるとか書いておきながら、音楽理論もピアノとも関係ない記事になってしまいましたが、1つ音楽情報処理の研究を紹介できたのは良かったかなと思います。 時期とかタイミングは特に考えず、自分の紹介したいものを気まぐれで記事にする位のスタンスでやっていこうと思います。