Skip to content

Instantly share code, notes, and snippets.

@tosaka2
Last active December 23, 2020 17:45
Show Gist options
  • Save tosaka2/30032cdd505fe7a66d91f14851e293e3 to your computer and use it in GitHub Desktop.
Save tosaka2/30032cdd505fe7a66d91f14851e293e3 to your computer and use it in GitHub Desktop.
DNNを用いたTTS手法の調査

TTSについて

以下の図がよくまとまっている。[1]
TTSの図

モデルによって音声合成の中でどこまでの仕事を担当しているかが異なる。  


DNNを用いないボコーダー

ボコーダー部分にはDNNを用いないことも多い。以下の2つはそこで用いられている代表的な物である。

逆短時間フーリエ変換(+Griffin-Limによる位相推定[15])

  • スペクトログラムを元に波形を生成する。

参考

  • [16] Griffin-Limに関する日本語の簡単な説明。

WORLD [16] (D4C edition [17])

  • 手法ではなくツールの名前。
  • 言語特徴量と音響特徴量を元に波形を生成する。

参考

  • [18] オープンソース(Pythonからも容易に利用可能)

DNNを用いたボコーダー

ボコーダー部分にDNNを用いる場合、主にWaveNetベースの物が使われる。

WaveNet[2]

  • ボコーダー。波形を直接生成するのが特徴。
  • 波形の生成は8bitで行う場合はμ-lawアルゴリズムによる量子化を行う。[3]
  • 生成された音声の品質は高い。
  • 生成が非常に重く、リアルタイム向きでは無い。学習にも時間がかかる。

参考

  • [19] 公式の解説ブログ。
  • [6] 日本語の解説と再現実装。
  • [7] メルスペクトログラムから波形を生成するボコーダー(後述)としての再現実装。かなり綺麗な音声が生成できている。

Parallel WaveNet[4]

  • WaveNetの順伝播を並列に行えるようにしたもの。
  • Google Assistantで使われているらしい。
  • 恐らくTPUを用いているので、エッジで十分な速度が出るかは微妙。
  • ParallelでないWaveNetを教師モデルとして知識蒸留することで訓練を行うので、WaveNetの学習済みモデルが必要。

参考

  • [5] 日本語の解説スライド。

DNNを用いたTTS手法の論文

以下ではボコーダー部分以外を担当するDNN系手法について述べる。
Deep Voice 2以外はSeq2Seqを用いている。

Tacotron [20]

  • 一応end-to-endのTTSシステム。内部でRNNを用いている。
  • 文字レベルの入力からスペクトログラムを出力し、それを逆短時間フーリエ変換(Griffin-Lim)して波形を生成する。逆短時間フーリエ変換部分がボコーダー。
  • 逆短時間フーリエ変換を微分可能になるように実装している。

参考

  • [7] 公式の音声サンプル。
  • [8] 再現実装。他にも色々な再現実装があるが、恐らくこれが最も高品質。しかし[7]と比べるとだいぶ品質が落ちる。学習時間は12日間ほど?
  • [9] 日本語の解説と再現実装。Tacotronの再現がかなり大変な事がわかる。

補足

  • 公式サンプルほど上手く行かない最も大きな原因は、おそらくデータセットの品質とハイパーパラメータの調整不足。
  • 再現実装では、元論文のように「逆短時間フーリエ変換を微分可能にしてend-to-endで学習する」のではなく、「データセットから前処理としてスペクトログラムを抽出しておき、それをターゲットとして学習する」ということをしているものばかりだった。公式の音声サンプルほど上手く行かない理由にはこのことも関連している可能性もある。
  • ただし、元論文通りの学習手法では、学習により多くの時間が必要になってしまうと思われる。
  • 最新版のTensorflowだと微分可能な逆短時間フーリエ変換が実装されているらしい。
  • [21] keithitoのソースコード(tensorflow)を元にしたchainerの自前実装。現状正しく動いていない。

Tacotron2 [22]

  • Tacotronで文字からスペクトログラムを出力し、それをWaveNetに入力して波形を出力する。(それぞれモデル構造の改良はある)
  • 実験では、2つのモデルはほとんど独立して訓練されている。(文字→スペクトログラム・スペクトログラム→波形)
  • 低頻度後には弱い。
  • リアルタイムな生成は難しい。
  • 学習も重い。(WaveNet部分の訓練に32GPU使っている)

参考

  • [23] 公式の解説ブログ。
  • [10] 公式の音声サンプル。かなり綺麗。
  • [11] Tacotron2の再現実装。
  • [12] 再現実装の生成音声(ページ下部)。ただしWaveNetは使わず、Tacotron部分のモデルをTacotron2にしているだけ。波形生成はGriffin-Lim。

Deep Voice 2[13]

  • 最初の図の通り、TTSシステムの書くモジュールの処理をDNNで行う。
  • Deep Voiceを複数話者で話せるように改良+モデル構造改良。
  • ボコーダーとしてWaveNetを使うことを初めて提案した?
  • TacotronのボコーダーにもWaveNetを導入し比較している。
  • Deep Voice 2の方が良いという主張。

参考

  • [1] 日本語の解説スライド。

Deep Voice 3 [24]

  • Deep Voice2とはかなり別物。
  • 文字からスペクトログラムを生成する。
  • 重要な点はRNNを廃してCNNを使っていることで、学習が並列化でき高速だということ。(Tacotronと同等以上の品質で一日程度で学習できると主張)
  • Vocoderは何を使っても良い。Griffin Lim, WaveNet, WORLD等。
  • WORLDで生成する場合、メルスペクトログラムにする前の出力をConverterと呼ばれるモジュールに入力し、WORLDで必要になる特徴量を出力する。
  • 複数話者データに対応。

参考

  • [25] 日本語の解説と再現実装

ETTTS [26]

  • Deep Voice 3と同じくCNNを用いた音声生成。
  • 訓練しやすいアイデアの導入(Guided Attention)。
  • 複数話者データには対応していない。
  • ボコーダーはGriffin Lim。
  • (時間単位で)解像度の低いスペクトログラムを出力→そのスペクトログラムを元に解像度の高いスペクトログラムを出力 という生成を行う。

参考

  • [27] 公式の音声サンプル
  • [28] 日本語の解説と実装
  • [29] 日本語のデータセット(JSUT)で訓練したモデルの出力と実装

VoiceLoop

  • テキストを音素列に変換(CMU pronouncing dictionary)してからモデルに入力する。
  • ボコーダーはWORLD。WaveNet等を試してみたが改善は見られなかったとのこと。
  • 複数話者に対応している。
  • Attentionを使った特殊な構造をしている。
  • "near real-time"で動作するとしている。(ただし"on an Intel Xeon E5 single-core CPU and x5 when on M40 NVIDIA GPU")

参考

  • [30] 公式音声サンプル
  • [31] 公式実装。CC-BY-NCライセンス。
  • [32] 日本語のデータセット(JSUT)で訓練したモデルの出力
  • JSUTで訓練した結果をETTTSと比べると、VoiceLoopの方が音質が良いように聞こえる。(ただし、ETTTSの精度もまだ上がると考えられる。)

所感

  • CNN系を用いないと学習時間が非常に長くなってしまい、実験が難しい。
  • ハイパーパラメータの調整でかなり精度が左右される。
  • 論文の実験と異なるデータセットを使う場合、論文に記載されているハイパーパラメータからさらに調整が必要。
  • モデル構造の細部が論文に書かれていないことが少なくないので、想像で補う必要がある。

その他

  • [33] GANを使った音声合成
  • [34] DNN音声合成のためのライブラリの紹介とDNN日本語音声合成の実装例

TODO

  • エッジで動かすのに適切なモデルを知るため、各モデルの音声合成(ボコーダ部分含む)速度を計測する。

参照

[1] NIPS2017報告 SPEECH & AUDIO https://www.slideshare.net/f2forest/nips2017-speech-audio-86474213

[2] Aaron van den Oord et al. WaveNet: A Generative Model for Raw Audio https://arxiv.org/abs/1609.03499

[3] 音声の生成と符号化 https://www.slideshare.net/akinoriito549/ss-23821898

[4] Aaron van den Oord et al. Parallel WaveNet: Fast High-Fidelity Speech Synthesis https://arxiv.org/abs/1711.10433

[5] [DL輪読会]Parallel WaveNet: Fast High-Fidelity Speech Synthesis https://www.slideshare.net/DeepLearningJP2016/dlparallel-wavenet-fast-highfidelity-speech-synthesis

[6] WaveNet - A Generative Model for Raw Audio [arXiv:1609.03499] - ご注文は機械学習ですか? http://musyoku.github.io/2016/09/18/wavenet-a-generative-model-for-raw-audio/

[7] Audio samples from "Tacotron: Towards End-to-End Speech Synthesis" https://google.github.io/tacotron/publications/tacotron/index.html

[8] keithito/tacotron https://github.com/keithito/tacotron

[9] Tacotron: Towards End-to-End Speech Synthesis / arXiv:1703.10135 [cs.CL] - LESS IS MORE http://r9y9.github.io/blog/2017/10/15/tacotron/

[11] keithito/tacotron Branch:tacotron2-work-in-progress https://github.com/keithito/tacotron/tree/tacotron2-work-in-progress

[12] keithito/tacotron issue90 keithito/tacotron#90

[13] Deep Voice 2: Multi-Speaker Neural Text-to-Speech https://arxiv.org/abs/1705.08947

[14] Deep Voice 3: 2000-Speaker Neural Text-to-Speech https://arxiv.org/abs/1710.07654

[15] D. W. Griffin and J. S. Lim, “Signal estimation from modified short-time Fourier transform,” IEEE Trans. Acoust. Speech Signal Process., 32, 236–243 (1984).

[16] https://www.jstage.jst.go.jp/article/jasj/72/12/72_764/_pdf

[16] M. Morise, F. Yokomori, and K. Ozawa: WORLD: a vocoder-based high-quality speech synthesis system for real-time applications, IEICE transactions on information and systems, vol. E99-D, no. 7, pp. 1877-1884, 2016.

[17] M. Morise: D4C, a band-aperiodicity estimator for high-quality speech synthesis, Speech Communication, vol. 84, pp. 57-65, Nov. 2016. http://www.sciencedirect.com/science/article/pii/S0167639316300413

[18] https://github.com/mmorise/World

[19] https://deepmind.com/blog/wavenet-generative-model-raw-audio/

[20] https://arxiv.org/abs/1703.10135

[21] https://github.com/tosaka2/tacotron

[22] https://arxiv.org/abs/1712.05884

[23] https://research.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html

[24] https://arxiv.org/abs/1710.07654

[25] https://r9y9.github.io/blog/2017/12/13/deepvoice3/

[26] https://arxiv.org/abs/1710.08969

[27] https://tachi-hi.github.io/tts_samples/

[28] https://r9y9.github.io/blog/2017/11/23/dctts/

[29] https://github.com/joisino/chainer-ETTTS

[30] https://ytaigman.github.io/loop/

[31] https://github.com/facebookresearch/loop

[32] https://soundcloud.com/hiromu-yakura/sets/voiceloop-jsut-epoch-53

[33] https://arxiv.org/abs/1709.08041

[34] http://r9y9.github.io/blog/2017/08/16/japanese-dnn-tts/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment