ぜろいちのブログ

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

好きな音楽の音源からボーカルのみとインストのみの音源を取り出してみた~深層学習(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つ音楽情報処理の研究を紹介できたのは良かったかなと思います。 時期とかタイミングは特に考えず、自分の紹介したいものを気まぐれで記事にする位のスタンスでやっていこうと思います。

アッパーストラクチャー系アウトフレーズの分析 ~There will never be another you~

※この記事はジャズでよく使われるコードやスケール、アッパーストラクチャートライアド等の専門的な音楽知識があることを前提に記事を書いています。わからない用語等はすみませんが各自調べていただくか、読み飛ばしちゃってください。勿論用語や記事に関する質問や何か意見などあれば、書いて下さればお応えしたいので、気軽にコメントしていただければと思います。

今回はジャズスタンダード曲としても有名な「There will never be another you」を取り上げてみたいと思います。 音源はWoody Shawのアルバム「Solid」から。

その中でピアニストのKenny Barronが演奏しているアドリブパートのフレーズ分析をしていこうと思います。

Kenny Barronのパートについては採譜されている方がいらっしゃったのでぜひこちらの動画を見ていただけるとわかりやすいと思います。

よくよくこのトランスクリプション楽譜を聞きながら見てみると「あれ、ちょっとここ違くね?抜けてね?」って思う箇所はいくつかあるのですが、それでも十分によく採譜されているので基本的には問題ありません。

アウトフレーズとスケールアウト

あるコードのスケールから外れる事をスケールアウトといい、それを用いたフレーズをアウトフレーズと言ったりします。 このテクニックを使うと聞き手に「え!?」と思わせられるような意外性を演出できます。 Kenny Barronの演奏でもそのテクニックが使われているので紹介します。

採譜動画の 0:46 ~ 0:50 辺りのフレーズに注目します。フレーズは以下のようになっています。

f:id:zric01:20190713110101p:plain

このフレーズですが、少し加筆してみましょう。

f:id:zric01:20190713112405p:plain

39小節目(Bbm7の小節)の1拍目弱拍に「ミ」の音が抜けてるように聞こえたので、音を付け加えました。1から譜面書き直すのめんどくさくて楽譜作成ソフトで作った音符をそのまま画像キャプチャして貼り付けたら雑コラみたいになっちゃったけど。

四角で囲った部分はその箇所をアルペジオとして考えた時のコードです。 アッパーストラクチャーコードとして考えると次のように表記できます。

 \frac{\rm{Bm7}}{\rm{Cm7}}  \frac{\rm{Am}}{\rm{Bbm7}}  \frac{\rm{Em7}}{\rm{Bbm7}}  \frac{\rm{Bm7}}{\rm{Eb7}}

このコード、試しに右手と左手が近い所で同時に鳴らしてみてください。

くっそ濁った不協和音になります。

これはどういうことかというと、上下2つのコードが異なる音階由来の和音であるために、それぞれの和音が共有する事の出来る音が少ないということです。

メジャーやマイナーなどの種類が決まったものをそのまま半音上か下にずらして同時に弾いてみると思いっきり音がぶつかりますが、それは鳴らした2つのコードが属する調がかなり遠隔にある調のものである故にスケールで共有している音が極端に少ないため、このようなことが起こります。

しかしアウトフレーズではむしろこういうどう考えても不協和音になりそうな和音の組み合わせが良い味を出してくれます。 なぜならこれを行うと元のコードの色彩感が弱まり、調性感が曖昧になるからです。

アウトフレーズの本質は聞き手に驚きを与えること。 コードやスケールに従ったアドリブを聞かせるのは勿論だけど、それだけだと退屈してしまう。その中にスパイスとして奇妙な音を加えてあげることで「え、なにこれ!?」みたいな感覚を伝えられる。入れ過ぎは良くないけど。

そのためにあえてコード感、調性感をぼかすことでこれを演出できるというわけです。そのためのテクニックがこういったアウトフレーズ。

具体的な音で確認してみましょう。

  • Bm7の音はCm7エオリアンスケール)から考えると、レの音はCm79thに相当するが、それ以外は#11, 13, M7の音なのでCエオリアンスケールから見たらスケール外

  • Amの音はBbm7(ドリアンスケール)から考えると、ドの音はBbm79thに相当するが、それ以外は#11, M7の音なのでBbドリアンスケールからみたらスケール外

  • Em7の音はBbm7(ドリアンスケール)から考えると、ソの音はBbm713thに相当するが、それ以外は#11, b9, M3の音なのでBbドリアンスケールからみたらスケール外

  • Bm7の音はEb7から考えると、シとファ#の音はEb7b13#9に相当するのでオルタードスケールなどで解釈できるが、レとラはM7, 11なのでオルタードスケールならスケール外だし、仮にミクソリディアンスケールと解釈しても11はアボイドノートだし普通は経過音、隣接音など非和声音として使う事が基本だから実質的にスケール外とみなせる

特に  \frac{\rm{Am}}{\rm{Bbm7}}  \frac{\rm{Em7}}{\rm{Bbm7}}  \frac{\rm{Bm7}}{\rm{Eb7}} の分子のコードに着目すると、最初は分母のコードの半音下のマイナーコード(Am)から完全5度上(または完全4度下)の進行でマイナーコードを平行移動させている。完全4度・5度差のコードの平行移動はそのコードが所属する調性の調号をあまり変えずに動かすことができる。最初に半音ずらしで分母・分子のコードが共通する音の少ない遠隔調に属する和音の組み合わせにして、5度(4度)進行で遠隔調としての距離を保ったままコードを動かすことができるこの方法は、アッパーストラクチャーを用いたアウトフレーズを作る上では非常に参考になるテクニックではないかと思っています。

アドリブにおけるスケールアウト系のフレーズは一見不規則なフレーズに聞こえるようで一定の規則性があることが多いです。例えば同じ音型を繰り返し用いるというのがその典型例ですが、このアウトフレーズについても同じことが言えるでしょう。

こんな風に演奏者のアウトフレーズを見つけてアナライズしていくのは中々面白いものだなと思います。

次回はアウトフレーズではないアッパーストラクチャー系のフレーズについて解説していく予定です。紹介する順番が逆な気がするけど。
曲は引き続きThere will never be another youでKenny Barronのアドリブパートを見ていきます。

ブログ開設しました

こんにちは。 TwitterYouTube等で主にピアノ演奏の動画をあげているぜろいちと申します。 動画の投稿頻度はあまり多くは無いながらも、Twitterでは2019年7月現在 5000人以上 の方が僕をフォローしてくださっているのは大変ありがたい事だと思っています。
感謝っ・・・・!圧倒的感謝っ・・・・!

そもそも「ぜろいちって誰だよ、そんな奴知らねーよ」って方はこちらから僕のTwitterYouTubeを見ていただければ私のピアノ演奏動画などが見られますので、是非チェックしてみてくださいね!(がっつり宣伝)

www.youtube.com

twitter.com

ブログ開設の経緯

さて、僕がブログを開設した経緯をお話させていただきたいと思います。 理由としましては主に以下の2つです。

・字数や画像数などの制限に縛られず投稿したい
・気軽に投稿出来る場が欲しい

僕が何かしら演奏動画等をアップする場というのはTwitterYouTubeがメインになっている(というか基本それしかない)のですが、それだけだとどうしてもコンテンツ不足になってしまいます。
じゃあもっと投稿頻度を上げればいいじゃないかと言われればその通りなのですが、自分のめんどくさがりな性格と中途半端な完璧主義がネックになっており中々それが出来ずじまいになっているのが現状です・・・もっと頑張らねば。

じゃあ普段本当に何もやっていないのかと言われるとそうでもなく、演奏やアレンジ以外にも楽曲分析や音楽に関する勉強等も細々としていたりします。 特に現在ではネットで活躍しているピアニスト達が音楽理論に関する解説動画などを沢山上げるようになってきたので、表面的には多少なりともそういう話も以前より浸透してきているような実感はありますが、より局所的で細かい音楽理論等の話になると中々それだけでは伝わりにくいものです。さらに動画投稿の労力を考えると、あまり気軽にできるものではないなというように感じていました。

僕は結構そういう動画で解説しきれないようなニッチな音楽理論みたいなコアな話が好きなのでそういう話も沢山していきたかったのですが、そのような話はTwitter等でひたすら投稿しても多くの人にとって意味不明で退屈なものになってしまいそうだし、字数や画像数などの制限があるので詳細に説明するのは難しいと思い避けてきました。なのでそういうのを大衆受けなどを考えず淡々と発信していけるような場があれば良いなと前から考えていました。
それなら色々な面で投稿に制限があるTwitter等を使うよりは、1つの記事に沢山の情報量を詰め込むことが出来て且つ興味のある人だけ見てもらえば良いというスタンスを取りやすい(と個人的に思っている)ブログで発信するのが一番気軽で良いのかなと思ったのが、今回のブログ開設に至った経緯となっています。

投稿記事について

開設に至った背景としては上記のような感じなのですが、より雑多に気ままに投稿したいなって思いもあるので、上述したことに縛らず自由にやっていきたいなと今は考えています。

まだ暫定なのでこうすると決めたわけではないのですが、投稿していこうと思う内容としては以下のようなものを今は想定しています。

・気になった楽曲の解説
・動画の告知
音楽情報処理に関する研究の紹介
・その他気になった事、備忘録など

「音楽情報処理??」って思った方もいらっしゃると思いますが、僕は普段音楽をコンピュータで処理して何かを行うといったような研究をしていまして、例えば好きな曲を入れたら勝手にカラオケが出来るとか、自動で作曲・編曲するソフトを作るとか、そんな分野に関することをやっています。 より数学や情報工学に近い話になってしまうので皆さんの想定する音楽とは少しかけ離れてしまうかもしれませんが、そんなものも少し紹介出来たらなあなんて考えている次第です。

今は簡単に手が付けられる所から始めてみて、慣れてきたら徐々にブログのレイアウトの変更等を行い、より親しみやすいデザインにしていきたいと考えている所です。でもそれよりも、とりあえずは記事を増やしていくことが先決かなと感じているので、そこそこなペースで記事を作っていけたらなと思っています。

これからどうぞよろしくお願いします!

ぜろいち