본문 바로가기

데이터 과학/가상인간 개발

논문리뷰 - Unsupervised Singing Voice Conversion

1. Abstract

텍스트, 음표 없이 노래의 목소리를 변환하는 딥러닝 알고리즘을 개발해보자.

단 음표, 가사, 가수들 간의 pair 데이터 같은 supervision 없이.

모델 구조는 CNN encoder와 WaveNet decoder로 구성하였고 CNN은 여러 가수들의 목소리를 받아 singer-agnostic 한 vector를 뽑아낸다.

새로운 data augmentation과 loss를 도입한 결과 자연스러운 목소리를 생성할 수 있었다.

2. Introduction

기존에 deep neural network를 language feature와 notes로 학습한 결과 성공적인 목소리 합성이 가능했음.

본 논문에서는 unsupervised 방식으로 학습하기에 parallel 한 singer 데이터, 악보 등이 필요하지 않음.

이런 unsupervised 방식에서는 노래가 많고, 딥러닝 덕에 voice separation도 잘 되므로 학습데이터를 금방 모을 수 있다.

 

이 논문의 contribution은

  • backtranslation, mixup, new data augmentation 기술을 학습에 적용한 것.
  • 최초로 unsupervised 방식의 singing voice conversion 모델을 고안한 것.
  • unsupervised 방식에서 1 encoder, 1 decoder 방식이 잘 된다는 것을 보인 것.
  • unsupervised audio translation을 도입한 2 phase training을 고안한 것.

3. Related work

WaveNet: musical domain에서의 translation에 많이 사용하였음. 본 논문에서는 wavenet을 unsupervised 방식으로 학습.

VQ-VAE: quantized latent space 기반으로 voice conversion. 대신 본 논문에서는 domain confusion loss를 사용.

기존의 singing synthesis and conversion: 가사랑 음표를 받아 노래 생성하는 WaveNet decoder 가 나오고 나서부터 잘 되기 시작. 이후에도 여러 방법론들이 나왔지만 대부분 supervised learning으로 학습. 그런데 벤치마트나 코드 제공도 안되어있음.

Singing voice conversion with non-parallel data: parallel 데이터 없이 일상대화 target voice로 conversion. many-to-one 방식. Sample은 아주 만족스럽지 않았음.

Backtranslation: $A$언어의 sample $a$를 $B$언어의 $b$로 번역 후 $(b, a)$ pair로 $B$->$A$ MT모델을 학습.

Mixup training: $(x_1, y_1), (x_2, y_2)$를 beta distribution에서 sampling한 weight로 weighted sum하여 새로운 example을 만든 후 training에 사용. 본 연구에서는 beta 대신 uniform distribution을 사용.

4. Methods

$E(\cdot)$는 encoder, $D(\cdot)$는 decoder, LUT의 $\mathbf{v}_j$는 $j$번째 가수의 embedding vector, $C(\cdot)$는 가수를 분류하는 classifier이다 (domain confusion network).

얘들은 전부 학습된다.

encoder는 WaveNet과 유사한 dialated ConvNet, decoder는 WaveNet decoder, domain confusion network는 3 layer의 1D-conv와 ELU activation function, output layer로 구성된다.

 

학습은 두 phase로 이루어진다.

첫 번째 phase에서는 $j$ 번째 가수의 sample인 $\mathbf{s}^j$를 $E(\cdot), D(\cdot)$에 넣어 나온 $\tilde{\mathbf{s}^j}$가 $\mathbf{s}^j$와 같아지도록 Reconstruction loss를 최소화 한다.

Decoding 과정에서 encoding 된 vector와 singer embedding vector $\mathbf{v}_j$가 concat되어 decoder로 넘어가는 것을 제외하면 흔히 아는 autoencoder 학습과 같다.

이를 수식으로 나타내면 다음과 같다.

$$\sum_j \sum_{\mathbf{s}^j} \mathcal{L}(D[v_j](E(\mathbf{s}^j)), \mathbf{s}^j)$$

 

이와 동시에 domain confusion network $C$는 encoding 된 vector가 어느 가수에게서 나온 것인지를 학습한다.

object function은 다음과 같다.

$$\sum_j \sum_{\mathbf{s}^j} \mathcal{L}(C(E(\mathbf{s}^j)),j)$$

위의 object function로 gradient를 구한 후에 encoder의 parameter를 업데이트 할 때는 위의 함수 값이 커지는 방향으로 업데이트 해준다 (Encoding가 domain confusion network classifier를 속일 수 있도록).

그래야 encoding된 vector만으로 가수를 구별할 수 없게 학습이 된다 (singer-agnostic).

 

두 번째 phase에서는 translation 을 잘 하도록 학습한다.

 

이를 위해 우선 두 가수가 섞인 데이터를 만드는 mixup 작업을 해야한다.

이 mixup 작업은 singer embedding vector space에서 이루어진다. mixup된 vector $u$를 수식으로 나타내면 아래와 같다.

$$u = \alpha v_j + (1 - \alpha)v_{j'}$$

여기서 $\alpha$는 $[0, 1]$ 에서 uniformly sampling된 weight다.

 

다음으로 mixup vector $u$와 $j$번 가수의 encoded sample $E(\mathbf{s}^j)$를 decoder에 넣어 mixup sample $\tilde{\mathbf{s}}_u^j$ 를 generation 한다.

 

그리고는 generated sample $\tilde{\mathbf{s}}_u^j$를 다시 autoencoder에 넣어 $\mathbf{s}^j$를 잘 reconstruction 할 수 있도록 아래의 object function을 최소화 한다.

$$\sum_{\mathbf{s}^j_u} \mathcal{L} (D[\mathbf{v}_j](E(\tilde{\mathbf{s}}_u^j)), \mathbf{s}^j)$$

 

데이터셋에 있는 어느 가수의 노래 $\mathbf{s}$를 $j$번 가수의 목소리로 변환할 때는 아래의 값을 구하면 된다.

$$D[\mathbf{v}_j](E(\mathbf{s}))$$

5. Experiments

Singing voice trnaslation은 사람이 직접 점수를 매기는 방식으로 평가한다. Conversion의 naturalness score가 4점대, similarity score가 약 3.5점으로 우수하다.

Automated evaluation으로는 voice identifiability를 판단하는 CNN이 얼마나 정확하게 conversion된 목소리를 인식하는지를 볼 수 있다. Converted sample이 90% 대의 정확도를 보여 우수하다고 볼 수 있다.

Ablation study로 본 논문에서 고안한 component들을 하나씩 제거하였을 때 성능이 어떻게 변하는지를 살펴보았다.

뭐 한 가지라도 제거하였을 때 full method보다 성능이 좋지 않은 것을 보아 본 논문에서 제안된 방법론들이 모두 유용하다는 것을 알 수 있다.

6. Discussion

Phase2 training이 왜 동작하는지 직관적으로 이해가 되지 않는다.

일단 $E(\cdot)$는 singer-agnostic 하게 학습되었으니 가수에 대한 정보는 $\mathbf{v}_j$에만 포함되어 있을 것이다.

이 때 가수를 섞어 $\mathbf{u}$를 만들고 reconstruction을 하면, $j$와 다른 가수가 합체하여 부른 노래 $\tilde{\mathbf{s}_u^j}$가 나올 것이다.

 

이렇게 구한 $\tilde{\mathbf{s}_u^j}$는 $\mathbf{s}^j$와 같은 노래이면서 목소리만 섞인 버전이라고 생각하면 될 것 같다 (Encoder에서 나온 vector는 singer-agnostic이므로 '노래'에 관한 정보만 포함하고 있을 것 같다).

 

그러니 $D[\mathbf{v}_j](E(\tilde{\mathbf{s}_u^j}))$ 가 $\mathbf{s}^j$로 reconstruction되도록 학습한다는 것은, 노래는 그대로 유지하면서 섞인 목소리만 $j$의 것으로 변환하는 작업을 학습하는 것으로 이해하면 될 것 같다.

 

아쉬운 점은 학습 데이터가 목소리로만 구성되어 있어야 한다는 점.

그래서 데이터 수집을 위해서 music source separation 모델이 필요하다.

본 블로그는 쿠팡 파트너스 활동을 포함하고 있으며, 이에 따른 일정액의 수수료를 제공받습니다.