qcoding

[AI논문리뷰] VITS - VAE + Flow + GAN으로 사람 수준 음성을 단일 모델에서 직접 합성 본문

AI논문리뷰-음성인식TTS

[AI논문리뷰] VITS - VAE + Flow + GAN으로 사람 수준 음성을 단일 모델에서 직접 합성

Qcoding 2026. 5. 1. 09:13
반응형
논문  Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech 저자  Jaehyeon Kim, Jungil Kong, Juhee Son (Kakao Enterprise) 학회/연도  ICML 2021 arXiv  2106.06103 데모  VITS Demo Page

📄 한 문단 요약

VITS는 TTS 파이프라인의 두 단계(음향 모델 + vocoder)를 완전히 하나로 합친 첫 번째 실용적 시스템이다. Conditional VAE로 잠재 표현을 학습하고, Normalizing Flow로 prior를 풍부하게 만들고, HiFi-GAN 디코더로 파형을 직접 생성하며, Stochastic Duration Predictor로 자연스러운 음절 길이 다양성을 확보한다. LJSpeech에서 MOS 4.43으로 ground truth(4.46)와 사실상 동률이면서, 동급 two-stage 시스템 대비 합성 속도는 2.4배 빠른 67×RT를 달성했다.

이 논문은 무엇을 해결하려고 했나?

Tacotron 2·FastSpeech 2 같은 TTS 시스템은 모두 두 단계로 설계된다. 첫 번째 단계는 텍스트 → mel spectrogram을 만드는 음향 모델이고, 두 번째 단계는 mel spectrogram → waveform을 만드는 vocoder(HiFi-GAN, Parallel WaveGAN 등)다. 이 설계는 직관적이지만 두 가지 비용이 따른다.

첫째, 두 모델을 별도로 학습하고 관리해야 한다. Vocoder를 fine-tune 하려면 음향 모델 출력 mel로 별도 학습이 필요하고, 배포 시에도 두 모델을 메모리에 올려야 한다.

둘째, 중간 표현인 mel spectrogram이 병목이다. 음향 모델이 mel을 잘못 예측하면 vocoder가 복구할 수 없고, mel 자체가 위상(phase) 정보를 버리는 손실 표현이라 vocoder가 phase를 추정해야 한다. 이 병목을 없애는 방법은 텍스트에서 waveform을 직접 생성하는 것인데, 두 단계를 단순히 이어붙이면 역전파 신호가 vocoder에서 음향 모델로 전달되지 않아 공동 학습이 어렵다.

VITS의 핵심 질문: 두 단계를 수학적으로 일관된 하나의 목적 함수 아래 통합할 수 있는가? 답은 CVAE(Conditional VAE)다. 잠재 변수 z를 중심에 두고, posterior는 waveform에서 z를 인코딩하고, prior는 텍스트에서 z를 예측한다. Decoder는 z에서 waveform을 생성한다. 이 구조에서 ELBO 최대화가 곧 "텍스트에서 자연스러운 음성으로"의 학습 목표가 된다.

배경지식과 핵심 키워드

VAE (Variational Autoencoder)
데이터 x를 잠재 변수 z로 인코딩하고(posterior q(z|x)), z에서 x를 복원하는(likelihood p(x|z)) 생성 모델이다. 학습 목표는 ELBO(Evidence Lower Bound): log p(x) ≥ E[log p(x|z)] - KL(q(z|x) ‖ p(z)). 첫 항은 재구성 손실, 두 번째 항은 posterior와 prior의 KL divergence다. VITS에서 z는 텍스트와 음성을 이어주는 잠재 표현이며, posterior는 음성(선형 스펙트로그램)에서, prior는 텍스트에서 z를 만든다.
Normalizing Flow
단순한 분포(예: 가우시안)를 복잡한 분포로 변환하는 가역 변환 f의 시퀀스다. 각 변환이 가역적이므로 likelihood를 정확히 계산할 수 있다. p(z) = N(f(z); μ, σ) × |det(∂f/∂z)|. VITS에서는 텍스트 prior p(z|c_text)를 Flow로 표현해 단순 가우시안보다 훨씬 풍부한 분포를 만든다. Ablation에서 Flow를 제거하면 MOS가 4.43 → 2.98로 폭락한다. Flow가 VITS 품질의 핵심 요소라는 뜻이다.
Monotonic Alignment Search (MAS)
텍스트(phoneme)와 오디오 잠재 표현(z) 사이의 alignment를 외부 aligner(MFA) 없이 학습 중에 추정하는 알고리즘이다. 제약 조건은 두 가지: (1) 단조 증가(monotonic) - 텍스트는 앞에서 뒤로만 읽힌다, (2) 건너뜀 없음(non-skipping) - 모든 음소가 최소 하나의 프레임에 대응한다. ELBO를 최대화하는 alignment A*를 동적 프로그래밍으로 찾는다. FastSpeech 2가 외부 MFA에 의존했던 것을 VITS는 내부에서 해결한다.
Stochastic Duration Predictor
각 음소가 몇 프레임 동안 발음될지를 확률 분포로 예측하는 모듈이다. FastSpeech 2의 결정론적(deterministic) Duration Predictor와 달리, 동일 텍스트에도 매번 다른 길이가 나올 수 있다. Flow 기반 모델로 구현되며, variational dequantization(u ∈ [0,1))으로 이산 duration 값을 연속 분포로 변환한다. 이 확률적 설계가 "같은 문장도 매번 조금씩 다르게 발화되는" 자연스러운 TTS의 핵심이다.
HiFi-GAN Decoder
VITS의 Decoder는 HiFi-GAN V1 generator 구조를 그대로 쓴다. Transposed convolution으로 upsampling 후 Multi-Receptive Field Fusion(MRF) 모듈이 다양한 receptive field에서 패턴을 잡는다. 차이점은 입력이 mel spectrogram이 아닌 잠재 변수 z라는 점이다. HiFi-GAN Discriminator(Multi-Period Discriminator)는 그대로 adversarial 학습에 사용된다. 즉 VITS는 HiFi-GAN을 vocoder로 외부에서 붙이는 게 아니라, 내부 컴포넌트로 통합했다.
WaveNet Residual Block (Posterior Encoder)
VITS의 Posterior Encoder는 선형 스펙트로그램(linear-scale spectrogram)을 입력받는 16개의 WaveNet 잔차 블록으로 구성된다. 선형 스펙트로그램을 쓰는 이유: mel 스펙트로그램은 주파수 resolution이 낮아 정보 손실이 있다. Ablation에서 posterior 입력을 mel로 바꾸면 MOS가 4.43 → 4.31로 하락한다. 더 많은 주파수 정보를 posterior에 주어야 z가 풍부해진다.
ELBO (Evidence Lower Bound)
VAE 학습의 핵심 목표 함수다. log p(x|c) ≥ E_q[log p(x|z)] - KL(q(z|x,c) ‖ p(z|c)). 좌변은 직접 최적화하기 어려우므로 우변(lower bound)을 최대화한다. VITS의 ELBO = (mel 재구성 손실) - (KL divergence). 실제로는 mel 재구성 대신 adversarial loss와 feature matching loss를 써서 음질을 높인다. KL 항은 posterior(오디오에서 추출)와 prior(텍스트에서 예측)가 비슷해지도록 강제한다.
CMOS (Comparative MOS)
특정 시스템을 기준(0.000)으로 다른 시스템의 상대적 품질을 측정하는 주관 평가 지표다. MOS보다 평가자 간 기준 차이를 줄일 수 있다. VITS 논문에서는 ground truth를 기준으로 CMOS를 측정했다. LJSpeech CMOS -0.106, VCTK CMOS -0.262. Ground truth와의 차이가 0.1 수준이라는 것은 사실상 사람 수준에 근접했다는 의미다.

핵심 인사이트

FastSpeech 2가 "pitch/energy 같은 variance를 명시적으로 주입"해서 품질을 올렸다면, VITS는 "VAE 잠재 공간이 그 variance를 스스로 학습"하게 만든다. 외부에서 특징을 설계하는 대신, 데이터에서 자연스럽게 표현을 학습하는 방향이다. 이 차이가 VITS가 MFA 같은 외부 aligner 없이도 alignment를 학습할 수 있는 이유다.

기존 방법의 한계

Two-stage 파이프라인의 정보 병목: Tacotron 2·FastSpeech 2 + HiFi-GAN 조합은 mel spectrogram에서 정보가 잘린다. 특히 위상(phase) 정보가 없어 vocoder가 이를 추정해야 한다. VITS는 z → waveform의 직접 경로를 만들어 이 병목을 우회한다.

결정론적 duration의 단조로움: FastSpeech 2의 Duration Predictor는 동일 텍스트에 항상 같은 길이를 내놓는다. 실제 사람 음성은 같은 문장도 매번 미묘하게 다른 리듬으로 발화된다. VITS의 Stochastic Duration Predictor는 매 추론마다 다른 duration sample을 뽑아 자연스러운 다양성을 만든다.

외부 aligner 의존성: FastSpeech 2는 MFA를 외부에서 실행해야 한다. 새 언어나 화자로 확장할 때 발음 사전과 음향 모델이 별도로 필요하다. VITS는 MAS로 alignment를 내부에서 학습해 이 의존성을 제거한다.

단순화된 Prior: 대부분의 VAE 기반 TTS는 prior를 단순 가우시안으로 가정한다. 텍스트의 의미적 다양성을 단순 가우시안으로 표현하기엔 표현력이 부족하다. VITS는 Normalizing Flow로 prior를 복잡한 분포로 변환한다. 이 설계 없이는 MOS가 4.43 → 2.98로 폭락한다.

제안 방법의 핵심 아이디어

VITS의 핵심은 세 가지 아이디어의 결합이다.

1) CVAE로 두 단계를 하나의 목표 함수로 묶기: Posterior encoder가 오디오(linear spectrogram)에서 z를 추출하고, prior가 텍스트에서 z를 예측하며, decoder가 z를 waveform으로 복원한다. 학습 시에는 posterior z를 decoder에 넣어 waveform을 재구성하고, 추론 시에는 prior z를 샘플링해서 waveform을 생성한다. ELBO 최대화가 자동으로 두 단계를 조율한다.

2) Normalizing Flow로 prior 표현력 확대: 텍스트 encoder 출력에서 가우시안 파라미터(μ, σ)를 예측하고, 4개의 affine coupling layer로 이 분포를 변환해 복잡한 z 분포를 표현한다.

3) Adversarial training으로 파형 품질 확보: 재구성 손실(L1 mel)만으로는 실제 녹음 수준의 음질이 안 나온다. HiFi-GAN의 Multi-Period Discriminator가 생성 파형과 실제 파형을 구별하도록 학습되면서, generator(VITS decoder)는 더 자연스러운 파형을 만들도록 강제된다.

모델 구조/알고리즘 흐름

학습 시 (Figure 1a 참조):

  1. 텍스트(phoneme c_text) → Text Encoder(Transformer) → h_text
  2. 오디오(linear spectrogram x_lin) → Posterior Encoder(16× WaveNet residual block) → 192ch latent
  3. h_text → Projection → μ_θ, σ_θ (prior 파라미터)
  4. Latent → MAS (μ_θ, σ_θ와 비교해 최적 alignment A 탐색) → duration d
  5. Posterior latent z를 Flow f_θ 역방향으로 통과 → f_θ(z) (KL 계산용)
  6. Duration predictor loss 계산 (h_text로부터 d 예측, stop-gradient)
  7. z를 Slice해서 32-frame 윈도우 → Decoder(HiFi-GAN) → ŷ (waveform)
  8. 총 손실: L_recon(mel L1) + L_kl + L_dur + L_adv(G) + L_fm(G)

추론 시 (Figure 1b 참조):

  1. c_text → Text Encoder → h_text
  2. h_text → Stochastic Duration Predictor(+noise) → d (확률적 샘플링, ceil로 정수화)
  3. h_text → Projection → μ_θ, σ_θ
  4. μ_θ, σ_θ로부터 z 샘플링 → Flow f_θ⁻¹ 역방향 → f_θ(z)
  5. f_θ(z) → Decoder → raw waveform

핵심 차이: 학습 시에는 오디오에서 posterior z를 직접 뽑지만, 추론 시에는 prior에서 z를 샘플링한다. Flow가 이 두 분포를 최대한 가깝게 만들어야 하므로 KL 항이 중요하다.

논문 그림/표로 이해하기

Figure 1 (a) — 학습 절차: Posterior Encoder가 오디오에서 z를 추출

VITS Figure 1a: 학습 절차 — Posterior Encoder, MAS, Flow, Decoder 흐름
원문 Figure 1 (a) Training procedure. 출처: Kim et al., "VITS", ICML 2021. arXiv:2106.06103 — arXiv 라이선스 하에 인용.

왼쪽 상단부터 읽으면: Linear spectrogram x_lin → Posterior Encoder → 잠재 z. 동시에 Phoneme → Text Encoder → Projection → μ_θ, σ_θ. MAS가 두 표현 사이의 alignment A와 duration d를 추정한다. z는 Flow f_θ를 역방향으로 통과해 prior와의 KL을 계산하고, 32프레임 slice 후 Decoder(HiFi-GAN)로 waveform ŷ를 생성한다. Stochastic Duration Predictor는 h_text에서 d를 받되 stop-gradient로 역전파를 차단한다.

Figure 1 (b) — 추론 절차: Prior에서만 동작, Posterior 없음

VITS Figure 1b: 추론 절차 — Prior 샘플링과 역방향 Flow
원문 Figure 1 (b) Inference procedure. 출처: Kim et al., "VITS", ICML 2021. arXiv:2106.06103 — arXiv 라이선스 하에 인용.

추론 시에는 오디오가 없으므로 Posterior Encoder가 사라진다. Stochastic Duration Predictor가 noise를 샘플링해 각 phoneme duration d를 결정한다. Prior에서 샘플링한 f_θ(z)를 Flow의 역방향(f_θ⁻¹)으로 통과시켜 decoder 입력 z를 만든다. 화살표의 다양한 색상은 multi-speaker 설정에서 각 화자 임베딩이 서로 다른 z 분포로 이어짐을 나타낸다.

Figure 5 (일부) — Stochastic Duration Predictor 구조

VITS Figure 5: Stochastic Duration Predictor 아키텍처
원문 Figure 5 (일부). 출처: Kim et al., "VITS", ICML 2021. arXiv:2106.06103 — arXiv 라이선스 하에 인용.

Neural Spline Flow를 쌓아서 만든 duration 분포 모델이다. 이산 duration d를 variational dequantization(u ∈ [0,1))과 data augmentation(ν)으로 연속 분포로 변환한다. 학습 시에는 실제 d와 noise를 입력으로 받고, 추론 시에는 noise만 샘플링해서 duration을 생성한다.

실험 설정과 결과 해석

LJSpeech (단일 화자, 영어):

모델 MOS 95% CI 속도
Ground Truth 4.46 ±0.06
Tacotron 2 + HiFi-GAN (fine-tuned) 4.25 ±0.07
Glow-TTS + HiFi-GAN (fine-tuned) 4.32 ±0.07 27.48× RT (606 kHz)
✦ VITS (stochastic) 4.43 ±0.06 67.12× RT (1480 kHz)
VITS (deterministic) 4.39 ±0.06 90.93× RT (2005 kHz)
논문 Table 1 재구성. LJSpeech, V100 단일 GPU 기준.

VITS stochastic(4.43)은 Ground Truth(4.46)과 통계적으로 유의미한 차이가 없다. CMOS -0.106은 평가자 500명이 ground truth와 VITS를 구별하기 어려웠다는 뜻이다. 속도는 Glow-TTS + HiFi-GAN(27.48×) 대비 2.4배 빠른 67.12×. 두 모델을 따로 실행하지 않아도 되기 때문이다.

VCTK (109화자, 다화자): VITS MOS 4.38, Ground Truth 4.38 — 사실상 동점. Tacotron 2 + HiFi-GAN(3.19), Glow-TTS + HiFi-GAN(3.82)을 크게 앞선다. 다화자 설정에서 VITS의 우위가 더 두드러진다.

Ablation 핵심:

  • Normalizing Flow 제거: 4.43 → 2.98 (가장 큰 기여)
  • Posterior를 mel spectrogram으로 변경: 4.43 → 4.31 (선형 스펙트로그램이 더 풍부한 정보 제공)

핵심 인사이트

VITS의 MOS가 ground truth(4.46)와 0.03 차이에 불과한 건 "단일 화자, 깨끗한 스튜디오 녹음, 영어"라는 최적 조건이 맞아떨어진 결과다. 실제 배포 환경(다양한 도메인 텍스트, 노이즈 있는 데이터, 언어 확장)에서는 MAS alignment 품질과 prior 표현력이 여전히 도전 과제다.

한계와 비판적 관점

학습 불안정성: VAE + Flow + GAN + Duration predictor를 동시에 학습한다. 각 손실 항의 가중치가 학습 안정성에 민감하다. 특히 KL annealing 없이 시작하면 posterior collapse(z가 prior에 무시되는 현상)가 발생할 수 있다.

메모리와 학습 시간: 800k step, V100 4대 기반 학습이 필요하다. 단일 GPU 환경에서는 windowed training(32프레임 세그먼트)으로 줄이더라도 메모리 압박이 크다.

다국어·저자원 확장의 어려움: MAS가 외부 aligner를 대체하지만, 여전히 충분한 데이터(보통 10~20시간 이상)가 있어야 alignment가 수렴한다. 저자원 언어에서 MAS가 alignment를 잘못 학습하면 음질이 급격히 나빠진다.

Zero-shot speaker adaptation 미지원: 논문 범위가 seen speaker 학습에 집중됐다. 목소리 프롬프트 하나로 새 화자를 합성하는 zero-shot은 VITS 기반 후속 연구(YourTTS, Coqui TTS 등)에서 확장됐다.

구현하거나 응용한다면 무엇을 봐야 하나?

공식 구현: jaywalnut310/vits (PyTorch). VCTK와 LJSpeech 레시피 포함. RTX 3090 단일 GPU로도 학습 가능하지만 800k step 학습에 수일이 걸린다.

한국어 적용: CjangCjengh/vits 레포지토리가 한국어를 포함한 다양한 언어 학습 레시피를 제공한다. 한국어는 G2P 전처리와 음소 사전이 필요하다.

Coqui TTS 통합: Coqui TTS 프레임워크에 VITS가 내장돼 있어 tts --model_name tts_models/en/ljspeech/vits로 바로 사용 가능하다.

Speaker conditioning 추가: 화자 임베딩(x-vector, d-vector 등)을 Text Encoder와 Posterior Encoder에 주입하면 다화자 VITS를 만들 수 있다. VCTK 학습 코드를 참조.

핵심 하이퍼파라미터: hidden ch 192, flow 4 layers, WaveNet residual block 16개, AdamW lr 2e-4, decay 0.999^(1/8) per epoch, windowed training 32프레임.

한 줄 결론과 다음에 읽을 논문

VITS는 VAE + Flow + GAN을 하나의 ELBO 프레임으로 통합해, TTS의 두 단계 경계를 지우면서 사람 수준 음질(CMOS -0.106)과 67배 실시간 합성 속도를 동시에 달성한 이정표 논문이다.

다음에 읽을 논문:

  • YourTTS (2022, arXiv:2112.02418): VITS를 zero-shot multi-speaker로 확장한 논문. 새 화자 음성 샘플 없이도 목소리를 복제한다.
  • NaturalSpeech 2 (2023, arXiv:2304.09116): Diffusion + Flow를 결합해 VITS 이후 TTS 품질을 다시 끌어올린 Microsoft 연구.
  • FastSpeech 2 (2020, arXiv:2006.04558): VITS 이전의 NAR TTS 대표 논문. VITS와 설계 철학이 어떻게 다른지 비교해보면 두 논문이 모두 더 잘 이해된다.

출처:

  • 논문 원문: arXiv 2106.06103
  • 공식 데모: VITS Demo Page
  • Figure 1, 5 출처: Kim, Kong, Son, "Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech", ICML 2021. 논문은 arXiv에 공개 게재됨.
반응형
Comments