티스토리 뷰

본 게시글은 choyi0521님의 WAVENET: A GENERATIVE MODEL FOR RAW AUDIO를 정리한 글입니다.

 

소개

 2016년 구글 딥마인드에서 오디오 생성 모델인 wavenet에 관한 논문을 공개했습니다.

 

 당시 대부분의 TTS 모델은 녹음된 음성 데이터를 쪼개고 조합해서 음성을 생성하는 방식인 Concatenative TTS를 기반으로 구현되었습니다. 이 방식은 기본적으로 많은 양의 데이터를 필요로 했고, 화자나 톤을 바꾸는 등의 변형을 할 때마다 새로운 데이터가 필요했습니다.

 

이에 따른 대안으로 통계적인 방법으로 음성을 생성하는 prarametric TTS 방식이 주목받았지만 Concatenative TTS에 비해 생성된 음성이 덜 자연스러웠습니다.

 

 Wavenet은 기존의 방식과 다르게 오디오의 파형을 직접 모델링하여 훨씬 자연스러운 음성을 생성하는 데 성공했고, 컨디션 모델링을 통해 다양한 음성을 생성할 수 있었습니다. 또한, Wavenet은 음악 생성을 포함한 다양한 오디오 생성 분야에도 응용될 수 있음을 보여주었습니다.

 

WaveNet

 Wavenet오디오 파형 데이터를 직접 사용해서 새로운 파형을 모델링합니다

파형 \(x=x_1, x_2,..., x_n\)는 조건부 확률을 이용하여 다음과 같이 나타냅니다.

$$p(x) = \prod _{t=1}^{T}p(x_t\mid x_1, x_2, ..., x_{t-1})$$

 

 즉, 각 샘플\(x_i\)의 확률 분포는 미래의 샘플 \(x_{i+1},x_{i+2},...,x_{T}\)에 의존하지 않고 오직 이전 샘플에만 의존해서 결정됩니다.

 

Dilated Causal Convolutions

 Wavenet에서는 아래 그림과 같이 오직 과거의 파형 정보만 접근할 수 있도록 Causal Convolutional Layer를 여러 겹 쌓았습니다. 

실제 구현할 때는 단순히 이전 층의 결과를 쉬프팅 하면서 1d Convolutional Layer를 쌓으면 됩니다.

 학습 시에는 Ground Truth를 모두 알고 있기 때문에 모든 스탭에 대한 예측을 동시에 진행할 수 있습니다. (Teacher Forcing)

음성을 생성할 때예측을 한 스탭씩 진행하게 되고 매 스탭마다 결과 값을 다음 스탭의 입력값으로 주어지게 됩니다.

 

 이런 식으로 긴 시계열을 다룰 때 RNN을 사용하지 않고 Causal Convolutional Layer를 사용하면 모델을 빠르게 학습할 수 있습니다.

하지만, 동일한 Dilation의 Convolutional Layer를 쌓으면 Receptive Field를 넓히기 위해 많은 층이 필요하다는 단점이 있습니다.

예를 들어, 위 그림에서는 4개의 층을 쌓았지만 Receptive Field가 5(=#layers + filter length - 1)밖에 되지 않습니다.

 

 이 문제를 해결하기 위해 Wavenet일정 스탭(Dilation)을 건너뛰면서 Filter를 적용하는 Dilated Convolution을 사용합니다. Dilated Convolution은 적은 층 수의 Layer로도 Receptive Field를 효과적으로 넓힐 수 있게 만듭니다. 예를 들어, 아래 그림은 Dilation이 각각 1, 2, 4, 8인 Dilated Causal Convolution Layer를 차례로 쌓은 모습을 나타냅니다. 이때, Receptive Field는 16이 됩니다.

 

출처: https://deepmind.com/blog/article/wavenet-generative-model-raw-audio

 논문에서는 Dilation을 일정 제한까지 두 배씩 증가시키고 이를 반복(1, 2, 4, ..., 512, 1, 2, 4, ..., 512, 1, 2, 4, ..., 512)하며 층을 쌓아 올렸습니다.

 

Softmax Distributions

 논문에서 Conditional Distribution을 모델링할 때 Softmax Distribution을 사용했습니다. 일반적으로 오디오는 16-bit 정수 값으로 저장하기 때문에 그대로 사용하면 스탭마다 총 65536개의 확률을 다뤄야 합니다. 이 수를 줄이기 위해서 오디오 데이터에 \(\mu\)-law Companding을 적용해서 256개 중 하나의 값으로 양자화시켜 사용했습니다.

 

\(\mu\)-law Companding:

$$f(x_t) = sign(x_t)\frac{\ln(1+\mu\mid x_t\mid)}{\ln(1+\mu)} $$

 이러한 Non-Linear 한 양자화 방식이 Linear한 양자화 방식보다 더 좋은 성능을 보였다고 합니다.

 

Gated Activation Units

 Wavenet은 PixelCNN에서 사용된 Gated Activation Unit을 사용합니다.

 

Gated Activation Unit:

$$z = \tanh(W_{f, k}*x) \odot \sigma (W_{g,k}*x)$$

$$*: Convolution 연산\\ \odot :Element-wise 곱셈 \\ \sigma() : Sigmoid\:Function\\ W:학습 가능한 Convolution Filter \\ f: filter \\ g:gate\\k:layer 번호$$

 

 매 층마다 입력 값이 주어지면 Filter와 Gate에 대한 Convolution을 각각 구한 뒤 Element-Wise 곱을 구합니다.

 

Residual and Skip Connections

 Wavenet은 학습 시 수렴 속도를 높이고 깊은 모델을 만들기 위해 매 층마다 Residual, Skip Connection을 사용합니다.

Wavenet의 전체 구조는 아래와 같습니다.

 논문에서는 Residual, Skip Connection을 어떻게 구현했는지 자세히 묘사하지는 않았습니다. 그림으로 봐서는 Gated Activation Unit을 적용한 뒤 Residual에 대한 1x1 Convolution과 Skip Connection에 대한 1x1 Convolution을 따로 구했을 것으로 보입니다.

 

Conditional WaveNets

Wavenet은 조건 h가 주어졌을 때의 조건부 확률인 \(p(x\mid h)\)를 다음과 같이 모델링할 수 있습니다.

$$p(x\mid h)=\prod _{t=1}^{T}p(x_t\mid x_1, x_2, ..., x_{t-1}, h)$$

 

 이렇게 모델에 조건을 추가함으로써 Wavenet은 특별한 성질을 가진 오디오를 생성할 수 있습니다. 예를 들어서, 여러 명의 화자에 대한 음성 데이터가 주어졌다면 화자에 대한 정보를 조건으로 설정하여 각 화자에 대한 음성을 생성할 수 있게 만들 수 있습니다. TTS의 경우에는 텍스트에 대한 정보가 필요하기 때문에 이를 조건으로 설정해서 모델을 학습하면 됩니다.

 

 Wavenet의 조건을 설정하는 방식에는 전역적인 방법(Global Conditioning)과 지역적인 방법(Local Conditioning)이 있습니다

이름에서 유추할 수 있듯이, 전역적인 방법을 사용하면 주어진 조건 정보가 모든 스탭에 동일한 영향을 주게 됩니다. (ex. 화자에 대한 정보)

 

이때 앞에서 설명한 Activation Function이 다음과 같이 변하게 됩니다.

$$z = \tanh(W_{f, k}*x+V_{f,k}^{T}h) \odot \sigma (W_{g,k}*x+V_{g,k}^{T}h)$$

V는 학습 가능한 Linear Projection을 나타냅니다.

 

 지역적인 방법조건이 시계열 \(h_t\)로 주어졌을 때 사용할 수 있습니다.(ex. TTS모델에서 Linguistic Features)

\(h_t\)를 Activation Function에 적용하기 위해서 \(h_t\)의 타임 스탭 수를 오디오의 타임 스탭 수와 똑같게 맞춰줘야 합니다.

이를 위해 Transposed Convolution을 사용하거나 단순히 각 스탭을 복제해서 맞춰줄 수 있습니다.

 

스탭 수를 맞춰준 조건 정보를 \(y=f(h)\)라고 할 때 Activation Function은 다음과 같이 변하게 됩니다.

$$z = \tanh(W_{f, k}*x+V_{f,k}*y) \odot \sigma (W_{g,k}*x+V_{g,k}*y)$$

\(V_{f,,k}*y\)는 1x1 Convolution을 나타냅니다.

 

예제

딥마인드 블로그에서 Wavenet으로 생성한 음성, 음악을 들을 수 있습니다.

https://deepmind.com/blog/article/wavenet-generative-model-raw-audio

 

 

구현

본 게시글의 원저자분이 Pytorch로 Spectrogram Conditional Wavenet을 구현한 코드입니다.

데이터 셋으로 LJspeech를 사용하고, log mel spectrogram을 구한 뒤 타임 스탭 수를 맞추어 조건으로 사용했다고 합니다.

https://github.com/choyi0521/wavenet-pytorch

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함