はじめに
Masuyama氏らによる位相復元手法 "Phase reconstruction based on recurrent phase unwrapping with deep neural networks"が2020年に提案されている.
本手法は,まずDNNで位相の微分(時間方向・周波数方向)を推定し,次に推定した微分に基づいて位相を再帰的に求める(積分する,アンラッピング)という2段階の処理からなる.位相が波形のずれに敏感という問題を回避しつつ,従来のDNNによる位相の直接推定(von Mises DNN)よりも高い精度で位相を推定することができる,というわけである.「位相を再帰的に求める」 recurrent phase unwrapping を指して,以降は本手法をRPUと呼ぶ.
ちなみに著者らの音声サンプルは以下で試聴できる.
本記事はRPUに基づく位相復元をPyTorchで実装し,再現実験に成功したのでそれを報告するものである.
手法
次式で表される二乗誤差最小化問題を再帰的に解くことで位相スペクトルを推定する.
ここで \( \pmb{\phi}_{\tau} \in \mathbb{R}^{K} \) が位相スペクトルであり,\( \tau\) は当該のフレーム番号を表す(\( K \) は周波数ビン数).\( | |\cdot ||_2\) はユークリッドノルムである.\( \mathbf{v}_{\tau -1} \in \mathbb{R}^{K} \) と \(\mathbf{u}_{\tau} \in \mathbb{R}^{K-1} \) はそれぞれ別個のDNNによって推定された瞬時周波数,群遅延である. \( \pmb{\phi}_{\tau - 1}^{\mathcal{W}} = \mathcal{W} (\pmb{\phi}_{\tau - 1}) \) は ラッピング演算子 \(\mathcal{W}(\cdot): [ \cdot + \pi ]_{\mathrm{mod} 2 \pi} - \pi \) により位相スペクトル \(\pmb{\phi}_{\tau - 1}\) がラップされていることを示している.
\( \mathcal{D}_{\omega}: \mathbb{R}^{K} \rightarrow \mathbb{R}^{K-1} \) は周波数方向の差分を計算する行列(線形写像)であり,次式で定義される \( (K-1) \times K\) サイズの上半二重対角行列(upper bidiagonal matrix)である.
位相スペクトル復元の具体的な更新式は次式で与えられる.
ただし\( \mathbf{I}_{K} \) は\( K \times K\) 単位行列である. \( \mathcal{D}_{\omega}^{\top} : \mathbb{R}^{K-1} \rightarrow \mathbb{R}^{K} \) は \( \mathcal{D}_{\omega}\) の転置行列で定義される写像である. \( \tilde{\mathbf{u}}_{\tau} \in \mathbb{R}^{K-1} \) は補正された群遅延であり,次式で計算される.
この補正は本質的である.推定された瞬時周波数と群遅延はそれぞれ \( 2 \pi \) の整数倍で不定性を持つため,適切に不定性を解消しなければ,後段の位相スペクトルの推定にも悪影響が出る.件の論文では瞬時周波数を固定し,群遅延を上式で修正することで不定性の解消を図っている.
実装
以下のリポジトリに置いた.Enjoy!
前回記事のvon Mises DNNと同様に,基本的な構造は全結合層からなるDNNである.位相の時間微分である瞬時周波数,周波数微分である群遅延を推定するDNNを別々に用意する.いずれも活性化関数はGeGLUである.RPUの論文では活性化関数にWaveNetと同様のgated activationを使用したと書いてあるが,GeGLUはずっと収束が早いので,こちらを採用した.
ファイル名 | 機能 |
---|---|
preprocess.py | 各種の前処理を実施するスクリプト |
dataset.py | データローダの構築を実施するスクリプト |
model.py | ネットワークを定義 |
factory.py | オプティマイザ,スケジューラ,loss関数を定義 |
training.py | モデルの訓練を実施するスクリプト |
evaluate_scores.py | 音質の客観評価指標を計算するスクリプト |
なおRPUのアルゴリズムはevaluate_scores.py内のcompute_rpu
関数内で実装している.
実験
JSUTコーパスのBASIC5000を訓練データに,ONOMATOPE300をテストデータに用いた.客観評価指標にSTOI, (wideband) PESQ,LSC (log-spectral convergence)を採用した.
音声の分析条件
計算機環境を示す。
計算機環境 | バージョンなど |
---|---|
OS | Ubuntu 22.04 |
CPU | Intel i9-9900K |
GPU | RTX2070 |
Python | 3.10.12 |
PyTorch | 2.2 |
訓練の基本的な設定は以下の通りである。
項目 | 設定 |
---|---|
ミニバッチサイズ | 256 |
エポック数 | 500 |
オプティマイザ | RAdam |
学習率 | 0.001から開始し,100エポックごとに0.8倍する |
勾配クリッピングのしきい値 | 10.0 |
音響特徴量の設定は以下の通りである。
項目 | 設定 |
---|---|
標本化周波数 | 16000Hz |
音響特徴量 | 対数振幅スペクトルおよび位相スペクトル |
分析窓 | ハン窓 |
FFTの窓長 | 512 |
フレーム長 | 512 |
フレームシフト | 128 |
実験結果
図1,図2,図3に各評価指標の箱ひげ図を示す.図中,"Amp"は位相スペクトルを定数値0と置いたもの,"vM"はvon Mises分布による位相復元手法を示す.また図1はDNNの出力直後の位相スペクトルを復元に利用し,図2および図3はGriffin-Limアルゴリズム(GLA)による事後処理的な位相補正を行ったときの結果である.それぞれGLAの繰り返し回数は10および100である.
図1より,RPUによる位相復元はvMを大きく上回る音質を実現していることが確認できた.GLAによる位相復元を重ねても,RPUが客観評価指標で一番良いものとなっている.スコアの分布を含め,これらの結果はRPUの論文とほぼ一致している.
以下,それぞれの復元音声サンプルを載せておく.GLAなしの”RPU”の音質の良さが際立っている.
- サンプル1
オリジナルの音声:
復元音声:
GLA | Amp | vM | RPU |
---|---|---|---|
0 | |||
10 | |||
100 |
- サンプル2
オリジナルの音声:
復元音声:
GLA | Amp | vM | RPU |
---|---|---|---|
0 | |||
10 | |||
100 |
おわりに
本記事ではRPUに基づく位相復元技術を実装した.評価実験により,RPUはvon Mises DNNから客観評価指標を大きく改善できることが確かめられた.RPUの後続となる位相復元手法は他にも多くあるので,色々と実装してみたい.
追記
RPUの後続となる「重み付きRPU」は以下の記事で実装した。