chldkato

MelGAN 정리 본문

딥러닝

MelGAN 정리

chldkato 2020. 4. 3. 17:05

melgan은 mel spectrogram을 입력받아서 오디오 신호를 생성해내는 gan 기반 보코더이다

 

딥러닝으로 오디오 신호를 처리하고자 할 때 스펙트로그램 (멜-스펙이 더 자주 쓰임)을 특징으로 하여 입력하게 된다

 

스펙트로그램은 크기와 위상으로 나눌 수 있는데 위상은 허수부이기 때문에 입력할 수 없다

 

그래서 딥러닝의 입력과 출력이 스펙트로그램의 크기가 되고 위상 없이 복원하기 위해 보코더가 필요하다

 

보코더는 여러 종류가 있는데 melgan을 맨 마지막으로 해서 시간순으로 크게 아래와 같이 나눌 수 있다

 

1) griffin-lim

2) wavenet

3) waveglow

4) melgan

 

그리핀림 알고리즘은 상당히 오래된 알고리즘인데 빠르게 합성할 수 있기 때문에 여전히 쓸만하다

 

물론 성능은 이후의 기술들에 밀린다 (여기서 성능은 생성된 오디오의 음질이라던가 명료도라던가)

 

wavenet은 엄연히 말하면 보코더는 아니지만 local condition으로 특징을 넣어주면 보코더로 사용할 수 있다

 

waveglow는 wavenet와 glow모델을 합친 것으로 wavenet보다 빠르다

 

wavenet은 성능은 좋은데 학습이 정말 오래 걸린다. 

 

waveglow도 wavenet보다 빠르다고는 하지만 여전히 느리다

 

반면 melgan은 이전 기술보다 압도적으로 빠른 속도를 보여준다

 

 

1. Generator

 

melgan은 conv1d 여러층으로 이루어진 모델인 만큼 wavenet이나 waveglow보다 단순하고 직관적이다

 

generator는 여러 층의 conv1d와 residual 구조이다

 

residual stack 안에는 또 conv1d가 있고 residual connection을 3번 거친다

 

generator는 입력으로 배치 단위의 멜-스펙트로그램이 들어간다

 

따라서 입력 텐서의 크기는 (batch_size, 80, frame_length)가 된다

 

80은 멜-스펙트로그램의 차수가 되고 frame_length는 어느 구간만큼 입력할 지 사용자가 정하는 변수이다

 

출력은 오디오 신호가 되고 크기는 (batch_size, 1, frame_length * hop_size)이다

 

 

2. Discriminator

 

discriminator는 3개의 multi-scale 구조로 되어있다

 

하나의 multi-scale 당 6개의 feature map과 output 총 7개의 출력을 가진다

 

multi-scale disctriminator는 이미 많이 사용되고 있는 테크닉이라 딱히 새로울건 없다

 

재밌는점은 이미지 뿐만 아니라 오디오 신호에도 잘 적용된다는 점이다

 

melgan discriminator를 multi-scale 없이 학습하면 loss가 수렴이 안되는 문제가 생긴다

 

discriminator block은 총 7개의 conv1d로 되있다

 

마지막 출력은 일반적인 discriminator 출력이고 나머지는 출력은 loss로 사용된다

 

 

3. Loss

 

discriminator loss는 위와 같이 hinge loss를 gan에 맞춘 loss를 사용한다

 

논문에서는 기대값안에 min으로 되있는데 max를 min으로 오타낸거 같다

 

generator loss는 다음과 같다

뭔가 복잡해보이지만 discriminator 출력의 부호를 고려하면서 생각해보면 일반적인 gan loss의 원리를 따르게 된다

 

 

SVM의 hinge loss를 gan loss에 적용한 것을 보여주는 참조 논문을 참고하면 이해하기 좋다 (Geometric GAN)

 

논문에서는 lsgan의 loss보다 위의 loss가 더 효과적이었다고 한다

 

그리고 discriminator의 feature map 출력은 feature loss로 사용된다

 

결국은 real audio를 넣었을 때 feature와 생성 오디오를 넣었을 때 feature의 L1 loss이다

 

generator loss는 최종적으로 이렇게 된다

 

feature loss 에 붙은 람다는 논문에서는 10을 사용했고 따라서 feature loss에 비중을 더 주었다

 

optimizer는 adam을 사용했다

 

 

4. 결과

 

자세한 결과는 저자들의 사이트에서 확인할 수 있다

 

https://melgan-neurips.github.io/

 

MelGAN

Table of contents Abstract Previous works have found that generating coherent raw audio waveforms with GANs is challenging. In this paper, we show that it is possible to train GANs reliably to generate high quality coherent waveforms by introducing a set o

melgan-neurips.github.io

100 epoch 부터는 얼추 무슨 말을 하는지 들리긴 한다

 

kss로 학습해봤을때도 비슷한 성능을 보인다

 

generated-0.wav
0.15MB
generated-2.wav
0.42MB

 

1200 epoch 정도에서 생성한 음성이다

 

위는 한국어이고 아래는 영어인데 한국어 단일 화자로만 학습했는데도 general하게 좋은 성능을 보인다

 

두 음성에 대한 스펙트로그램을 봐도 큰 차이가 없음을 알 수 있다

 

 

generated-679-550k-0.wav
0.15MB

이건 multi-scale을 적용안했을 때의 결과물이다

 

학습할 때 loss가 수렴되지 않고 들어보면 노이즈와 기계음 같은 소리가 들리는데 이게 계속 학습해도 없어지지 않는다

 

같은 epoch에서 multi-scale을 적용하면 훨씬 좋은 음성을 얻을 수 있다

Comments