位相スペクトルの有理関数近似に基づく位相復元手法(のプロトタイプ)をPythonで実装した

はじめに

お待ちかね(?)の位相復元シリーズである.

手法の説明

記法を簡単にするため,ある特定の音声フレームに固定して考える.このフレームに関して, 位相スペクトル \( \phi(\omega) \) が有理関数で近似できると仮定する.


\begin{align*}
\phi(\omega) \approx \arctan \left( \frac{a_0 + a_1 \omega + a_2 \omega^2 + \dots + a_n\omega^n}{b_0 + b_1 \omega + b_2 \omega^2 + \ldots + b_n\omega^n}\right)
\end{align*}

ここで \( \omega \) は角周波数である.有理関数に現れる分子・分母多項式の最大次数は \( n \) としておく. 本手法では,それら多項式の係数 \( a_0, a_1, \ldots, a_n, b_0, b_1, \ldots, b_n \) をニューラルネットで推定する.

位相スペクトル自体を直接ニューラルネットで推定する(回帰する)手法はこれまで多く提案されてきた.そのニューラルネットの入力は(対数)振幅スペクトルであり,出力は位相スペクトルの値であった.本記事の手法も入力は対数振幅スペクトルで共通しているが,位相スペクトルが有理関数の係数を介して間接的に推定される点が異なる.

位相スペクトルは非常に複雑なパターンを持っており,それをニューラルネットによって対数振幅スペクトルから直接推定する場合には強い非線形性が要求される.結果的にパラメタ数(層数・チャネル数)の大幅な増加を招き,訓練が難しくなりがちである.本手法のニューラルネットはあくまで係数の推定に留まっている.実用上,有理関数の多項式の次数を増やしすぎることなく,それなりの精度で位相スペクトルの推定を達成できる(と期待される).

有理関数近似はパデ近似の趣もあるが,微分係数の一致を取っているわけではないので,パデ近似ではない.そもそも真の位相スペクトルが未知なので,微分係数も未知であり(たとえ連続関数と仮定したとしても),それらの一致を測れない.

関連手法

Zhen-Hua Ling らは類似の位相推定手法を提案している (Link).彼らの手法では単位円上の1点を表す複素数の実部・虚部をDNNで推定し,atan2により位相を得る.ネットワークが実部・虚部を直接出力しているのであって,その点は本記事の手法と異なる.また彼らが同論文の中で提案している損失関数があるが,予備実験として本記事の手法にその損失関数を適用したところ,収束が芳しくなく,復元音声の音質は低く留まった.

プロトタイプ実装

スクリプトは以下のURLに置いた.

Demonstration script for phase recovery via rational function approximation. · GitHub

まず位相推定にあたり,arctanatan2 (Link) により実装する.

発話の全フレームに渡って係数を一斉に推定する。つまり,あるフレームについて注目したとき,ミニバッチあたり「(周波数ビン数)×(多項式の次数)」だけの係数を一度に推定する.なので,最終層のチャネル数は必然的に増える.

ネットワークはConv1dを2層重ねて作り,活性化関数にはReLUを選んだ.有理関数を周波数軸上の各点(毎回決まった点)において何度も評価するために,角周波数のべき乗をあらかじめ計算しておくなどの工夫を取り入れている.また複数フレームに渡って並列に有理関数を評価する工夫も入っている.

損失関数には復元した複素スペクトログラムと元のスペクトログラムとの最小二乗誤差を採用した.振幅スペクトルで実部・虚部を重みづけて二乗誤差を取っているとみなせる.

おわりに

有理関数近似ニューラルネットが訓練データ量を増やした位相復元タスクでどこまで動くのか,検証するのは今後の課題とする.層の数を増やせば復元性能の向上が見込めるのは(ある意味)当然なので,そちらの検討も進めたい.