FastSpeech2
Basic of tts: FastSpeech2
Abstract
Tacotron 같은 auto regressive TTS 모델과 달리, FastSpeech와 같은 Non-auto regressive TTS 모델은 Training/Inference speed 에 있어서 매우 큰 장점을 가지고 있습니다.
하지만 FastSpeech model은 Non-auto regressive model의 핵심 요소인 Duration predictor를 학습하는데에 있어서, Teacher model로부터의 distillation 방식으로 학습이 이루어지기 때문에 여러가지 한계점이 존재했습니다.
따라서 FastSpeech2 논문에서는 우수한 성능을 발휘하면서 기존 Fastspeech에서 가지고 있던 한계점과 문제점을 해결할 수 있는 새로운 방법을 제시합니다.
Paper: FastSpeech 2: Fast and High-Quality End-to-End Text to Speech
Github: unofficial github
Methods
FastSpeech2 에서는 이전 논문인 FastSpeech 의 문제점을 해결하는데에 중점을 두었으며 전체적인 contribution은 다음과 같습니다.
- Teacher - Student 구조의 학습 pipeline 대신 ground-truth mel-spectrogram을 직접 학습하는 구조를 차용하였습니다. FastSpeech 대비 3배에 달하는 학습 속도 향상을 이끌어냄과 동시에, Teacher model의 output 에서 이미 손실된 정보들을 사용하지 않기 때문에 Voice quality 또한 상승하였습니다.
- Duration, Pitch, Energy 등의 추가적인 Variation information을 학습시에 condition input으로 제공하였습니다. 이를 통해 Text↔Mel-spectrogram 의 One-to-many mapping 에 있어서 더 정확한 학습을 가능하게 하였습니다.
- 기존의 TTS model이 Mel-spectrogram 을 output으로 생성하고 이후 vocoder로 waveform을 생성하는것과 달리, FastSpeech2 에서는 음성 품질을 유지하면서 Text로 부터 직접 waveform을 생성하는 fully end2end 의 TTS model의 구조를 사용합니다.
1. Overall structure
Deep learning TTS 에 있어서 고질적인 문제는 text sequence 정보만 가지고는 pitch, duration, prosody 등의 요소에 의해 결정될 수 있는 여러가지 가능성을 올바르게 예측하기 어렵다는 것입니다.
FastSpeech2는 이러한 문제점을 해결하기 위한 Module 들로 구성되어 있으며 Phoneme Embedding - Encoder - Variance Adaptor - Mel-spectrogam/Waveform Decoder 의 순서를 따릅니다.
2. Encoder
Phoneme Embedding과 Encoder/Decoder 부분은 기존 FastSpeech 모델과 동일합니다.
-
Input phoneme data를 encoder의 input dimension으로 embedding을 해주고, Sinusoidal position encoding을 통해 위치 정보를 더해줍니다.
self.src_word_emb = nn.Embedding( n_src_vocab, d_word_vec, padding_idx=Constants.PAD ) #n_position = max_sequence_length + 1 self.position_enc = nn.Parameter( get_sinusoid_encoding_table(n_position, d_word_vec).unsqueeze(0), requires_grad=False, ) #max_len = input sequence length enc_output = self.src_word_emb(src_seq) + self.position_enc[ :, :max_len, : ].expand(batch_size, -1, -1)
-
이후 (4 in paper)개 의 FFT Block (multi-head self attention + 1D conv) 로 이루어진 Encoder를 통과시켜 줍니다.
for enc_layer in self.layer_stack: enc_output, enc_slf_attn = enc_layer( enc_output, mask=mask, slf_attn_mask=slf_attn_mask )
3. Variance Adaptor
Variance Adaptor는 encoder의 output에 여러가지 variance information을 더해주어 더 정확한 음성을 생성하도록 도와주는 역할을 합니다.
대표적인 Variance information으로는 1) 생성될 음성의 길이 정보인 Duration, 2) 음성의 emotion과 prosody를 결정하는데에 중요한 역할을 하는 Pitch, 3) 음성의 소리 크기와 prosody에 영향을 주는 Energy 가 있습니다.
그 밖에도 emotion, style, speaker 등 부가적인 feature들도 얼마든지 선택적으로 제공할 수 있습니다.
Variance Adaptor는 여러개의 Predictor가 중첩되어있는 구조를 가지고 있습니다.
Predictor는 1D Conv, ReLU, LayerNorm, DropOut으로 구성된 간단한 구조를 가지고 있습니다.
FastSpeech2의 학습 시에는 GT Variance information을 encoder의 output에 더해주어 올바른 음성을 예측하도록 학습시킴과 동시에 encoder의 output을 input으로 받아 해당 GT 값을 예측 하도록 Predictor를 학습시키게 됩니다.
2-1. Duration Predictor
Duration predictor는 phoneme hidden sequence 를 input으로 받아 각 phoneme의 duration을 예측합니다.
duration은 각 phoneme이 몇개의 mel-spectrogram frame에 할당되느냐를 나타내며, log scale로 된 duration을 MSE(L2) Loss 를 통해 학습하게 됩니다.
FastSpeech1 에서 pre-trained auto regressive TTS model (Transformer TTS) 의 output을 GT로 사용한것과 달리, 수리통계 기반 방식인 Montreal forced alignment(MFA) 를 통해서 얻은 Duration을 GT로 사용하여 더 정확한 학습을 가능하게 합니다.
랜덤으로 선택한 50개의 샘플에서, GT와의 길이차이와 음성 품질이 MFA 에서 더 좋은것을 확인할 수 있습니다.
2-2. Pitch Predictor
GT pitch contour의 high variations 때문에 Pitch contour 값을 올바른 분포로 바로 예측하는것은 어렵습니다.
따라서 FastSpeech2 논문의 업데이트된 버전(v8)에서는 Pitch contour를 바로 예측하는 것이 아니라 continuous wavelet transform(CWT) 을 통해 pitch spectrogram (frequency) 영역에서 예측 후 역과정을 취해주는 방식을 차용했습니다. (결과 확인 필요)
해당 과정을 통해 얻은 pitch 를 256 범위로 quantize하고 log를 취한 값을 embedding 하여 feature에 더해주게 됩니다.
2-3. Energy Predictor
Energy는 각 frame에 short-time fourier transform(STFT) 를 적용하여 나온 L2-Norm amplitude값을 사용하였습니다. 해당 값을 256 범위로 quantize 후 embedding 하여 feature에 더해주게 됩니다.
Predictor는 quantized 된 energy value가 아닌 original energy value를 예측하도록 MSE (L2) Loss를 통해서 학습됩니다.
Energy를 사용하지 않은 FastSpeech보다 FastSpeech2, FastSpeech2s 에서 GT와의 MAE가 더 작은것을 확인할 수 있습니다.
4. FastSpeech2s
FastSpeech2s 는 text 로부터 waveform 을 바로 예측하는 fully end2end 의 구조를 가지고 있습니다.
FastSpeech2 를 포함한 기존의 모델들이 output이 mel-sepctrogram인 acoustic model인것과 달리,
Fastspeech2s는 mel-spectrogram 생성 과정을 생략하고 바로 waveform을 예측하기 때문에 별도의 vocoder 가 필요 없다는 장점이 있습니다.
하지만 text로부터 waveform 을 직접 예측하는데에는 아래와 같은 어려움이 존재합니다.
- Waveform은 phase 등 mel-spectrogram에 비해서 더 많은 variance information을 가지고 있기 때문에 input과 output 사이의 information gap이 더 큽니다. 따라서 비교적 더 어려운 one2many problem을 해결해야 합니다.
- text에 대응되는 audio clip은 매우 긴 waveform을 가지기 때문에 학습/추론에 있어서 GPU memory를 매우 많이 소모합니다.
이러한 어려움을 해결하기 위해 FastSpeech2s 에서는 다음과 같은 waveform decoder를 제시합니다.
Waveform decoder가 hidden sequence로 부터 waveform을 만들때 필요한 phase 정보는 variance predictor 로 학습시키기 어렵다는 한계가 있습니다.
따라서 이를 해결하기 위해 mel-spectrogram decoder + vocoder(WaveNet)로 부터 생성된 waveform 을 target으로하는 adversarial training을 통해 waveform decoder를 학습합니다.
Conclusions
- FastSpeech2는 더욱 정확한 duration 정보와 pitch, energy 같은 부가적인 정보를 variance adaptor를 통하여 제공하여 기존보다 고품질의 음성 생성 능력을 학습하였습니다.
- 또한, FastSpeech2s 에서는 Waveform decoder를 통해서 Text2Waveform의 fully end2end TTS pipeline 에서 의미있는 성과를 달성하였습니다.