声質変換論文まとめ3

WaveNet Vocoder with Limited Training Data for Voice Conversion, 2018_9

概要

複数話者コーパスと少数のターゲット音声を利用してWaveNet-Vocoderを構成する。
これによって行われる声質変換はSTRAIGHTなどの従来のボコーダーより優れていた。
VCC 2018で提出されたすべてのシステムの中で最高である4.13の平均自然度MOSを達成。

貢献

話者依存WaveNet-Vocoderは訓練に比較的多くのデータを必要とする。
話者非依存WaveNet-VocoderはSTRAIGHTなどの従来のボコーダーと同等の精度にとどまる。
複数話者コーパスと少数のターゲット音声で話者依存WaveNet-Vocoderを作成することでSTRAIGHTを超える性能を達成した。

提案概要

f:id:CH1008:20200529155248p:plain
VC using WaveNet-Vocoder
マルチスピーカーデータセットを使用した初期化モデルのトレーニングと、参照スピーカーの制限されたトレーニングデータを使用した適応という2つのステップが含まれます。本研究では、STRAIGHTボコーダーによって抽出された音響特徴(mel-cepstraおよびF0)を中間表現特徴として使用します。初期化モデルを取得するために、統合されたWaveNetボコーダーモデルが最初にマルチスピーカーデータセットでトレーニングされます。スピーカーの埋め込みベクトルで増強された音響特性は、条件入力として使用されます。
話者埋め込みベクトルが話者関連情報をキャプチャできることが期待されます。次に、これらの学習した話者埋め込みベクトルは破棄され、音響特性を処理するモデルパラメーターのみが、適応のための初期モデルパラメーターとして使用されます。適応ステップでは、参照スピーカーからのトレーニングデータを使用してすべての初期モデルパラメーターを更新することにより、スピーカーに依存するWaveNetボコーダーがトレーニングされます。

評価

VCC 2018優勝

関連研究

文脈事後確率に基づくmany2one VC
このフレームワークに近いらしい、話者非依存の音声情報抽出のための教師あり文字起こしあたり?

声質変換論文まとめ2

PARALLEL-DATA-FREE VOICE CONVERSION USING CYCLE-CONSISTENT ADVERSARIAL NETWORKS, 2017_12

概要

Cycle-GAN + Gated CNN でノンパラレル声質変換を行った。
客観的な評価により、変換された特徴シーケンスは、グローバル分散と変調スペクトルの点でほぼ自然であることがわかりました。主観的な評価により、変換された音声の品質は、ガウス混合モデルベースの方法で得られた、パラレルで2倍のデータ量の有利な条件下で得られる品質に匹敵することが示されました。

手法概要

f:id:CH1008:20200529112637p:plain
構造

損失として

  • Adversarial loss
  • Cycle-consistency loss
  • Identity-mapping loss

f:id:CH1008:20200529112758p:plain
Identity-mapping loss
を使用。

入出力

WORLD解析システムを用いて、24個のメルセプトストラル係数(MCEPs)、対数基本周波数(log F0 )、アペリオディシティ(APs)を5ms毎に抽出した。これらの特徴のうち、我々の手法を用いてMCEP領域のマッピングを学習した。F0は対数ガウス正規化変換を用いて変換した。APを変換しても音声品質に大きな影響を与えないことが先行研究で示されているため、アペリティはそのまま使用した。

Voice Conversion from Non-parallel Corpora Using Variational Auto-encoder, 2016_10

概要

ノンパラレルデータで学習するVAEを使用して声質変換を行う。
話者に依存しない音声表現を学習するエンコーダーと、指定された話者を再構成することを学習するデコーダーで構成されます。
以前のほとんどのモデルでは話者アイデンティティは暗黙的に扱われてきた(入力がソースで出力がターゲット的な区別のみ)が、本研究では話者アイデンティティを明示的に扱う。

手法概要

f:id:CH1008:20200529115756p:plain
手法概要

yが話者表現(one-hot vec)

入出力

STRAIGHTツールキット[21]を使用して、STRAIGHTスペクトル(略してSP)、非周期性(AP)、ピッチコンター(F0)などの音声パラメータを抽出しました。 FFTの長さは1024に設定されたため、結果のAPとSPはどちらも513次元でした。フレームシフトは5ミリ秒、フレーム長は25ミリ秒でした。コンテキストまたは動的機能を機能セットに組み込みませんでした。 SPのすべての入力フレームは単位和に正規化され、正規化係数(エネルギー)は独立した機能として取り出され、変更されませんでした。 SPは、提案された方法またはベースラインシステムを使用して変換されました。ベースラインシステムでは線形(非負)SPを使用したのに対し、提案した方法ではさらにSPに対数を適用したことに注意してください。すべてのシステムは、log-F0ドメインで同じ線形平均分散変換を使用してF0を変換しました。 APは変更されませんでした。スペクトル変換後、エネルギーはSPに補正され、STRAIGHTはすべてのパラメーターを取り込んで発話を合成しました。

実験

Voice Conversion Challenge 2016(並列データ)を使用。

  • 2人の話者についての並列だが非整列なデータ[VAE-pair]
  • 4人の話者についての並列だが非整列なデータ
  • 2人の話者についての非並列なデータ(使用データは半分になる)
  • ENMF-3000(base line)

の3条件で行った。

評価

mean Mel-cepstral distortion (MCD)はどの手法もほぼ同等
VAE-pairとENMF-3000の主観評価は音質、声質共にほぼ同等

声質変換論文まとめ1

Voice Conversion from Unaligned Corpora using Variational Autoencoding Wasserstein Generative Adversarial Networks, 2017_6

概要

非並列データ学習によるVAW-GAN(W距離を使用したVAE-GAN)の声質変換手法を提案する.

貢献

  • W-GANを非並列音声合成に導入し,なぜW-GANがこのタスクに適合するのかを明らかにする.
  • より現実的なスペクトルを合成するためのW-GANの能力を実証する.

手法概要

ソース音声より phonetic content vector z をVAEにより抽出し、 speaker representation vector y と組み合わせて vocoder に入力することで声質変換を行う.
なおphonetic content という用語は、音声が自然で、ノイズがなく、非感情的なものである場合にのみ有効である.

CVAEと同じ仕組みで z には speaker representation vector y のもつ情報以外が集約される(ことを期待する).

入出力

STRAIGHTツールキットを使用して、STRAIGHTスペクトル(略してSP)、アペリオディシティ(AP)、ピッチコンター(F0)を含む音声パラメータを抽出した.
FFTの長さは1024に設定されており、結果として得られるAPとSPはともに513次元であった。フレームシフトは5ms、フレーム長は25msとした.
対数エネルギー正規化SP(logSPenで示される)を[-1、1]の範囲で次元ごとに再スケーリングした.
SPを変換し、log-F0ドメイン上で同じ線形平均分散変換を用いてF0を変換した。APは変更せずに維持した。
STRAIGHTはこれらのパラメータを取り込んで発話を合成した.

訓練

初期はWGAN由来の損失を0にしてCVAEで訓練を行い base line model を得る.その後にWGANを付与して全体の訓練を行う.

結果

自然度のMOS結果は、VAW-GANがVAEベースラインを大幅に上回っていることを示した.
VAW-GANからの出力スペクトルは、周波数軸全体でより豊かな変動を表し、より明確な声と明瞭度の向上を反映している.

主観的な評価と一致しない結果が見つかったため、平均メルケプストラム係数などの客観的な評価は報告していない.
ただし、VCの文献では、これらの評価が人間の聴覚系と一致しない可能性が非常に高いため、同様の不一致が一般的.
話者類似性のパフォーマンスも、[https://www.citi.sinica.edu.tw/papers/yu.tsao/5650-F.PDF:title=[13]]とほぼ同じであることがわかったため、報告されていない.

議論

VAW-GANシステムの出力スペクトルは、VAEシステムの出力スペクトルと比較して分散が大きい.
良くない可能性があるが、高い値はVAW-GANが予測値を平均に集中しすぎないことを示している.

VAW-GANでのスピーカーモデリングの類似性が改善されない理由は、VAEとVAWGANの両方が同じPGM、つまり同じスピーカーモデルを最適化するという事実を思い出させる.
したがって、1つのグローバル変数でスピーカーをモデル化するだけでは不十分な場合がある.
フレーム単位の変数を使用してスピーカーをモデリングすると、音声ベクトルzと競合する可能性があるため、他のPGMに頼らなければならない場合がある.

気になる関連研究

音声認識を利用した声質変換

Statistical Voice Conversion with WaveNet-Based Waveform Generation, 2017_8

概要

ガウス混合モデル(GMM)に基づきソーススピーカーの音響特性をターゲットスピーカーの音響特性に変換し、話者依存型WaveNet vocoderに基づいて声質変換された音声を合成する.
WaveNetボコーダを用いた学習・合成のための音響特徴量の比較を行った.

f:id:CH1008:20200528155423p:plain
手法概要

実験

単純にターゲットmel-cepstrumで訓練したWaveNet VocoderにGMMで変換したmel-cepstrumを入れると精度があまり良くなかった.
これはGMMによるオーバースムーシング効果、この辺を緩和するテクニックをいくつか試している.
またGV(global variance)を考慮したモデルも実験している.

ARCTIC speech databaseを使用.

サンプリング周波数は16 kHzに設定されました。 STRAIGHT [14]は、スペクトルエンベロープを抽出するために使用されました。これは、1〜24番目のメルケプストラム係数にスペクトル特徴としてパラメーター化されました。フレームシフトは5 msでした。音源励振機能として、F0およびSTRAIGHT [27]で抽出された非周期成分を使用しました。非周期成分は、GMMでモデル化するために、0-1、1、2、2-4、4-6、および6-8 kHzの5つの周波数帯域で平均化されました。トレーニングには1028文を使用し、残りの104文は評価に使用しました。

評価

mel-cepstral dis- tortions (Mel-CD)
mean opinion score (MOS)

結果

音質は従来手法と同程度

提案手法は従来手法に比べてはるかに音質の良い変換音声を生成することができるが、これらの手法は時として深刻なうなり音を引き起こす。これらのバジーサウンドは、WaveNetボコーダーのトレーニングデータが少ないことに由来すると考えられます。

話者変換精度

4 : 6で従来手法に勝る

結論

本稿では,ガウス混合モデル(GMM)を用いた音声変換(VC)とWaveNetを用いた波形生成を用いて,音源話者の話者個性を対象話者の話者個性に変換する技術について述べる.本研究では、ガウス混合モデルを用いた音声変換(VC)における話者の個性の変換精度と音質を向上させるために、変換された音響特徴量(変換F0,変換アペリオディシティ,変換メルセプトラム)を条件としたWaveNetボコーダを用いた波形生成技術を提案した。
実験の結果,自然音響特徴量をモデル化に,GVを考慮した変換音響特徴量を合成に用いるWaveNetベースの波形生成技術は,音声変換チャレンジ2016に応募したNU-NAIST VCシステムと比較して,話者の同一性に関する変換精度が高く,同等の音質を実現できることが示された.
今後は、WaveNetベースの波形生成技術の安定性を可能にする技術の実装を予定している。

PytorchでDataParallelしたモデルの保存と読み込み

発端

PytorchでDataParallelしたモデルにシングルGPUで学習したパラメタを読み込もうとしたらエラーが出た。

原因

PytorchではDataParallelでモデルを包むと元のモデルがself.moduleに格納される。
そのためDataParallel後のモデルから見るとパラメタ名全てに"module."がついて元のモデルと対応が取れなくなる。
参考リンク

解決方法

モデルの保存時も読み込み時もDataParallelしてたらmoduleを参照すればいい。

モデル保存

if multi_gpu:
    model=model.module
torch.save(model.state_dict(),save_path)

モデル読み込み

if multi_gpu:
    model=model.module
model.load_state_dict(torch.load(load_path))

GAN実験2

GANのいろんなパーツについて効果を確認しながら実験していく記事の2

 

前回はGenerator:Discriminator=1:1で訓練してたらDiscriminatorが圧勝してしまったので、今回はDiscriminatorを抑えて実験してみる。

 

「Discriminator Lossが0.6以上の場合のみDiscriminatorを訓練」、「Discriminator Lossが0.3以上の場合のみDiscriminatorを訓練」の2パターンを実験した。

Discriminator LossにはBCE Lossを使っているので、Discriminatorの正答率は前者で55%、後者で74%くらいを維持することになる(Discriminator Lossは真画像、偽画像のLossを平均して計算している)。

 

以下結果

Discriminator Lossがそれぞれ0.6、0.3付近でウロウロしてたのでコントロールは上手くできていた。

 

f:id:CH1008:20200421144925j:plain

Discriminator Lossを0.6に維持(350epoch)

f:id:CH1008:20200421145032j:plain

Discriminator Lossを0.3に維持(350epoch)

明らかにDiscriminator Lossを0.6に維持した方が良い画像を生成できている。

学習の途中を見てても0.6の方が良かった(今度から学習過程をgifにしよかな...)。

前回のDiscriminatorに何も制限を加えないタイプと比べても、0.6は上手く学習が進んでいるように見える。

一方0.3は全体的なクオリティが低めだし、似たような画像を生成している(mode collapse)。

 

DiscriminatorはGeneratorと拮抗する位が良いのかなと思うものの、0.3と比べてDiscriminatorがさらに強い前回の方が良いのはなぜなのか?

このあたり次回にちょっと調査したい。

*2020/5/1追記

DiscriminatorとGeneratorの訓練比率を「Lossが0.3以上なら1:1、以下なら1:5」みたいにして最低でも5回に1回はDiscriminatorが訓練されるようにしてみた。Lossの動きは(300epoch付近まで)およそ同じだったが、まあまあ綺麗に生成できていた。おそらくGeneratorのみ学習し続けることがよくないのかもしれない。

 

残差接続とかHinge Lossとかspectral normalizationとか試したいのが多すぎる...

StyleGAN的な構造も試したい...

GAN実験1

GANのいろんなパーツについて効果を確認しながら実験していく記事の1

 

まずは最も基本ということでDCGAN。

勉強のために論文やらを見ながら自分でコード書いてみた。

とはいえGenerator、DiscriminatorともにConvolution -> Batch Norm -> (Leaky) ReLUを繰り返すだけです。

 

DatasetにはFFHQの128*128の顔画像を70000枚ほど。

顔に限られてるし枚数もそれなり、GANにとっては扱いやすいはず。

 

素直に実験してみた結果(250 epoch)。

f:id:CH1008:20200416122638j:plain

これはなかなか…

左端の下から二番目とか割といい気がするものの崩れてるのも多い印象(ゾンビっぽさがある)。

 

むしろ途中(127epoch)の方がいい画像を生成できてるかも。

f:id:CH1008:20200416123100j:plain

ちなみに同じ位置の画像は同じ潜在変数からの生成で、顔の感じはだいぶ変わってるけど向きとか性別、年齢はある程度保存されてる模様。

学習後半は表層的な部分のみ変化しているのかもしれない。

 

損失関数はBCE Lossで推移はこんな感じ。

f:id:CH1008:20200416124031p:plain

Discriminatorの損失

f:id:CH1008:20200416124108p:plain

Generatorの損失

やる前から予想はできてたけどDiscriminatorが圧勝してる。

BCE Lossが0.1くらいって事はDiscriminatorが90%正確に見分けられてるって事か…

ついでにGeneratorは最後の方で損失が急上昇してるから多分学習が失敗し始めている。

 

 

次回は安定化のためにDiscriminatorの学習を制限してほどほどの強さのまま競わせる実験をする予定。

使用コードもいずれ公開します(たぶん)。