背景
いい感じの 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 に正規分布に従う乱数生成があります.
データの変換とロード
- .wav : dr_wav を使います.
- npy, npz : https://github.com/rogersce/cnpy を使います. fork していくらか使いやすくしたのが https://github.com/rogersce/cnpy にあります
- .pt からウェイトの取得 : Waveglow_Inference_in_CUDA のツールを利用して, npy に変換します.
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 などにも使える)