본문 바로가기

Machine Learning

딥러닝을 활용한 음성합성(TTS) 훑어보기(Vocoder)

반응형

Vocoder(Mel-to-Waveform)

Vocoder는 음성의 송수신을 할 때 Waveform을 보내는 것이 힘들어서 음성을 압축하고 압축한 형태에서 원래의 음성을 합성 가능하도록 하게 하여 보내는 컨셉에서 사용된 용어이다.

딥러닝을 사용한 음성합성쪽에서 Vocoder는 Text-to-Mel 모델이 만들어낸 Spectrogram을 실제 음성인 Waveform 으로 바꾸어주는 모델을 말한다. 왜 이런 모델이 필요하냐면 Spectrogram은 음성의 Magnitude 정보만 가지고 있지 Phase에 대한 정보는 갖고 있지 않기 떄문이다. 따라서 Vocoder는 실제 음성을 만들어주는 중요한 역할을 한다.

여기서 phase를 들고 있지 않다는 것은 Mel-Spectrogram을 만들 때 STFT의 결과들에 절댓값을 씌우고 제곱한 결과에다가 Mel-Filter를 씌워서 나온 결과이기 때문에 어떤 frequency의 magnitude 정보만 있고 phase에 대한 정보는 없다는 뜻이다.

Griffin-Lim

이 알고리즘은 기계학습을 사용하지 않고 순수하게 신호처리쪽의 알고리즘이다. Tacotron을 처음 제시한 논문에서 사용한 Vocoder이다. 딥러닝을 이용한 Neural Vocoder에 비해서는 생성한 음성의 품질이 좋지 않다.

알고리즘의 개요는 random으로 phase를 하나 설정한 뒤 미리 정해둔 횟수만큼 istft와 stft를 반복하며 적절한 phase로 수정을 해나가는 것이다.

Neural Vocoder

이제 딥러닝을 사용한 Vocoder를 알아보자. 현재 주로 쓰이는 모델은 auto-regressive(WaveNet, WaveRNN), flows(WaveGlow, Parallel WaveNet), GAN(MelGAN, Parallel WaveGAN)의 3종류로 구분할 수 있다.

사실 각 모델 별로 모델 구조와 원리를 간략하게라도 설명하려고 했는데 flow 기반은 꽤 수식이 본격적으로 나와서 이해가 아직 잘 안된다. 그냥 이런 게 있다 정도로만 생각해주시면 좋을 거 같다.

AutoRegressive

자가회귀적 모델이라고 번역할 수 있는 거 같다. 어떤 sequence $X={x_1,x_2,\dots,x_T}$가 생성될 확률은 다음과 같은 형태의 조건부 확률들의 곱으로 나타낼 수 있다.
$$
\prod_{i=1}^T p(x_i \vert x_{\lt i})
$$

이를 기반으로 생성모델을 만들게 되면 AutoRegressive 모델이 된다. RNN을 생각해보면 될 거 같다.

WaveNet이 AutoRegressive 모델이다. 현재 타겟 샘플을 생성할 때 이전 샘플들만 보는 Causal Convolution을 사용하고 적은 레이어 수로 넓은 receptive field를 얻기 위해서 Dilated Causal Convolution을 사용한다.

오디오를 생성한다고 했는데 WaveNet에서는 이를 직접적인 값으로 만드는 것이 아니라 16bit 오디오를 적당히 양자화한 256개의 값 중 하나를 예상하는 classification으로 해결했다. 이걸로 Loss도 어떻게 생겼는지 대강은 알 수 있을 거 같다.

이 모델의 좋은 점은 합성되는 음성의 품질이 상당히 높다는 것이다. WaveNet이 Neural Vocoder의 첫 혁신이었던 이유가 다 있다.

그러나 문제는 샘플을 sequential하게 생성하기 떄문에 합성 속도가 진짜 느리다. 또, 학습 시에 teacher forcing을 이용하여 훈련과 추론 시에 환경이 너무 다른 점이 문제될 수도 있다.

Normalizing Flow

생성모델의 일종으로 Normalizing Flow가 있다. 이해를 제대로 못했기 때문에 큰 개요만 말해보자.

생성해야할 데이터의 분포와 우리가 임의로 정한 분포(ex. Gaussian)간의 변환을 학습한다. 이 변환을 역변환이 가능한 것으로 모델링해서 생성에 사용하는 것이다. 변환은 여러개의 작은 변화로 쪼개서 학습시키며 이 흐름을 flow라고 한다.

대표적인 모델은 WaveGlow, Parallel WaveNet이 있다고 한다.

중간의 변환들을 쌓을 때 Affine Coupling Layer랑 $1 \times 1$ convolution을 사용해서 의미 있고 계산 가능한 수준의 jacobian determinant를 모델링하는 거 같은데 잠깐 본거로는 이해가 힘들다.

당연히 AutoRegressive 모델보다 추론 속도가 빠르다.

GAN

GAN은 솔직히 말할 것이 별로 없는 거 같다. Mel-to-Waveform을 하는 GAN이다. MelGAN, Parallel WaveGAN, HiFiGAN 같은 것이 유명한 거 같다. 아마 기똥찬 Custom Loss와 fancy한 구조를 적용해서 기가막히는 훈련을 하는거 아닐까?

사실 4년 전쯤에 GAN이 잘 안 된다고 들었는데 GAN도 자주 사용중인 거 같다. GAN의 장점은 매우 빠른 추론속도겠다. 아마 앞의 두 모델보다 빠를 것이다.

Mel-to-Waveform의 작업을 할 때 Mel-spectrogram에 upsample을 자주 하는 거 같다.

참고

http://web.stanford.edu/class/cs224s/lectures/224s.20.lec14.pdf

https://www.youtube.com/playlist?list=PL9mhQYIlKEheSlz5uVe7vpOIOwLgT0Puk

https://arxiv.org/pdf/1609.03499.pdf

반응형