본문 바로가기

audio/audio generation (tts)

[논문리뷰] Glow-TTS: A Generative Flow for Text-to-Speech via Monotonic Alignment Search (NeurIPS20)

제목: Glow-TTS: A Generative Flow for Text-to-Speech via Monotonic Alignment Search

저자: Jaehyeon Kim, Sungwon Kim, Jungil Kong, Sungroh Yoon

소속: Kakao Enterprise, Seoul National University

발표: NeurIPS 2020

논문: https://arxiv.org/abs/2005.11129

오디오샘플: https://jaywalnut310.github.io/glow-tts-demo/index.html

코드: https://github.com/jaywalnut310/glow-tts

 

- Glow-TTS
- flow를 사용하여 빠르게 TTS를 해보자.
- 그런데 별도의 aligner 모델을 따로 훈련하지 않고 이를 클래식한 dynamic programming으로 더 빠르고 간단하게 만들어보자. 어차피 이런 alignment하는데 옛날부터 사용되었던 알고리즘이니.
- 이렇게 찾은 monotonic & surjective alignment를 'hard'하게 사용하면 더욱 robust한 결과를 만들 수 있음. 
- flow방식이서 속도도 빠르지만 diverse한 여러가지 결과를 만들어볼 수도 있음.

Story

TTS에서는 text와 speech를 잘 맞추는(alignment) 것이 무척 중요함. Neural TTS가 대새가 되면서 Tacotron2[Shen18]나 Transformer TTS[Li19]같은 좋은 성능의 autoregressive model이 나왔고, 이들의 속도를 개선하기 위하여 FastSpeech[Ren19]나 ParaNet[Peng20]등이 나왔지만, alignment 부분에서는 여전히 autoregressive model을 사용하고 있어서 이 부분의 개선여지가 있음. 근데 전통적으로 이러한 alignment는 HMM이나 CTC등 dynamic programming을 기반으로한 방법을 사용하고 있었음. 이 아이디어들에 기반하면서도 좀 더 똑똑한 방법으로 alignment를 빠르면서도 잘 찾게 만들면 어떨까? 별도의 aligner를 사용하지 않고 한 모델에서 다 된다면 멋질 것 같음.

 

그런데 이런 생각을 여기서만 한건 아니겠지? 딱 이맘때쯤 AlignTTS[Zeng20], Flowtron[Valle20], Flow-TTS[Miao20]같은 이름도 아이디어도 비슷한 모델들이 소개되었음. 차이점을 보자면 AlignTTS는 flow-based가 아닌 feed-forward 방식이고, Flowtron과 Flow-TTS는 soft attention module을 사용하고 있음. generative flow를 사용하면서도 hard monotonic alignment를 사용하는 방식이 더 좋은 결과를 낼 수 있음.

 

Glow-TTS

일단 훈련과 인퍼런스시의 전체 구조는 아래와 같음. 

 

 

Training and Inference Procedures

텍스트 스퀀스 $c$가 조건으로 들어갔을 때 멜스펙트로그램 $X$의 분포, 즉 $P_X(x|c)$을 구하는 것이 목표. 일단 이것을 구하기 위하여 (conditional) prior distribution $P_z(x|c)$과 $z$를 $x$로 변화시키는 flow-based decoder $f_{dec}$를 생각해봄. 그러면 이들간의 관계는 아래와 같이 예쁘게 잘 정의되어 있음.

이 분포들을 모델링하기 위하여 네트워크 파라미터 세타와 alignment function $A$를 이용함. 먼저 prior distribution $P_Z$는 isotropic multivariate Gaussian 분포라고 가정하면 이제 여러 $\mu$와 $\sigma$가 필요할테고, 이들은 text encoder $f_{enc}$에 의해서 구할 수 있음. 즉 $f_{enc}$는 text condition $c$를 같은 길이의 $\mu$와 $\sigma$로 매핑하게 됨. alignment function의 역할은 스피치의 latent representation의 인덱스를 $\mu$와 $\sigma$에 매핑하는 역할을 함. 여기서 $A$는 monotonic(단조함수)하고 surjective(전사함수)라고 가정함. 이러면 반복하지도 않고 건너뛰지도 않을거임. 이제 prior 분포는 다음과 같이 생김.

 

자 이제 우리의 목표는 데이터의 log-likelihood를 최대화 하는 세타와 $A$를 구하면 됨. 이렇게 코롬.

 

하지만 역시나 그냥 바로 쉽게는 구할 수 없음. 따라서 이럴 때는 한번에 하나씩 구하는 방법을 이용할 수 있음. 즉 1) 먼저 현재 세타에서 가장 좋은 $A^*$를 구하고,

2) 이 $A^*$를 사용한 $\log P_X$를 최대화 시킬 수 있는 세타를 구함. 이를 반복적으로 하면서 두 파라미터를 점점 최적화시키는 방식. 사실 Viterbi 방식등에서 사용되는 유명한 방식임. 이러면 global solution이 보장되는 것은 아니지만 그래도 충분히 좋은 lower bound를 구할 수 있음.

 

그리고 추가적으로 인퍼런스시에 $A^*$를 찾기위해서 별도의 duration predictor $f_{dur}$를 훈련함. FastSpeech[Ren19]와 비슷하게 text encoder 위에 연결하고 MSE 로스로 훈련하게 됨. 이 predictor는 maximum likelihood objective에는 영향을 끼치지 않아야 하므로 stop gradient operator로 gradient가 흐르는걸 막음. 즉 duration predictor에 대한 로스 $L_{dur}$를 정리하면 다음과 같음

인퍼런스시에는 text encoder와 duration predictor로 prior distribution과 alignment를 구한 다음, prior distribution에서 latent variable 하나가 샘플링되고 flow-based decoder로 잘 변형되어 최종 멜스펙트로그램이 생성되게 됨.

 

Monotonic Alignment Search

monotonic alignment search (MAS)는 latent variable(즉 input speech)와 prior distributio의 statistics(즉 text) 사이의 가장 그럴듯한 monotonic alignment를 찾는 것을 의미함. 

 

먼저 위 그림에서 (a)가 찾고 싶은 alignment의 한 예임. monotonic하고 surjective한 시퀀스의 예. 만일 $Q_{i,j}$를 $i$와 $j$번째 element까지 주어졌을 때 maximum log-likelihood라고 한다면, $Q_{i,j}$는 recursive하게 $Q_{i-1,j-1}$와 $Q_{i,j-1}$로 정의됨.

 

만일 마지막 $z_j$와 $(\mu_i, \sigma_i)$가 align이 되었다면, 그 전에 $z_{j-1}$은 저 둘 중에 하나일 수 밖에 없기 때문임. 위 그림에서 (b)가 예를 보여주고 있음. 딱 봐도 dynamic programming 방식임. 이를 통해서 $Q$값을 구하고 backtracking으로 전체 시퀀스를 구할 수 있음(위 그림의 (c). 이 알고리즘 자체는 병렬적으로 돌릴 수는 없지만 CPU에서 빠르게 계산이 가능함. 실험에서는 한번 iteration이 20ms 정도, 전체 시간의 2%정도밖에 차지하지 않았음. 그리고 이 부분 계산은 훈려에만 필요하고 인퍼런스에서는 필요하지 않음.

 

Model Architecture

Decoder: 앞서 말했듯이 flow-based decoder임. 훈련시에는 멜스펙트로그램은 latent representation으로 표현해야 하고, 인퍼런스시에는 prior distribution을 다시 멜로 바꾸어야 함. 즉 양방향으로 모두 계산가능한 flow여야 하고 이를 위해 WaveGlow[Prenger19] 처럼 activation normalization, invertible 1x1 convolution, affine coupling layer로 구성됨.

계산을 더 효율적으로 하기 위하여 80채널 멜스펙트로그램 프레임을 160채널로 쉐입을 바꿔 사용함. 또한 1x1 convolution전에 피쳐맵을 40개의 그룹으로 나누어서 계산하는 등 속도 개선을 위한 몇가지 수정을 더함.

 

Encoder and Duration Predictor: encoder는 Transformer TTS[Li19]을 약간 변형하여 사용함. positional encoding대신 relative position representation을 사용하고, pre-net에 residual connection을 더했음. 그리고 encoder끝에 linear projection layer를 더하여 prior distribution의 파라미터를 구하도록했음. duration predictor의 구조는 FastSpeech와 동일함.

 

Experiments

데이터는 LJSpeech(13,100클립, 24시간)를 사용. 멀티스피커 세팅을 위해서는 LibriTTS에서 train-clean-100 서브셋(247 스피커, 54시간)을 사용. 또한 테스트용으로 out-of-distribution 텍스트 데이터를 이용하는데 해리포터 마법사의 돌 책의 처음 두 챕터를 이용. 비교를 위해서 Tacotron 2에 WaveGlow로 생성한 오디오를 이용. 

 

멀티스피커 버전을 위해서 speaker embedding을 더하고  hidden dimension을 늘렸음. speaker embedding은 디코더의 모든 affine coupling layer에 적용을 시켰음. 비교를 위해서 역시 Tacotron2에 encoder output에 speaker embedding을 더하였음.

 

Results

Audio Quality: AMT을 이용한 MOS는 다음과 같음.

여기서 T는 prior distribution의 standard deviation을 의미함(=temperature). WaveGlow를 사용한 모델의 upper limit을 4.19정도로 본다면, 제안한 모델이 (뜨겁거나 차겁거나 모두) Tacotron2보다 나은 결과를 보였음. 

 

Sampling Speed: 인퍼런스 시간은 머.. Glow-TTS는 상수임(40ms). Tacotron2은 sequential sampling을 하기 때문에 텍스트 길이에 따라서 선형증가. 그리고 Glow-TTS와 WaveGlow를 이용하여 1분 스피치를 생성하는데 약 1.5초정도가 걸렸음. 그런데 인퍼런스 시간은 Glow-TTS가 4%(단지 55ms), WaveGlow가 96%를 차지했음. 즉 대부분의 시간은 보코더가 잡아먹는다는 것을 알 수 있음.

 

Robustness: '해피포터 마법사의 돌' 텍스트로 생성한 오디오를 Google Cloud Speech-To-Text API를 이용하여 character error rate (CER)를 측정해보았음. Tacotron2는 텍스트 길이가 260을 넘어가는 순간 에러가 막 늘어났음. 반면 이 모델에서는 변함이 없었음. 롱 텍스트도 잘 된다는 의미. 

 

Diversity and Controllability: flow기반 방식이니 diverse한 샘플을 만들어낼 수 있을거임. latent representation $z$는 다음과 같이 표현될 수 있음.

여기서 $\mu$와 $T$는 prior distribution의 평균과 표준편차. $\epsilon$은 standard normal distribution에서 얻은 하나의 샘플을 의미함. 이제 $\epsilon$과 $T$를 변화시키면서 생성된 오디오의 피치를 한번 살펴보겠음.

즉 이 값들을 변화시켜 약간씩 다른 피치의 스피치를 만들어낸다는 것을 알 수 있음. 또한 이 모델에서는 duration predictor를 사용하기 때문에 여기서 나온 값에 어떤 값을 곱하여 결과 오디오의 길이를 변화시킬 수도 있음.

 

Multi-Speaker TTS

Audio Quality: 멀티 스피커 버전도 MOS를 구해봤음.

여기서는 $T$가 높을 때 보다 좋은 결과가 나왔고 역시 Tacotron 2를 이길 수 있었음.

 

Speaker-Dependent Duration: 위 그림 왼쪽은 같은 문장을 다른 스피커들이 생성한 오디오의 피치 값을 보여줌. 잘보면 스피커마다 텍스트의 duration에서도 약간씩 차이가 난다는 것을 볼 수 있음.

 

Voice Conversion: 목소리도 바꾸어봤음. 즉 스피커A의 멜 $X_A$ 에서 latent representation $z$를 계산하고 이를 다른 스피커B의 flow를 따라 $X_B$를 생성하여 다른 목소리를 만들 수 있음. 위 그림의 오른쪽이 그 예로, 스피커는 바뀌었지만 비슷한 형태의 피치 패턴이 나타나는 것을 알 수 있음.

 

 

Flow-based TTS의 좋은 예.
그리고 DP는 여전히 훌륭한 알고리즘이라는 것을 보여주는 또하나의 좋은 예.

 

  • [Shen18] J.Shen, R.Pang, R.J.Weiss, M.Schuster, N.Jaitly, Z.Yang, Z.Chen, Y.Zhang, Y.Wang, RJ S.Ryan, R.A.Saurous, Y.Agiomyrgiannakis, Y.Wu. Natural TTS synthesis by conditioning WaveNet on mel spectrogram predictions. ICASSP 2018. [논문리뷰]
  • [Li19] N.Li, S.Liu, Y.Liu, S.Zhao, M.Liu, M.Zhou. Neural speech synthesis with transformer network. AAAI 2019. [논문리뷰]
  • [Prenger19] R.Prenger, R.Valle, B.Catanzaro. WaveGlow: A flow-based generative network for speech synthesis. ICASSP 2019. [논문리뷰]
  • [Ren19] Y.Ren, Y.Ruan, X.Tan, T.Qin, S.Zhao, Z.Zhao, T.Y.Liu. FastSpeech: Fast, robust and controllable text to speech. NeurIPS 2019. [논문리뷰]
  • [Miao20] Chenfeng Miao, Shuang Liang, Minchuan Chen, Jun Ma, Shaojun Wang, and Jing Xiao. Flow-tts: A non-autoregressive network for text to speech based on flow. In International Conference on Acoustics, Speech and Signal Processing, pages 7209–7213, 2020.
  • [Peng20] [Peng20] K.Peng, W.Ping, Z.Song, K.Zhao. Non-autoregressive neural text-to-speech. ICML 2020. [논문리뷰]
  • [Valle20] Rafael Valle, Kevin Shih, Ryan Prenger, and Bryan Catanzaro. Flowtron: an autoregressive flow-based generative network for text-to-speech synthesis. arXiv preprint arXiv:2005.05957, 2020.
  • [Zeng20] Zhen Zeng, Jianzong Wang, Ning Cheng, Tian Xia, and Jing Xiao. AlignTTS: Efficient feed-forward text-to-speech system without explicit alignment. In International Conference on Acoustics, Speech and Signal Processing, pages 6714–6718, 2020.