重み付きRPUに基づく位相復元手法をPythonで実装した

はじめに

前回の記事でRPUに基づく位相復元手法を実装した.

tam5917.hatenablog.com

今回はRPUの後続手法「重み付きRPUに基づく位相復元手法」が提案されている下記の論文を参考に,Pythonで実装した.前回同様の位相復元実験を行ったところ,重み付きRPUに基づく手法はRPUを超える良好な音質を達成したので,その結果を報告するものである.

N.B. Thien, Y. Wakabayashi, K. Iwai and T. Nishiura, "Inter-Frequency Phase Difference for Phase Reconstruction Using Deep Neural Networks and Maximum Likelihood," in IEEE/ACM Transactions on Audio, Speech, and Language Processing, vol. 31, pp. 1667-1680, 2023. https://ieeexplore.ieee.org/document/10106067

  • Macユーザかつ Chromeで数式表示が崩れた場合はこの記事を参考に.

Google chrome で はてなブログ内のTeX の数式が乱れる方へ - Syleir’s note

手法

重み付きRPUは次式の二乗誤差最小化問題を再帰的に解くことで位相スペクトルを推定する.


\begin{align*}
{\pmb{\phi}}_\tau = \mathop{\rm arg~min}\limits_{\pmb{\phi} } \left\|  \sqrt{\mathbf{W}_{\tau-1}^{\mathrm{IF}}} (  {\pmb{\phi}} - {\pmb{\phi}}_{\tau-1}^{\mathcal{W}} -  \mathbf{v}_{\tau-1} ) \right\|_2^2 + \left\|  \sqrt{\mathbf{W}_{\tau}^{\mathrm{GD}}} (\mathcal{D}_\omega {\pmb{\phi}} -  {\mathbf{u}}_\tau ) \right\|_2^2
\end{align*}

ここで,\(\mathbf{W}_{\tau-1}^{\mathrm{IF}} \) と \(\mathbf{W}_{\tau}^{\mathrm{GD}} \) はそれぞれ瞬時周波数および群遅延の重みを表す対角行列(重み行列)である.サイズはそれぞれ \( (K-1) \times (K-1) \) と \( K \times K \) であり,対角成分はいずれも非負値をとる.ゆえに成分ごとに平方根を取ることができ,上式の表現となる.なお添字の \(\tau-1\) や \(\tau \) によって重み行列の対角成分がフレーム依存で変わりうることを示している.具体的な更新式は次式で与えられる.


\begin{align*}
  \pmb{\phi}_{\tau} =  \left(\mathbf{W}_{\tau-1}^{\mathrm{IF}} +\mathcal{D}_{\omega}^{\top}  \mathbf{W}_{\tau}^{\mathrm{GD}}\mathcal{D}_{\omega}\right)^{-1} \left\{ \mathbf{W}_{\tau-1}^{\mathrm{IF}} (\pmb{\phi}_{\tau - 1}^{\mathcal{W}} + \mathbf{v}_{\tau - 1}) +  \mathcal{D}_{\omega}^{\top} \mathbf{W}_{\tau}^{\mathrm{GD}}  \tilde{\mathbf{u}}_{\tau} \right\}
\end{align*}

以上の式中,重み行列以外の記号の意味については前回記事(Link)を参照せよ.

重み行列の対角成分に何を持ってくるかは選択の余地があり,対角成分自体をDNNで推定させる方法も提案されているが(Link),冒頭に示した論文ではべき乗つき振幅スペクトル \( |X_{k, \tau}|^{p} \) を採用している.すなわち,


\begin{eqnarray*}
 (\mathbf{W}_{\tau}^{\mathrm{IF}})_{i,j} &=&{\begin{cases} |X_{k, \tau}|^{p}, & \text{if}\, i = j = k \: (1 \leq k \leq K) \\ 0 & \text{otherwise} \end{cases}}\\
 (\mathbf{W}_{\tau}^{\mathrm{GD}})_{i,j} &=&{\begin{cases} |X_{k, \tau}|^{p}, & \text{if}\, i = j = k\: (1 \leq k \leq K-1)\\ 0 & \text{otherwise} \end{cases}}
\end{eqnarray*}

ただし\(|X_{k, \tau}|\) は 周波数ビン \(k\) ,フレーム \(\tau \) における振幅スペクトルである.また \(p \geq 1 \) である.実験では \( p = 5 \)とした.

実装

前回記事のリポジトリ実装済である.

github.com

evaluate_scores.py 内の compute_rpu 関数にRPUおよび重み付きRPUが実装されている.

上記位相スペクトルの更新式から分かるように,線形方程式系を解く必要がある.係数行列に注目すると, RPUの場合は \( \mathbf{I}_{K} + \mathcal{D}_{\omega}^{\top} \mathcal{D}_{\omega} \) ,重み付きRPUの場合は \( \mathbf{W}_{\tau-1}^{\mathrm{IF}} +\mathcal{D}_{\omega}^{\top} \mathbf{W}_{\tau}^{\mathrm{GD}}\mathcal{D}_{\omega} \) が対称な三重対角行列(symmetric tridiagonal matrix)になる.このように線形方程式系の係数行列が帯行列(band matrix)となる場合には,計算量を大幅に削減した効率的な算法の存在が知られている.冒頭の論文では,非三重対角な係数行列に対するガウスの消去法の計算オーダ \( O(K^{3}) \) から \( O(K) \) への計算量削減がなされる旨が言及されている.本実装ではscipy.linalg.solve_banded を採用した.ちなみに単純に scipy.linalg.solve を使う場合と比べて計算時間は半減した(あくまで体感).

参考

実験

JSUTコーパスのBASIC5000を訓練データに,ONOMATOPE300をテストデータに用いた.客観評価指標にSTOI, (wideband) PESQ,LSC (log-spectral convergence)を採用した.

音声の分析条件

計算機環境,ネットワークの構成や訓練の条件は前回記事と同様なので省略する.

実験結果

図1,図2,図3に各評価指標の箱ひげ図を示す.図中,"Amp"は位相スペクトルを定数値0と置いたもの,"vM"はvon Mises分布による位相復元手法を示す."wRPU"が重み付きRPUを示す.また図1はDNNの出力直後の位相スペクトルを復元に利用し,図2および図3はGriffin-LimアルゴリズムGLA)による事後処理的な位相補正を行ったときの結果である.それぞれGLAの繰り返し回数は10および100である.

図1:客観評価指標の箱ひげ図(GLAなし)
図2:客観評価指標の箱ひげ図(+GLA 10 iterations)
図3:客観評価指標の箱ひげ図(+GLA 100 iterations)

図1より,wRPUはRPUをも大きく上回る音質を実現していることが確認できた(やったぜ).特にPESQが4.0を超えたのは素晴らしい.図2と図3より,GLAによる位相復元を重ねても,wRPUが客観評価指標で一番良いものとなっている.

以下,それぞれの復元音声サンプルを載せておく.wRPUの音質の高さが素晴らしい.

  • サンプル1

オリジナルの音声:

復元音声:

GLA なし +10 iterations +100 iterations
Amp
vM
RPU
wRPU


  • サンプル2

オリジナルの音声:

復元音声:

GLA なし +10 iterations +100 iterations
Amp
vM
RPU
wRPU

おわりに

本記事では重み付きRPUに基づく位相復元手法を紹介した. Pythonにより実装し,位相復元実験を実施した.結果より,重み付きRPUは客観評価指標で最も良い音質を達成した.

Thien氏らの論文には位相復元手法のバリエーションがまだいくつか提案されており, 引き続きそれらの実装を進めてみたい.位相復元手法実装シリーズはしばらく続く.