倍音を含む波を真似できればハードウェアから楽器の音が出せる

fadis氏:こんにちは。松林です。今日は以前、「カーネル/VM探検隊@関西」でお話しした逆FM音源の改良版「Wasserstein逆FM音源」を紹介します。

「FM音源」は音楽を奏でるためのハードウェアです。世の中にはいろいろな音色の楽器がありますが、楽器の音色には共通した傾向があります。まず、どの楽器も音階に対応する周波数の基音が出ています。さらにおよそ整数倍の周波数で倍音が出ています。倍音は高い周波数のものほど早く減衰していきます。

本物の楽器と同じような倍音を含む波を、簡単な計算で真似することができれば、簡単なハードウェアから本物の楽器のような音が出てきます。FM音源は下のような計算式を使って、楽器が出す音色を模倣します。この式のポイントは、外側のサイン波の波形が内側のサイン波のせいで歪んで出てくるという点です。

進化する手法「FM音源」「遺伝的FM音源」「逆FM音源」

サイン波は単一の周波数成分しか持たない波ですが、歪んでいるとその歪み具合によって、さまざまな周波数にさまざまな大きさの倍音が現れます。歪み具合をコントロールするこれらのパラメーターを調整することで、本物の楽器と同じような倍音を持つ音を作り出そうというのがFM音源です。

しかし、ある楽器の音色を真似したい時にどのパラメーターを調整すればいいのか非常にわかりにくいため、FM音源は楽器の音色をうまく再現できないとされ、歴史から姿を消していきました。

2016年の「カーネル/VM」で、私は「遺伝的FM音源」を発表しました。これは遺伝的アルゴリズムで、適切なFM音源のパラメーターを見つけようというものです。遺伝的アルゴリズムによって、FM音源では困難とされていたピアノの音をそこそこ再現するパラメーターが見つかりました。

FM音源がダメではないのです。人間がダメなだけなのです。遺伝的アルゴリズムが良質なパラメーターを引き当てるには、ある程度の運が必要なため、遺伝的FM音源は神に祈る必要がある手法でした。そこで私は2020年に、FM音源を微分して勾配法でパラメーターを見つける「逆FM音源」を発表しました。

逆FM音源は、実はけっこう無理をした手法でした。これは2オペレータとFM音源の2つのパラメーターを変化させた時に、目標とするピアノの音からどの程度ずれた音が出るかをグラフにしたものです。黄色で示した比較的合致している領域はつながっておらず、誤差が波打っていることがわかります。これは勾配法を適用するうえで良くない状況です。

勾配法は最も誤差が小さくなる入力を探すために誤差を入力を微分して、その勾配に沿って入力を更新する操作を繰り返して、誤差が小さい箇所を探します。ボールを転がして一番低いところで止まるのを期待するのに似ています。したがって、誤差が山と谷を繰り返していると本当の最小値にたどり着かない可能性があります。今まさにそういう状態なので、ここに勾配法を適用することはできません。

「逆FM音源」ではバイオリンの高周波倍音がごっそり消えてしまう

ところで、音階を持つ楽器の倍音は通常、基音の整数倍の周波数付近に出てきます。そこでFM音源の倍音の感覚を決定するωは必ず整数値になることにします。すると先ほどのグラフの黄色い縦線が出ていたところがつながって、このような誤差になります。

この部分の山を上に越えられると困るので、あとは複数の初期値から探索を始めて、最も良い値に到達した1つを採用するという方法で、最適なFM音源のパラメーターを探していました。

この方法の犠牲になったのがバイオリンです。バイオリンを逆FM音源にかけると図のように、高周波の倍音がごっそり消えた音色が生成されます。これを再生してみると実際バイオリンには聞こえません。

本物のバイオリンの音をよく見てみると、高周波の倍音が整数倍の周波数からずれた周波数でなっています。先ほど倍音は常に整数倍の周波数になるという制約を課したので、そうなっていない倍音がすべて無視されています。困りました。小細工をしないと、誤差が勾配法にかけられるかたちになりませんが、小細工が原因で楽器の音を正確に捉えられないという状況です。

こういう時考えるべきことは、使っている損失関数が問題に合っていないのではないかということです。逆FM音源は、損失関数に平均二乗誤差を使っていました。平均二乗誤差では本来出るはずの倍音が出ていないのも、本来出ていないはずの倍音が出ているのも等しく誤差に計上されるため、間違った周波数で倍音が出るくらいなら、鳴っていないほうがマシな値が出ます。

グラフの右上の誤差が低くなっているのは、高周波成分が可聴域外に出て音が出ていないので、マシな状態になっているためです。ωの値を変えると、倍音が出る周波数が変化します。しかし平均二乗誤差では、倍音が本物と一致する一瞬を除いてすべてが等しく出ていないほうがマシという値が出ます。この結果が、縦に細長く伸びる黄色のラインです。本物の楽器の周波数と一致した一瞬が黄色くなっている部分です。

音色を「そこそこ似ている!」と判断できる「Wasserstein距離」

平均二乗誤差が、音色同士の距離を測る手段として適していないことは明らかです。ではもっと適した距離関数は何か。それがWasserstein距離です。Wasserstein距離は、2つの分布がどの程度似ているかを表す距離関数です。数式では難しそうですが、イメージとしては分布のかたちを砂の山か何かだと思って、ある分布PのかたちからQのかたちまで積み替えるのがどのくらいしんどいかを計算したものです。

詳しい計算方法やこれを効率良く求めるアルゴリズムを解説するのはLTの時間に収まらないので、気になる人はこのあたりを見てください。

Wasserstein距離のすごいところは、本物と生成物でわずかにずれた位置に値が出ている時に、それを「惜しい! そこそこ似ている!」と判断できるところです。その結果、ωが実際の楽器の倍音と正確に一致していなくても、そこそこ小さな誤差が出てくるので、図のように滑らかな誤差の分布になります。

さっそく逆FM音源にWasserstein距離関数を仕込みましょう。周波数領域で計算したFM音源のスペクトルと、本物の楽器をフーリエ変換して得たスペクトルをWasserstein距離関数で比較して距離を求めます。

次にWasserstein距離関数とFM音源を微分して誤差逆伝播を行い、Bとωをどう修正すべきかを求めます。これを繰り返して最適なBとωを求めます。ここで問題になるのは、Wasserstein距離関数は解析的に微分できないのですが、解析的に微分できないなら数値的に微分するだけです。

平均二乗誤差の場合と違い、右上に流れるような勾配にはなっていないので、1つの初期値から最適化を行えば良い値が見つかります。結果を聞いてみましょう。

Wasserstein逆FM音源の威力を実感してもらえたと思います。しかしこの手法には、まだいくつか課題があります。1つは計算時間です。大量の周波数成分に対する数値微分を反復計算の中で行うのは、時間がかかり過ぎます。

Wasserstein距離は、ニューラルネットワークで大変有用な距離関数なので、世界中のディープラーニング屋が微分する方法を血眼になって探していて、Wasserstein距離が近似なら微分できることが知られています。このあたりを活用するのが今後の目標になりそうです。

もう1つは、ωを整数に揃えるべき楽器とそうでない楽器があるという問題です。Wasserstein逆FM音源は、図のような緩やかな勾配の中から最適なωを探すため、通常ωは整数になりません。ωが整数にならないということは、音色は長周期のコーラスがかかったようになります。もともとがそのような音が出る楽器ではそのほうが良いのですが、そうでない楽器では、ωを整数に固定しないとひどい音が出ます。トランペットの例を聞いてみましょう。

ある音色が与えられた時、ωを固定したほうが良いか、それとも固定しないほうが良いかを自動で判断する手段は現状ありません。これも今後の課題です。

まとめに入りましょう。FM音源で、本物らしい楽器の音を出すパラメーターを勾配法で探す時はWasserstein距離を使うといいです。ご清聴ありがとうございました。