StyleTTS
- StyleTTS: A Style-Based Generative Model for Natural and Diverse Text-to-Speech Synthesis
- Monotonic alignment
StyleTTS
Architecture
StyleTTS의 목적은 입력으로 들어가는 phonemes (음소) $\boldsymbol{t} \in \mathcal{T}$ 와 reference mel-spectogram $\boldsymbol{x} \in \mathcal{X}$ 가 있을 때, $\boldsymbol{x}$ 의 일반화된 음성 스타일이 잘 반영되어 있는 $\boldsymbol{t}$에 대응되는 mel-spectrogram $\tilde{\boldsymbol{x}} \in \mathcal{X}$ 를 생성할 수 있도록 학습하는 것
8개의 모듈이 3개의 주요 카테고리로 나누어져 있음
- Speech generation module
- Text encoder
- Style encoder
- Decoder
- TTS prediction module
- Duration predictor
- Prosody predictor
- Utility module (학습에만 이용)
- Discriminator
- Text Aligner
- Pitch extractor
Text Encoder $T$
Phonemes $\boldsymbol{t}$ 를 인코딩하여 $\boldsymbol{h}_{\text {text }}=T(\boldsymbol{t})$
3개의 CNN과 bidirectional LSTM로 구성
Text Aligner $A$
Mel-spectogram과 phoneme 사이의 alignment $\boldsymbol{d}_{\text {align }}$ 을 생성하는 부분
- 이 논문에서 $\boldsymbol{d}{\text {align }}$ , $\boldsymbol{a}{\text {align }}$ 두 가지로 표현하는데, 오타인 것인지 아니면 다른 의미인지 확인 필요
Decoder $G$가 mel-spectogram을 복원하는 단계에서 같이 학습 진행 (학습 1 단계)
Tacotron2 모델의 decoder의 attention 부분을 모델로 하여 text aligner 구성
처음에는 LibriSpeech corpus 데이터 셋으로 ASR (Automatic Speech Recognition) task에서 $A$를 학습한 후,
decoder를 학습할 때 TTS task에 맞게 fine-tuning 을 진행
이런 방식으로 진행한 aligner를 Transferable Monotonic Aligner (TMA) 라고 함
Style Encoder $E$
Style encoder를 통해 주어진 mel-spectogram $\boldsymbol{x}$의 style vector $s=E(\boldsymbol{x})$ 생성
다양한 reference 음성을 이용하여 다양한 style representation을 생성
$ \rightarrow $ Decoder가 reference 음성 $\boldsymbol{x}$의 스타일을 반영한 음성을 합성 가능
4개의 residual block과 average pooling으로 구성되어 있고 시간 축에 적용됨
Pitch Extractor $F$
Pitch Extractor를 통해 pitch $\text { F0 }$를 추가적인 과정 없이 Hz 단위로 직접적으로 구하여 직관적인 representation을 제공하고, 음성의 pitch를 더 잘 조절할 수 있게 함
- $\text { F0 }$는 기본 주파수를 의미하고, 음성의 높낮이를 결정하는 중요한 요소, Hz는 음성의 높낮이 정량적 표현 단위
더 정확하게 예측하기 위해서 end-to-end로 decoder $G$와 같이 학습
LibriSpeech 데이터셋에서 YIN 알고리즘을 통해 추정된 \text { F0 } 데이터를 ground-truth로 사용하여 pre-trained 한 JDC Network을 사용
- JDC 네트워크는 다양한 음성 특징을 동시에 추출하고 분류하는 데 사용되는 신경망 구조
- YIN 알고리즘은 기본 주파수를 추정하는 알고리즘 중 하나
더 정확하게 예측하기 위해서 end-to-end로 decoder $G$와 같이 학습
Decoder가 학습 시, fine-tuning 되어 pitch $p_{\boldsymbol{x}}=F(\boldsymbol{x})$ 를 예측하여 mel-spectogram의 복원하는데 적용
Decoder $G$
입력으로 들어온 mel-spectogram $\boldsymbol{x}$를 decoder를 통과한 $\hat{\boldsymbol{x}}$이 잘 복원하도록 학습
- \(\boldsymbol{h}_{\text {text }} \cdot \boldsymbol{d}_{\text {align }}\) : align된 입력 phoneme의 representation
- \(\boldsymbol{s}\) : style vector
-
\(p_{\boldsymbol{x}}, n_{\boldsymbol{x}}\) : \(\boldsymbol{x}\)의 각 프레임 마다의 pitch와 energy
- 참고로 $n_{\boldsymbol{x}}$ 을 계산하는 모듈은 따로 존재하지 않고, log norm 이용하여 계산
- StyleTTS2에서는 \(n_{\boldsymbol{x}}=\|\boldsymbol{x}\|\) 으로 계산한다고 명시함
Decoder는 AdaIN을 포함한 7개의 블록으로 구성
중요한 feature가 사라지는 것을 방지하기 위해서, pitch $p_{\boldsymbol{x}}$, energy $n_{\boldsymbol{x}}$, residual phoneme feature $\boldsymbol{h}_{\text {res }}$을 concat 하여 AdaIN 이후의 residual block에 전달
Discriminator $D$
Decoder가 조금 더 좋은 품질의 음성을 만들 수 있도록 하기 위해 사용
Style Encoder와 같은 architecture 공유
Duration Predictor
AdaLN이 적용된 3개의 bidirectional LSTM $R$ 과 한 개의 linear projection $L$로 구성
$R$은 prosody predictor $P$와 공유되는데, 이는 $R$의 출력 \(\boldsymbol{h}_{\text {prosody }}=R\left(\boldsymbol{h}_{\text {text }}\right)\)가 prosody predictor $P$의 입력으로 들어간다는 의미
Prosody Predictor $P$
Style vector와 text 정보와 함께 Pitch $\hat{p}{\boldsymbol{x}}$와 energy $\hat{n}{\boldsymbol{x}}$ 를 예측하는 역할
Shared bidirectional LSTM $R$을 통해 생성된 \(\boldsymbol{h}_{\text {prosody }}\) 와 $\boldsymbol{a}$ 을 결합이 되고$\boldsymbol{h}_{\text {prosody }} \cdot \boldsymbol{a}$ 이 값이 residual block과 AdaIN 세트들을 지나 linear projection layer를 통과하여 pitch 와 energy output 생성
Training
2 stage로 학습을 나누어 진행
-
text, pitch, energy, style 로부터 mel-spectogram을 복원하는 과정 학습
-
Duration predictor와 prosody predictor를 제외한 모듈은 고정하고 주어진 text에서 pitch, enegy, style을 복원하는 과정을 학습
First Stage Objectives
Mel reconstruction
Mel-spectogram과 이에 대응하는 text가 주어질 때, decoder를 다음과 같이 $L_{1}$를 이용하여 학습
\[\mathcal{L}_{\text {mel }}=\mathbb{E}_{\boldsymbol{x}, \boldsymbol{t}}\left[\left\|\boldsymbol{x}-G\left(\boldsymbol{h}_{\text {text }} \cdot \boldsymbol{a}_{\text {align }}, \boldsymbol{s}, p_{\boldsymbol{x}}, n_{\boldsymbol{x}}\right)\right\|_{1}\right]\]Decoder와 text aligner를 E2E 학습 하기 위해 시간을 기준으로 50%-50% 학습 전략을 취함
- 데이터 하나의 시간을 의미하는 것 같음??
시간을 기준으로 절반은 attention의 결과를 사용하여 text aligner 학습 (back propagation)
- 텍스트가 음성으로 변환되는 일반적인 패턴 학습
나머지 절반은 미분이 불가능한 monotonic한 alignment를 사용하는 전략
-
동적 프로그래밍으로 최적의 align을 찾음
-
decoder가 추론하는 동안 monotonic hard alignment 를 통해 더 이해 가능한 음성을 생성하도록 학습 가능
참고로 Monotonic alignment에 대한 설명은 아래와 같음
- Monotonic alignment
- 텍스트와 음성 사이의 대응이 순차적으로 발생
- 텍스트의 첫 번째 음소는 음성의 처음 부분에, 두 번째 음소는 그 다음 부분에 대응하는 식으로, 순서가 보존되면서 정렬이 구성
- 음소에 대응하는 음성 구간이 뒤로 갈수록 시간적으로 뒤따라오는 방식
- Hard Monotonic alignment
- 음소가 특정 음성 프레임과 명확하게 연결되며, 이 연결이 확률적으로 퍼지지 않고 명확하게 결정
- 특정 음소가 특정 시간 프레임에 단일하게 대응되며, 다른 시간 프레임에는 대응하지 않음
이런 방법으로 pre-trained 된 text aligner를 fine-tuning 하면 최적의 alignment를 찾을 수 있어 음성의 품질이 향상
TMA
E2E로 text aligner를 학습하는 동안 attention alignment의 성능이 올바르게 유지되고 있는지 확인하기 위해 기존의 sequence-to-sequence ASR의 objective인 $\mathcal{L}_{\mathrm{s} 2 \mathrm{s}}$ 적용
- Pre-trained 했을 때 사용한 loss 의미하는 것 같음
- $N$ : phoneme 의 수
- $\hat{\boldsymbol{t}}_{i}$ : sequence-to-sequence ASR 획득? (코드 보고 확인해보자..)
추가적으로, alignment가 반드시 monotonic 하지는 않기 때문에 soft attention alignment가 monotonic 에 가까워지도록 학습하기 위해 간단한 $L1$ loss 사용
\[\mathcal{L}_{\text {mono }}=\mathbb{E}_{\boldsymbol{x}, \boldsymbol{t}}\left[\left\|\boldsymbol{a}_{\mathrm{align}}-\boldsymbol{a}_{\mathrm{hard}}\right\|_{1}\right]\]- \(\boldsymbol{a}_{\mathrm{align}}\) : Text aligner로 얻은 alignment
- \(\boldsymbol{a}_{\mathrm{hard}}\) : 동적 프로그래밍의 결과로 얻어진 monotonic hard alignment
Adversarial objectives
2개의 adversarial loss function 사용
첫 번째 loss는 adversarial training 을 위한 cross entropy loss
\[\mathcal{L}_{\text {adv }}=\mathbb{E}_{\boldsymbol{x}, \boldsymbol{t}}[\log D(\boldsymbol{x})+\log (1-D(\hat{\boldsymbol{x}}))]\]- $\hat{\boldsymbol{x}}$ : Decoder를 통과하여 얻은 mel-spectogram
두 번째는 feature-matching loss \(\mathcal{L}_{\mathrm{fm}}\)
\[\mathcal{L}_{\mathrm{fm}}=\mathbb{E}_{\boldsymbol{x}, t}\left[\sum_{l=1}^{T} \frac{1}{N_{l}}\left\|D^{l}(\boldsymbol{x})-D^{l}(\hat{\boldsymbol{x}})\right\|_{1}\right]\]- $T$ : Discriminator의 layer의 수
- $D^{l}$ : $l$ 번째 layer의 output feature map
- $N_{l}$ :$l$ 번째 layer의 feature의 수
First stage full objectives
\[\begin{aligned} \min _{G, A, E, F, T} \max _{D} & \mathcal{L}_{\mathrm{mel}}+\lambda_{\mathrm{s} 2 \mathrm{s}} \mathcal{L}_{\mathrm{s} 2 \mathrm{s}}+\lambda_{\text {mono }} \mathcal{L}_{\text {mono }} \\ & +\lambda_{\mathrm{adv}} \mathcal{L}_{\mathrm{adv}}+\lambda_{\mathrm{fm}} \mathcal{L}_{\mathrm{fm}} \end{aligned}\]Second Stage Objectives
Duration prediction
Duration prediction을 학습하기 위해서 $L_{1}$ loss 사용
\[\mathcal{L}_{\text {dur }}=\mathbb{E}_{\boldsymbol{d}}\left[\left\|\boldsymbol{d}-\boldsymbol{d}_{\text {pred }}\right\|_{1}\right]\]- $\boldsymbol{d}$ : $\boldsymbol{a}_{\text {align }}$ 를 mel frame 축을 기준으로 더한 값을 사용 (ground truth)
- $\boldsymbol{d}_{\text {pred }}$ : 예측한 duration 값 (\(L\left(R\left(\boldsymbol{h}_{\text {text }}, \boldsymbol{s}\right)\right)\))
Prosody prediction
Duration predictor는 다른 모듈과 독립적으로 학습되기 때문에 최적의 duration 값을 도출하지 못하거나 prosody predictor의 결과와 매칭되지 않는 결과를 줄 수 있음
Duration predictor가 최적의 duration 값을 주지 못하더라도 data augmentation을 통하여 duration에 대한 prosody invariance를 확
- 동일한 문장을 다양한 duration으로 말하게 되더라도 운율 자연스럽게 생성이 가능 할 것 같음
Original mel-spectogram 에서 얻은 ground truth alignment, pitch, energy 를 사용하는 대신에 1-D bilinear interpolation을 이용하여 mel-spectogram을 시간축으로 줄이거나 늘려 증강된 sample \(\tilde{\boldsymbol{x}}\) 을 얻음
그 결과 음성의 속도는 바뀌더라도 pitch와 energy 커브는 변하지 않음
Prosody predictor는 음성의 duration의 속도가 변하는 것과 상관없이 pitch와 energy 일관된 예측값을 유지
- 속도를 변경하는 과정에서 단순히 음성을 빠르게 하거나 느리게 재생하면, pitch와 energy 변화
- 녹음을 빠르게 재생하면 목소리가 헬륨을 마신 것처럼 높아지며, 반대로 느리게 재생하면 목소리가 저음으로 변화함
이런 접근이 duration이 맞지 않을 때 부자연스러운 prosody가 생성되는 것을 방지함
학습할 때, $\mathrm{f} 0$와 energy reconstruction error는 \(\mathcal{L}_{\mathrm{f} 0}\) 와 \(\mathcal{L}_{n}\) 각각 계산
\[\begin{aligned} \mathcal{L}_{\mathrm{f} 0} & =\mathbb{E}_{p_{\tilde{\boldsymbol{x}}}}\left[\left\|p_{\tilde{\boldsymbol{x}}}-P_{p}\left(S\left(\boldsymbol{h}_{\mathrm{text}}, s\right) \cdot \tilde{\boldsymbol{a}}_{\text {align }}\right)\right\|_{1}\right] \\ \mathcal{L}_{n} & =\mathbb{E}_{\tilde{\boldsymbol{x}}}\left[\left\|n_{\tilde{\boldsymbol{x}}}-P_{n}\left(S\left(\boldsymbol{h}_{\text {text }}, s\right) \cdot \tilde{\boldsymbol{a}}_{\text {align }}\right)\right\|_{1}\right] \end{aligned}\]- \(p_{\tilde{\boldsymbol{x}}}, n_{\tilde{\boldsymbol{x}}}, \tilde{\boldsymbol{a}}_{\text {align }}\) : augmented 된 data에서 얻은 값
- $P_{p}(\cdot)$, $P_{n}(\cdot)$ : Prosody predictor의 pitch, energy 결과
Decoder reconstruction
Prosody predictor에서 얻은 pitch와 energy가 decoder에서 효과적으로 사용되어여 함
Data augmentation 과정에서 생성된 압축되거나 늘어난 mel-spectogram을 ground truth 데이터로 사용되면 예측한 prosody에서 원치 않는 왜곡이 발생할 수 있음
대신, prosody predictor에서 예측한 pitch, energy가 decoder에서 mel-spectogram을효과적으로 reconstruction 할 수 있도록 를 학습을 진행해야 함
- Mel-spectogram을 직접적으로 사용하지 않고 이를 gt로 사용하여 stage 1에서 결과를 얻은 것 처럼 얻는다..?
- \(\hat{\boldsymbol{x}}=G\left(\boldsymbol{h}_{\text {text }} \cdot \tilde{\boldsymbol{a}}_{\text {align }}, s, \tilde{p},\|\tilde{\boldsymbol{x}}\|\right)\) : $\tilde{\boldsymbol{x}}$을 reconstruction 한 결과
-
\(\hat{p}=P_{p}\left(S\left(\boldsymbol{h}_{\text {text }}, s\right) \cdot \tilde{\boldsymbol{a}}_{\text {align }}\right)\) : 예측한 pitch
- \(\hat{n}=P_{n}\left(S\left(\boldsymbol{h}_{\text {text }}, s\right) \cdot \tilde{\boldsymbol{a}}_{\text {align }}\right)\) : 예측한 energy 값