VITS-based TTS

김필모·2024년 3월 21일

Github Code

https://github.com/jaywalnut310/vits

Demo

Audio Samples from "Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech"

Abstract

최근 논문(21년도 기준임)들이 end-to-end TTS를 제안하고는 있는데 이러한 모델들은 single stage 학습과 병렬 샘플링을 가능하게 하지만, 그 샘플 품질은 현재의 두 단계 TTS 시스템과는 맞지 않다고 함.

그래서 본 논문에서는 현재의 two-stage 모델보다 자연스러운 음성을 생성하는 병렬 end-to-end TTS 방법을 제안하는데 normalizing flows로 augment된 variational inferenceadversarial training을 채택하여 생성 모델링의 표현력을 향상시킴.

또 입력 텍스트에서 다양한 리듬으로 음성을 합성하기 위해 stochastic duration predictor를 제안함.

잠재 변수에 대한 불확실성 모델링과 stochastic duration predictor를 통해 입력 텍스트를 다양한 피치와 리듬등 여러 가지 방식으로 말하는 자연스러운 일대다 관계를 표현함.

LJ Speech 데이터셋 기준 MOS 점수가 성능 좋은 공개 TTS 시스템들을 능가하며 그라운드 트루스와 유사한 MOS를 달성한다는 결과를 보임.

(demo를 보면 "modern style" 같이 강조할 부분을 잘 찾고 있고 ., 같이 쉼표도 ground truth 처럼 잘 인식함)

  1. Single-stage (단일 단계) 모델:
    • 텍스트 입력을 바로 오디오 출력으로 변환하는 모델
  2. Two-stage (두 단계) 모델:
    • 텍스트를 중간 표현(주로 음성 파라미터)으로 변환한 후, 이를 오디오로 변환하는 모델

Introduction

Method

방법은 3가지 하위 섹션으로 나눌 수 있다.

  1. A conditional VAE formulation
  2. Alignment Estimation derived from variational inference
  3. Adversarial Training for improving synthesis quality

변분 추론(Variational Inference)은 VITS를 조건부 VAE(Conditional Variational Autoencoder)로 표현할 수 있는데, 이는 intractable한(marginal log-likelihood of data log pθ(x|c)) 변분 하한(variational lower bound) 또는 evidence lower bound (ELBO)를 최대화하는 목적을 가지고 있다.

Screenshot 2024-03-21 at 6.28.27 PM.png

  • 조건 c가 주어졌을 때, z의 사전 분포(prior distribution). 이는 조건에 따라 잠재 변수의 가능한 값들의 확률 예를 들어, 입력 텍스트가 주어졌을 때 해당 텍스트에 대응하는 음성 특징의 분포를 의미함.

  • 조건 z가 주어졌을 때, x의 likelihood function. **잠재변수 z가 주어졌을 때, x가 생성될 확률. z로 reconstruction하는 과정과 관련이 있음

  • approximate posterior distribution(근사적인 사후 분포). 입력 x가 주어졌을 때, z의 사후분포를 의미. 변분 추론 모델로 근사적으로 구해짐

training loss는 ELBO의 음수이고 이는 reconstruction loss - log pθ(x|z) 과 log qφ(z|x) −log p_θ(z|c) 합으로 볼 수 있음.

Reconstruction Loss

reconstruction loss를 구하기 위해 waveform이 아닌 mel-spectrogram(이하 xmel 로 표현됨)을 사용해 L1 loss를 구했다고 한다.

그러기 위해서 latent variable(이하 z)를 디코더에서 업샘플링한 xˆmel 로 변환하고

(이는 mel-spectorgram 변환을 수행하여 할 수 있다)

xˆmel 과 xmel의 L1 loss를 재구성 손실로 사용.

Screenshot 2024-03-21 at 6.44.06 PM.png

이건 데이터 분포를 라플라스 분포로 가정하고 상수항을 무시하여 MLE 추정한것으로 볼 수 있다. 그리고 mel-spectrogram 도메인에서 정의한 이유는 인간 청각 시스템 근사화시키려 했기 때문임 (mel-scale 참고)

이때, 멜 스펙트로그램으로 변환하는 건 STFT와 멜 스케일로의 선형변환만을 사용해 훈련가능한 파라미터를 필요로 하지 않음. 또 이는 훈련중에만 사용되고 추론에는 사용되지 않음

그리고 효율적으로 e2e 학습하기 위해서 z 전체를 업샘플링하지 않고 부분 시퀀스를 디코더 입력으로 넣어줬다고 함(windowed generator)

Understanding the Mel Spectrogram

  • mel - scale 부분 참고

KLD

(kl은 그냥 사람 이름이니까 무시하고 Divergence는 흔히 아는 벡터 분산보다는 그냥 분포간 차이 로 이해하자)

prior encoder 입력 조건: ctext(g2p로 전처리해서 얻을 거임), A(alignment) 로 구성

(prior encoder 는 z의 prior distribution 학습)

여기서 Alignment는 입력 음소(phonemes)가 목표 음성(target speech)과 시간적으로 얼마나 정렬되는지를 나타내는, |ctext| × |z| 차원의 hard monotonic 어텐션 행렬임

(입력 시퀀스의 각 요소가 출력 시퀀스와 일대일로 대응되는 단조 증가하는(monotonically increasing) 어텐션)

근데 우리는 ground-truth 레이블 없음 → 각 훈련마다 alignment를 추정해야 함

posterior 인코더에 높은 해상도 정보 주기 위해서 (mel-scale이 아닌) linear-scale spectrogram 사용

사후 인코더에 더 많은 고해상도 정보를 제공하기를 목표로 하기에 목표 음성의 선형 스케일 스펙트로그램 xlin을 사용하여 입력으로 사용함.

Screenshot 2024-03-21 at 6.55.30 PM.png

MAS (Monotonic Alignment Search): 입력 텍스트와 목표 음성 간의 정렬을 추정하기 위한 방법으로, 데이터의 가능도를 최대화하는 정렬을 찾음

논문에서는 prior와 posterior 인코더를 파라미터화하기 위해 요소별 정규 분포(factorized normal distribution)를 사용한다.

이때 prior distribution의 표현력을 증가시키는 것이 자연스러운 결과를 생성하는 데 중요하다는것을 알게 됐고 따라서 더 복잡한 분포로의 역변환을 능가하게 하는 정규화 플로우(normalizing flow)인 fθ를 적용한다. 이는 간단한 분포를 더 복잡한 분포로 변환하는 규칙인 변수 변환의 규칙을 따르는 역변환 가능한 변환을 가능하게 한다.

→ 나중에 추가 설명 필요

Screenshot 2024-03-21 at 7.01.46 PM.png

논문에서는 입력 텍스트와 목표 음성 간의 정렬인 alignment A를 추정하기 위해 Monotonic Alignment Search (MAS)를 채택합니다.

MAS는 데이터 likelihood를 최대화하는 정렬을 탐색하는 방법으로, 이 때 정규화 플로우 f로 파라미터화된 데이터의 likelihood를 최대화하는 정렬을 찾습니다.

MAS는 Kim et al. (2020)의 논문에서 소개된 방법으로, 입력 텍스트와 목표 음성 간의 정렬을 찾는 과정에서 단조(monotonic)성을 유지합니다. 이는 음성 합성 과정에서 각 입력 phoneme과 해당하는 음성 세그먼트 간의 일대일 매핑을 유지하면서, 정렬을 효율적으로 찾는 데 도움이 됩니다.

MAS를 사용하여 정렬을 추정하는 과정에서는 정규화 플로우 f를 사용하여 파라미터화된 데이터의 likelihood를 고려하며, 이를 최대화하는 정렬을 찾습니다. 이는 모델이 입력 텍스트와 목표 음성 간의 정렬을 더 정확하게 학습하고, 따라서 더 나은 음성 합성 결과를 얻을 수 있도록 도와줍니다.

MAS는 모델 학습 중에만 사용되며, 추론 시에는 사용되지 않습니다. 이러한 방식은 학습 과정에서 정렬을 추정하여 모델이 더 나은 품질의 음성을 생성할 수 있도록 지원합니다.

MAS(Monotonic Alignment Search)에서 후보 정렬은 단조적(monotonic)이고 건너뛰지 않는(non-skipping) 것으로 제한됩니다. 이는 인간이 텍스트를 순서대로 읽는다는 사실을 따르는 것입니다. 즉, 음성 합성에서는 각 입력 phoneme에 해당하는 음성 세그먼트가 건너뛰지 않고 정확히 일치하도록 하는 것이 중요합니다. 이는 인간이 음성을 인식하고 이해하는 방식과 일치하므로 더 자연스러운 음성 합성을 위한 중요한 제약 조건입니다.

Kim et al. (2020)의 접근 방식은 최적 정렬을 찾기 위해 동적 프로그래밍(dynamic programming)을 사용하는 것입니다. 그러나 우리의 목표는 정확한 로그 우도(log-likelihood)가 아닌 ELBO(변분 하한)입니다. 따라서 우리의 설정에서 MAS(Monotonic Alignment Search)를 직접 적용하는 것은 어려울 수 있습니다.

MAS는 정확한 로그 우도를 최대화하는 정렬을 찾기 위해 설계되었기 때문에 ELBO와 같은 다른 목적 함수에 직접 적용하기에는 적합하지 않을 수 있습니다. ELBO는 데이터의 likelihood를 근사적으로 최대화하는 것을 목표로 하며, 이를 위해 변분 추론과 생성 모델이 함께 최적화됩니다.

따라서 우리는 MAS(Monotonic Alignment Search)를 재정의하여 ELBO를 최대화하는 정렬을 찾습니다. 이는 잠재 변수 z의 로그 우도를 최대화하는 정렬을 찾는 것으로 축소됩니다. 이것은 목표로 하는 ELBO를 직접 최적화하는 것이 아니라, 잠재 변수 z의 로그 우도를 최대화하여 간접적으로 ELBO를 최대화하는 것입니다.

식 5와 식 6의 유사성으로 보아 원래의 MAS 구현을 수정하지 않고 사용할 수 있습니다. 이는 MAS가 우도를 최대화하는 정렬을 찾도록 설계되어 있고, 여러분의 경우 잠재 변수 z의 로그 우도를 최대화하는 것이 ELBO를 최대화하는 데 중요하기 때문입니다.

Duration Prediction from Text

우리는 추정된 정렬의 각 토큰에 대한 지속 시간 di를 계산할 수 있습니다. 이를 위해 추정된 정렬의 각 행의 모든 열을 합산하여 각 입력 토큰의 지속 시간을 계산합니다.

지속 시간은 이전 연구에서 제안된 것처럼 결정론적인 지속 시간 예측기를 훈련시키는 데 사용될 수 있습니다

하지만 결정론적인 지속 시간 예측기만으로는 각각의 발화 속도가 다른 사람의 말하는 방식을 표현할 수 없습니다.

인간과 유사한 말하는 리듬을 생성하기 위해, 우리는 주어진 음운(phoneme)의 지속 시간 분포를 따르는 샘플을 생성할 수 있는 확률적인 지속 시간 예측기를 설계합니다.

확률적 지속 시간 예측기는 일반적으로 최대 우도 추정(maximum likelihood estimation)을 통해 훈련되는 플로우 기반 생성 모델입니다.

최대 우도 추정을 직접적으로 적용하는 것은 어렵습니다. 왜냐하면 각 입력 음운의 지속 시간은 다음과 같은 이유로 어려움이 있습니다:

  1. 이산 정수값: 각 입력 음운의 지속 시간은 이산 정수값이기 때문에 연속적인 정규화 플로우를 사용하기 위해 이산화(dequantized)되어야 합니다.
  2. 스칼라 값: 각 입력 음운의 지속 시간은 스칼라 값이기 때문에 역함수(invertibility)에 제약이 있는 고차원 변환을 방지합니다.

문제를 해결하기 위해 우리는 변분 이산화(Variational Dequantization)와 변분 데이터 증강(Variational Data Augmentation)을 적용합니다.

구체적으로 말하면, 변분 이산화(Variational Dequantization) 및 변분 데이터 증강(Variational Data Augmentation)을 위해 d와 동일한 시간 해상도와 차원을 가진 두 개의 랜덤 변수 u와 ν를 소개합니다.

우리는 u의 지원을 [0, 1)로 제한합니다. 이렇게 함으로써 d−u의 차이가 양의 실수 시퀀스가 되도록 합니다. 그리고 우리는 ν와 d를 채널 방식(channel-wise)으로 연결하여 더 높은 차원의 잠재 표현을 만듭니다.

우리는 두 변수 u와 ν를 대략적인 사후 분포인 qφ(u, ν|d, ctext)를 통해 샘플링합니다. 이렇게 하면 얻어지는 목적 함수는 음운 지속 시간의 로그 우도의 변분 하한입니다.

Screenshot 2024-03-21 at 9.28.49 PM.png

훈련 손실 L_dur은 그런 다음 음운 지속 시간의 부정적인 변분 하한입니다. 우리는 입력 조건의 훈련에 영향을 미치지 않도록 하기 위해 입력 조건에 stop gradient 연산자 (van den Oord et al., 2017)를 적용합니다. 이 연산자는 입력의 그라디언트를 다시 전파하는 것을 막습니다. 이를 통해 지속 시간 예측기의 훈련이 다른 모듈의 훈련에 영향을 미치지 않도록 합니다.

샘플링 과정은 비교적 간단합니다. 음운 지속 시간은 확률적 지속 시간 예측기의 역 변환을 통해 무작위 노이즈에서 샘플링되고, 그런 다음 정수로 변환됩니다.

Screenshot 2024-03-21 at 9.40.02 PM.png

여기서 T는 디스크리미네이터의 총 레이어 수를 나타내며, D_l은 l번째 레이어의 디스크리미네이터의 특성 맵(feature map)을 나타냅니다. 이때 해당 특성 맵은 N_l개의 특성(features)을 갖습니다. 특히, 특징 일치 손실은 VAEs의 요소별 재구성 손실에 대안으로 제안된 것처럼 볼 수 있습니다. 이 손실은 디스크리미네이터의 숨겨진 레이어(hidden layers)에서 측정되는 재구성 손실(reconstruction loss)로 해석될 수 있습니다(Larsen et al., 2016).

2.4 Final Loss

VAE와 GAN 훈련의 결합으로, 우리의 조건부 VAE를 훈련하기 위한 총 손실은 다음과 같이 표현할 수 있습니다. 이때 VAE 손실과 GAN 손실이 조합되어 사용됩니다.

Screenshot 2024-03-21 at 9.40.52 PM.png

2.5 Model Architecture

제안된 모델의 전체 아키텍처는 후방 엔코더, 사전 엔코더, 디코더, 디스크리미네이터 및 확률적 지속 시간 예측기로 구성됩니다. 후방 엔코더와 디스크리미네이터는 훈련에만 사용되며 추론에는 사용되지 않습니다. 아키텍처의 세부 사항은 부록 B에서 확인할 수 있습니다. 부록 B에서 모델의 구조적 세부 사항이 제공됩니다.

2.5.1 POSTERIOR ENCODER

후방 엔코더에는 WaveGlow (Prenger et al., 2019)와 Glow-TTS (Kim et al., 2020)에서 사용된 인과적이지 않은 WaveNet 잔여 블록을 사용합니다. WaveNet 잔여 블록은 게이트 활성화 단위와 스킵 연결을 갖는 층들의 확장된 합성곱으로 구성됩니다. 블록 위에 있는 선형 투사 층은 정규 사후 분포의 평균과 분산을 생성합니다. 다중 스피커 경우, 잔여 블록에서 글로벌 조건부(global conditioning)를 사용하여 스피커 임베딩을 추가합니다(Oord et al., 2016).

2.5.2 PRIOR ENCODER

사전 엔코더는 입력 음운 ctext를 처리하는 텍스트 인코더와 사전 분포의 유연성을 향상시키는 정규화 플로우 fθ로 구성됩니다.

텍스트 인코더는 절대 위치 인코딩 대신 상대적 위치 표현(Shaw et al., 2018)을 사용하는 트랜스포머 인코더(Vaswani et al., 2017)입니다.

우리는 텍스트 인코더를 통해 ctext에서 숨겨진 표현인 htext를 얻을 수 있습니다. 또한, 텍스트 인코더 위에 있는 선형 투사 층을 사용하여 평균과 분산을 생성하고 이를 이용하여 사전 분포를 구성합니다.

정규화 플로우는 애핀 커플링 레이어의 스택(Dinh et al., 2017)으로 구성된 WaveNet 잔여 블록 스택입니다. 이때 애핀 커플링 레이어는 WaveNet 잔여 블록의 스택으로 이루어져 있습니다. 단순화를 위해, 우리는 정규화 플로우를 볼륨 보존 변환(volume-preserving transformation)으로 설계하고, 애핀 커플링 레이어의 야코비안 행렬식(Jacobian determinant)을 1로 유지합니다. 다중 스피커 설정에서는 정규화 플로우 내의 잔여 블록에 스피커 임베딩을 추가하여 글로벌 조건부(global conditioning)를 통해 스피커에 대한 정보를 포함시킵니다.

2.5.3 Decoder

디코더는 본질적으로 HiFi-GAN V1 생성기(Kong et al., 2020)입니다. 이는 여러 개의 다중 수신 영역 퓨전 모듈(MRF)이 뒤따르는 전치 합성곱 레이어의 스택으로 구성되어 있습니다. MRF의 출력은 서로 다른 수신 영역 크기를 갖는 잔여 블록의 출력을 합한 값입니다. 다중 스피커 설정에서는 스피커 임베딩을 변환하는 선형 레이어를 추가하고 입력 잠재 변수 z에 더합니다.

2.5.4 DISCRIMINATOR

우리는 HiFi-GAN (Kong et al., 2020)에서 제안된 다중 기간(discriminator) 디스크리미네이터 구조를 따릅니다. 다중 기간 디스크리미네이터는 입력 파형의 다른 주기적 패턴에 작동하는 Markovian 윈도우 기반 하위 디스크리미네이터의 혼합입니다 (Kumar et al., 2019).

2.5.5 STOCHASTIC DURATION PREDICTOR

확률적 지속 시간 예측기는 조건부 입력 htext로부터 음운 지속 시간의 분포를 추정합니다. 효율적인 매개변수화를 위해, 우리는 dilated 및 depth-separable 합성곱 레이어를 가진 잔여 블록을 쌓습니다. 또한, 신경 스플라인 플로우 (Neural spline flows) (Durkan et al., 2019)를 적용합니다. 이는 단조적인 유리-이차 스플라인을 사용하여 변환 가능한 비선형 변환의 형태로, 결합 레이어에 적용됩니다. 신경 스플라인 플로우는 매개 변수의 수가 일반적으로 사용되는 애핀 커플링 레이어와 비교했을 때 유사하면서도 변환 표현력을 향상시킵니다. 다중 스피커 설정에서는 선형 레이어를 추가하여 스피커 임베딩을 변환하고 입력 htext에 추가합니다.

Dataset

2개의 데이터 셋을 사용함

  1. LJ Speech dataset

    • 1명의 화자의 13,100개의 짧은 오디오 클립 형식
    • 총 길이는 24시간
    • 오디오 형식: 16비트 PCM, 샘플링 주파수: 22kHz

    Training set - 12,500

    Validation set - 100

    Test set - 500

  1. VCTK dataset

    • 다양한 발음 특성을 학습, 표현할 수 있는 지 검증하기 위해 사용
    • 44,000개의 짧은 오디오 클립 형식
    • 화자는 109명 영어 원어민 화자, 사투리 발음
    • 오디오 길이는 44시간
    • 오디오 형식: 16비트 PCM, 샘플링 주파수 44kHz
      • 논문에선 22kHz로 줄였다고 함

    Training set - 43,470

    Validation set - 100

    Test set - 500

우리의 ai hub 데이터셋은 16비트 bits per sample, 샘플링 주파수: 44.1kHz

일단 논문 따라서 하기로 했으니 22kHz로 줄여 보겠음.

음원 주파수 줄이기 - Command Line

ffmpeg -i SPK035KBSCU001F001.wav -ar 22050 output.wav

ffmpeg를 이용해서 주파수를 낮춰줬다.

원본

SPK035KBSCU001F001.wav

변경 후

output.wav

데이터 손실로 살짝 음질 저하가 느껴진다

Pretraining

Linear Spectrograms 사용했다고 함

Short-time Fourier transform (STFT)

https://sanghyu.tistory.com/37

오픈소스 사용해 text sequence → IPA sequence

변환된 IPA 시퀀스는 glow-tts의 구현에 따라 빈 토큰으로 구분됨

vits 는 prior encoder에 입력으로 IPA(International Phonetic Alphabet)를 넣어준다. 따라서 데이터 셋을 cleaning 하는 과정이 필요하다.

예를들면 소스 코드 상에서는 가지고 있는 데이터를 이렇게 바꿔주고 있다.

Mrs. De Mohrenschildt thought that Oswald

→ mɪsˈɛs də mˈoʊɹɪnstʃˌaɪlt θˈɔːt ðæt ˈɑːswəld

이 레포는 tacotron의 cleaner 소스코드를 그대로 쓰고 있는데

한국어 전용 cleaner가 tacotron에 없다. 하지만 transliteration_cleaners 을 사용하면 아스키로 변환 가능한 텍스트들을 바꿔주기는 한다. 근데 영어는 phonemizer 사용해서 g2p해주는데 이 함수에는 이게 없어서 잘 될 지.. 의문이 든다. 일단 잘 안되면 얘도 잘못 있으니까 기억만 해두고 일단 있는 거 쓰기로 하자.

0개의 댓글