shugo's kitchen

コンピュータサイエンスを美味しく調理していきたい

Whispered-to-voiced Conversion with GAN 論文まとめ

[tex: ]

前置き

前回に引き続きGANの論文を読んでいこうと思います。(元論文はここ) ざっくり言うと機械の発する声を自然にしようという研究で、研究自体は地味に思えますが声質変換などに応用が効くかもしれません。

モチベーション

  • 失声症患者の声を復元する手法の多くは、whispered(声帯が振動しない話し方)やmonotoneな音声を生成する。しかしwhisperedでは内容は伝わっても声の強弱による表現力に欠けるため、whisperedをvoised(声帯を振動させるいわゆる普通の喋り方)に変換するモデルが必要だ!
  • 従来の手法では発話音声から音響の特徴量を統計的に推定した上で、それらの特徴量をvocoderに与えて出力を合成すると言う間接的な手法が取られてきた。入力音声から直接出力音声が得られるように学習した手法の方がより正確な、あるいは自然な出力が得られるのではないか?
  • ってことでSEGAN(GANによるノイズ除去)の発展系として作りたい!

事前知識

speaker-dependent

システムを使う人のみに適応するモデル。使う人の声で学習するので、誰にでも使えるspeaker-independentなモデルよりも性能がいいらしい。今回のモデルはこれのようだ。iOSバイスを買うと最初のセットアップで”Hey, Siri”と何回か言わされるが、これもその一種なのだろうか。

deconvolution

convolution層では基本的に特徴マップのサイズは縮小される。この性質は観測対象から大事な情報だけを抽出した表現を得たい場合(今回で言うGeneratorのEncoder)にはうってつけだが、その表現から新しくデータを生成したい時(今回で言うDecoder)にはむしろサイズを大きくしたい。deconvolutionでは入力をpaddingによって十分に拡大してからconvolution層に通すことにより、出力のサイズが入力のそれを上回るようにした層である。これはconvolution層の誤差逆伝播の過程でも登場する。

アーキテクチャ

まずはSEGANについて

f:id:shugo256:20190804015532p:plain
SEGAN

  • SEGANはノイズ除去タスクにGANを適用したものであり、G(enerator)とD(iscriminator)から成る。
  • GはEncoderとDecoderからなっており、元のデータセットにノイズを加えたものを入力とし、出力が元の音源に近くなるよう訓練されることでノイズ除去を実現する。一次元convolution層からなるEncoderにより音声の圧縮表現cを得て、これを潜在変数(乱数)zと連結した後、deconvolution層からなるDecoderによって音声に戻す。ちなみにDecoderの各レイヤでは残渣接続みたいなノリで同じサイズのEncoderの途中のレイヤの出力をチャネル方向に連結している。(上図)
  • Dには元のデータセットそのままの音声(real)と元のデータセットの音源にノイズを乗せ、それをGに通してノイズ除去したもの(fake)を入力として与え、realを見分けるよう訓練する。この時real,fakeともに元音源にノイズを付加したものも入力として与える。realの場合は元の音声とそれにノイズを付加したもの、fakeの場合はGの出力と入力の組がDに与えられる。ちなみにDの内部はほとんどGのEncoderと同じで、activationがLeekyReLUだったり最後に全結合層があるという程度の違いのようだ。
  • 普通のGANと同様、GとDの損失関数はDの出力(Gではその反転を用いる)の交差エントロピーにより与えられるが、SEGANではGの損失関数にノイズ付加前のデータとGの出力の距離指標としてL1正規化項を加えている。これによってGのノイズ除去性能を直接最適化する項が追加されたことになる。元音源をdata、ノイズ付加処理をN(x)、Gに通す処理をG(x)と表せば、realは(data, N(data))、fakeは (G(N(data)), N(data))となり、fakeをrealに近づけると言うことが、G(x)をN(x)の逆関数(つまりノイズ除去)に近づけることに対応していることがわかる。
  • 通常のGANとの相違点として、普通は潜在変数のzがGの唯一の入力であり、これがGによって直接観測データ(例えば音声)に変換されるわけだが、今回はGにもう一つ別の音声(ノイズあり音声)が入力されていることから、zは直接音声データに変換されるのではなく、イメージとしてはノイズ除去ベクトルのようなものに変換され、それが入力ノイズあり音声に作用する結果としてノイズなし音声が出力されているのではないかということが考えられる。

SEGANとの相違点、改善点

  • 下図は今回のモデルにおけるGの図であり、上のSEGANの図と見比べることでSEGANのGと少し違うことがわかる。

f:id:shugo256:20190804015657p:plain
WSEGAN

  • まずGの入力はwhisperd(声帯を使わない発話音声)、出力はvoicedとし、whisperedに対応する自然な発話音声をnaturalとする。今回の実験ではwhisperdは実際にささやきを録音したものではなく、naturalを録音中の口や下の動きからRNNのシステムによって生成されたささやき音声であるので、同じ人が同じ文章について別々にnaturalとwhisperedの音声を録った場合よりも両者の関係は強いと考えられる。この時Dの入力はSEGANの時と同様にrealが(natural, whispered)の組であり、fakeが(voiced, whispered)となるが、今回はfakeにもう一つ新しいパターンを追加する。それは(natural, random_natural)である。random_naturalはnaturalなデータセットから無作為に選んだサンプルであり、これをfakeとして加えることにより、Gの出力がどんなに自然(natural)であっても、話した内容がGの入力(whispered)と異なってしまっては困ると言う効果が望まれる。
  • SEGANの時と比べてEncoderとDecoderのそうの数が減っていることがわかる。これはpoolingを2->4とした効果であり、このようにしたのは事前に行ったノイズ除去タスクでの実験でその方が良い結果になったからだそうだ。(じゃあなんでSEGANの時はそうしなかった...?)
  • Encoder-Decoder間のskip-connectionがただの連結から重み付き和になり、learnableとなった。理由は特に書いていないが、層の数が減った分ここにパラメータを割けるようになったということだろうか。
  • SEGANではGの損失関数にL1正規化項が含まれていたが、二つの信号の距離指標としてのL1ノルムは信号の各要素の一対一対応を仮定しており、例えば1フレームだけずれた全く同じ信号は別物として計算されてしまうので排除した。(misalignment)これにより出力の音声信号の振幅は簡単に爆発し、tanh活性化において勾配がほぼ0になってしまうことが考えられるので、L1ノルムの代わりとしてズレに寛容なスペクトルノルムを導入した。

方法と結果

実験方法

  • 健康なイギリス人男女6人に25分ずつCMUコーパスからランダム抽出した文章を読ませ、それを録音することでnaturalデータをえた。この際同時に口などの動きからささやき音声を生成するモデルを使用し、その出力をwhisperedとした。このwhieperedにおいてそれぞれの性別から一番明瞭で聞き取りやすい人を一人ずつ選び、この二人についてそれぞれspeaker-dependentなモデルを構築した。

結果

  • 元音源(natural)とモデルの出力において各pitch(周波数)がどれだけ現れたかを表すヒストグラムである。(左が男、右が女)なおRNN baselineは大義名分のところで述べた従来の手法によるものである。

f:id:shugo256:20190804015929p:plain
Result

  • 男女ともにbaselineよりもvoicedの方が幅(分散)が大きくなっており、naturalに近いものとなっていることがわかる。baselineのように分散が小さい音声はロボットのような声になってしまうようで、今回のモデルはより自然に近い声を生成できていたことがわかる。
  • 下図は左から順にnatural, whispered, voicedの波形とスペクトログラムである。

f:id:shugo256:20190804020023p:plain
Waves

  • これを見ればいかにgeneratorが低周波成分を修正し、高周波なノイズを除去できているかがうかがえるらしい。(うーん...)
  • なんか結果を見せられても納得いかなかったが、実際の音声を使ったデモがここで公開されていて、割と綺麗な音声に復元できていることがわかった。 whisperedはささやきというより天龍源一郎であった。

まとめ

  • SEGANにおけるmisalignmentの問題を、L1ノルムをなくすことにより解決した上で、L1ノルムの元々の存在意義であった振幅爆発の予防策としてスペクトルノルムを導入した。
  • そのほかにもfakeのパターンの追加、learnableなskip-connection、poolingの変更などによってSEGANよりも一段上のwhisperd-to-voicedというタスクをクリアした。
  • GANがデータそのものではなくてノイズ除去という動作を生成しているという点が面白かった。
  • 今回のモデルはあくまで失声症の人の口の動きなどからささやき音声を出力してくれる別のモデルがあってこそ役に立つものであり、End-to-endとは言いつつも実際はそうではない。
  • どうせなら口の動きからnaturalな音声を復元するモデルを作ればいいのにと思ったら、Conculusionsに今後の課題としてあげられていた。

参考

論文

SEGAN: Speech Enhancement Generative Adversarial Network

Evaluation of a Silent Speech Interface based on Magnetic Sensing and Deep Learning for a Phonetically Rich Vocabulary

ウェブサイト

Speaker Dependent / Speaker Independent

【理論とイメージ】CNNの誤差逆伝播とDeconvolutionまとめ - Qiita

実装

Pytorch実装: https://github.com/santi-pdp/segan_pytorch