LoginSignup
1
0

More than 3 years have passed since last update.

WaveGlow 推論を C++ で実装するメモ 

Posted at

背景

いい感じの Text-to-speech をモバイルや IoT で動かしたい.
2019 年 12 月時点だと FastSpeech + WaveGlow が良さそう.

xcmyz's FastSpeech を CPU で推論して text-to-speech する
https://qiita.com/syoyo/items/c3ed70abf9ab6c37ac5d

Neural text to speech のメモ(2019 年 11 月 27 日時点)
https://qiita.com/syoyo/items/6b7faf99cbfc9e2e173a

-> WaveGlow を動かしたい.

libtorch mobile も出てきたが, 今後 mobile Vulkan などで動かすのを考えると, 一から C++ に移植しておきたい.

NVIDIA のオフィシャル実装(PyTorch)を移植していきます.

現状方針だけです. 成果物はありません.

方針

  • なるべく header-only なライブラリだけ使い, Eigen など規模が大きめなライブラリに依存しないようにする.
  • C++11 or later

参考情報

Glow 関連 

Glowの論文を読んだので要約とメモ
https://qiita.com/exp/items/4f562ec788f2ac5241dc

Glow をきちんと理解するには RealNVP, RealNVP を理解するには NICE を読んでおく必要がありますが, 推論だけだと実装コード自体は以外と簡単です. とりあえず実装してから, 論文を読んだ方が理解が捗るかもしれません.

CUDA 実装

CUDA + cuDNN + cuRAND での WaveGlow 推論実装
https://github.com/Saurabh-29/Waveglow_Inference_in_CUDA

移植についてのメモ

概要

  • 学習時には matrix の invert などが必要ですが, 推論時は不要です.
    • weight_norm の処理も不要です(推論時はネットワークから削除している).

PyTorch op 関連

Chainer で学習し TensorFlow-lite で推論するための準備メモ https://qiita.com/syoyo/items/e84d66b2a938843c1594

が PyTorch 関連の op にも適用できて事前知識として役立ちます.
(細かいところでは, 引数の振る舞いが違うとかあるかもですが)

torch.nn.ConvTranspose1d

いわゆる upsampling(画像で言えば拡大スケーリング)です. 1D なので, 自前実装は難しくはないです(実質フィルタ処理として書ける).

torch.nn.Conv1d

これも 1D なので, 特に難しくないです.

正規分布乱数の生成

C++11 random に正規分布に従う乱数生成があります.

データの変換とロード

text-to-speech への利用

WaveGlow は mel spectrogram -> .wav の部分なので,
text -> mel の部分(FastSpeech, Tacotron2, etc)も別途実装が必要です.
(text の処理周り(python inflect module の C++ 移植とか)のほうが, inference の実装よりめんどいかも...)

特に FastSpeech は Transformer 系なので, これを実装することで副産物(?)として BERT などの NLP も pure C++ で動かすことができると予想できます.

TODO

  • Mellotron を C++ 移植する
  • FastSpeech(Transformer) を C++ に移植する(=> BERT などにも使える)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0