본문 바로가기

Machine Learning

so-vits-svc 구조 정리

반응형

2023년 7월 1일의 svc-develop-team/so-vits-svc v4.1 기준으로 쓴 글입니다.

https://github.com/svc-develop-team/so-vits-svc/tree/76128e95ec09a5adcf4d6b233bc5c8ef78cce377

 

GitHub - svc-develop-team/so-vits-svc: SoftVC VITS Singing Voice Conversion

SoftVC VITS Singing Voice Conversion. Contribute to svc-develop-team/so-vits-svc development by creating an account on GitHub.

github.com

소개

중국 쪽 커뮤니티에서 시작된 프로젝트로 Singing Voice Conversion을 수행하는 프로젝트입니다. 발전속도가 꽤 빠르지만 제일 처음 시작된 레포지토리가 터지고 안그래도 어려웠던 프로젝트 히스토리 파악이 더 어려워졌습니다. 그래서 4.1 기준으로 현재 어떤 방식들이 적용되어 있는지 소개하기 위한 글입니다.

SoftVC VITS Singing Voice Conversion 이게 현재 레포지토리 소개 글입니다. Singing Voice Conversion은 태스크 명, SoftVC와 VITS가 뭔지부터 짚고 갑시다.

VITS

ICML 2021에 발표된 Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech에서 제시한 End-to-End TTS 모델로 WaveGlow, Hifi-GAN을 결합해서 E2E로 학습을 수행하는 TTS 모델이다.

SoftVC

ICASSP 2022에 발표된 A Comparison of Discrete and Soft Speech Units for Improved Voice Conversion의 모델을 Soft-VC라고 부른다. 음성을 이용하여 자가지도학습을 수행한 뒤에, 해당 모델의 hidden feature에 대하여 quantization을 수행하여 이를 discrete token을 얻은 뒤, 이를 사용하여 음성 변조를 수행하는 연구가 여럿 등장했다. Soft-VC는 그러지 말고 continuous representation을 그대로 써보자는 연구였다. 데모를 들어보면 Any-to-One VC가 상당히 잘되며, 특히 외국어도 괜찮게 되는 것이 인상적이다.

So-VITS

이제 둘을 결합시켜보자.

VITS는 Text Encoder가 Prior를 학습하고 Wave Encoder가 Posterior를 학습한다. 그리고 둘 사이의 변환을 Normalizing Flow를 통해 학습한다. 이 때 prior와 posterior 간에 sequence length가 안맞는 문제가 발생하는데 이 때 Stochastic Duration Predictor와 Monotonic Alignment Search를 적용하여 둘 사이의 alignment를 학습한다. Waveform Generation에는 HiFi-GAN 구조를 그대로 들고 와서 사용한다.

Soft-VC는 먼저 fairseq의 Pretrained Hubert-base를 가져와서 최종적인 label에 대해서 finetuning을 수행한다. 그 뒤에 finetuning된 hubert를 feature encoder로 사용하여 Tacotron2 기반의 hubert feature -> mel을 수행하는 Acoustic Model을 학습하고 Hifi-GAN을 보코더로 사용한다.

Voice Conversion을 위해 둘을 결합하는 방식은 굉장히 자명하다.

Text input 대신에 Hubert Feature를 사용해서 VITS를 학습시키면 된다. 다만, Duration Predictor가 필수적으로 사용될 필요가 없어진다. 왜냐? Hubert Feature는 고정된 50Hz의 sampling rate를 가진다. posterior의 sampling rate가 prior보다 높은 경우가 많기 때문에 단순히 prior를 비율에 맞춰 expand 시켜주는 걸로도 학습이 가능하다.

naive-so-vits

위의 구조는 Voice Conversion을 생각 했을 때 나올 수 있는 가장 Naive한 구조이다.

Singing Voice Conversion

so-vits-svc의 목표는 Voice Conversion이 아닌 Singing Voice Conversion이다. 일반적으로 Singing Voice Conversion은 pitch condition이 없으면 잘 안된다. 그래서 f0에 대한 condition을 추가한다.

f0를 condition으로 주게 되면서 디코더의 구조도 변경하게 된다. 디코더에 f0를 condition으로 주게 되면서 Neural Source Filter의 방식을 가지고 온다. Source Module에 f0를 줘서 이를 사용하여 Sine Waveform을 만들고 HiFi-GAN의 Residual Block을 Filter로 사용하여 음성을 만들어내는 NSF-HiFi GAN으로 모듈을 변경한다.

여기까지가 기본적인 so-vits-svc의 구조이다.

Advances

Soft-VC와 VITS, 그리고 NSF를 결합한 형태에서 이런 저런 것들이 추가됐는데 그 방향은 두 가지로 볼 수 있다.

1. Better Input Representation

Soft-VC에서 제시한 Hubert-soft는 결국 vanila hubert이다. 무엇보다 입력 음성의 화자 정보를 여전히 많이 포함하고 있다. 음성 변조의 측면에서 봤을 때 전혀 좋지 못하다.

그래서, hubert-soft에서 contentvec, 혹은 whisper-encoder로 feature encoder를 바꾼다. contentvec은 hubert 구조에서 speaker information을 없애는 방향으로 학습을 진행한 모델이며, whisper는 openai에서 공개한 대규모 음성인식 모델이다. 둘 다 같은 목적을 가지고 적용되었다.

첫째는 입력 음성에서 화자 정보를 줄이는 것이며, 둘째는 noise robustness다. 뭐가 더 우수한지는 모르지만, 경험상 hubert-soft 보다는 낫다.

더 좋은 입력 피처를 위해 적용된 또 다른 방법은 Feature Retrieval이다. Unparallel corpus를 사용하는 이상 Training-Inference Mismatch는 발생할 수 밖에 없는데 이를 줄이기 위해서 학습에 사용된 feature들을 클러스터링한 뒤에 Inference 시에 입력으로 들어온 feature와 cluster를 섞어서 사용하는 것이다. 솔직히 이건 차이가 미묘하다.

2. Post-Processing

두 가지 후처리 방식이 있다. NSF-HifiGAN Enhance와 Shallow Diffusion이다. 두 방식 모두 출력으로 나온 waveform을 멜로 바꾸고 후처리를 수행한 뒤에 보코더를 사용해 다시 Waveform으로 복원한다.

NSF-HifiGAN Enhancer가 하는 일은 방금 말한대로 output waveform을 mel로 바꾼뒤 다시 reconstruction하는 것 뿐이다. 정확히 어떤 점을 노리고 한 것인지는 모르지만, f0 guiding이 있으면 smoothed mel을 좀더 선명하게 해주는 효과는 기대할 수 있을 거 같다.

Shallow Diffusion은 DiffSinger에서 제시한 방식이다. Diffusion은 Pure Noise로부터 여러 스텝에 걸쳐 샘플링을 수행하는데 Shallow Diffusion은 최종 단계보다 k스텝 이전의 결과물을 예측한 다음, 해당 결과물에서 k스텝만큼 denoising을 하여 생성을 하는 방식이다.

여기서 출력된 waveform을 k 스텝 이전의 결과물이라고 가정한 다음 diffusion을 수행하는 후처리를 진행한다.

shallow diffusion

 

반응형