https://github.com/CNChTu/Diffusion-SVC


CNChTu의 Diffusion-svc


DDSP-SVC나 so-vits-svc(4.1)에 최근 shallow diffusion을 사용하는 같은 추가 기능이 있었는데, 이번에 그게 단품 프로젝트로 이용할 수 있게 되었음


여기서 학습 시키면 ddsp/sovits 4.1(gui fork 아님)쪽 추가 기능에도 사용 가능. 원조 diff-svc랑 호환 되는지는 몰름

+이번에 diffusion 모델과 naive 모델을 합쳐서 사용하는 형태로 바뀜. ddsp/sovits 4.1에서 사용하려면 diffusion모델만 따로 받아놔야할 듯


전체적으로 아직 만드는 중인지 아님 때려친건지 미구현된 기능도 있고 그럼


밑에는 deepl로 번역한 깃헙 readme


+6/20 번역 갱신함

+6/30 번역 갱신함






Diffusion-SVC


이 리포지토리는 DDSP-SVC 리포지토리의 확산(diffusion) 부분을 위한 별도의 리포지토리입니다. 별도로 학습하고 추론할 수 있습니다.


최근 업데이트: 이 리포지토리의 naive 모델을 얕은 확산 모델과 함께 사용하면 매우 낮은 훈련 비용으로 확산 모델만 사용하는 것보다 더 나은 결과를 얻을 수 있으며, 적극 권장됩니다. 그러나 소규모 네트워크에 대한 나이브 모델은 일반화 능력이 약하고 소규모 데이터 세트에서 음역대 문제가 발생할 수 있습니다. 이 경우 naive 모델 미세 조정은 너무 많은 단계에 대해 훈련할 수 없으며(기본 모델이 저하될 수 있음), 사전 단계를 무한 톤 범위 ddsp 모델로 대체하는 것도 고려할 수 있습니다.

효과 및 소개는 [소개 동영상(아직 완성되지 않음)]을 참조하세요.


0. 소개

Diffusion-SVC는 DDSP-SVC 리파지토리의 확산 부분을 위한 별도의 리파지토리입니다. 별도로 학습하고 추론할 수 있습니다.


이 프로젝트는 더 잘 알려진 Diff-SVC에 비해 메모리 사용량이 훨씬 적고, 훈련과 추론 속도가 빠르며, 얕은 확산과 실시간 사용에 최적화되어 있습니다. 더 강력한 GPU에서 실시간 추론이 가능합니다. 얕은 확산을 위한 이 프로젝트의 naive 모델과 결합하면 약한 GPU에서도 실시간으로 좋은 품질의 오디오를 생성할 수 있습니다.


훈련 데이터와 입력 소스의 품질이 모두 매우 높을 경우 Diffusion-SVC가 최상의 변환 결과를 얻을 수 있습니다.


이 외에도 최종 출력을 개선하거나 성능 소모를 줄이기 위해, 얕은 확산을 위해 다른 음향 모델 다음에 쉽게 캐스케이드할 수 있습니다. 예를 들어 DDSP-SVC 다음에 Diffusion-SVC를 캐스케이딩하면 필요한 확산 단계 수를 더욱 줄이고 고품질의 결과물을 얻을 수 있습니다.


면책 조항: 합법적으로 획득한 라이선스 데이터만 Diffusion-SVC 모델을 훈련하는 데 사용해야 하며, 이러한 모델이나 합성된 오디오를 불법적인 목적으로 사용하지 마시기 바랍니다. 이 라이브러리의 작성자는 이러한 모델 체크포인트 및 오디오의 사용으로 인해 발생하는 저작권 침해, 사기 또는 기타 불법 행위에 대해 책임을 지지 않습니다.


1. 종속성 설치

  1. PyTorch 설치: PyTorch 공식 웹사이트에서 PyTorch를 다운로드하는 것이 좋습니다.
  2. 의존성 설치하기
pip install -r requirements.txt

2. 사전 학습된 모델 구성하기

  • (필수) 사전 훈련된 ContentVec 인코더를 다운로드하여 pretrain폴더에 배치합니다. 잘린 ContentVec 이미지의 효과는 완전히 동일하지만 크기는 190MB에 불과합니다.
    • 참고: 다른 특징 추출도 사용할 수 있지만 ContentVec이 여전히 선호되며, 지원되는 모든 특징 추출은 tools/tools.pyUnits_Encoder 클래스에서 사용할 수 있습니다.
  • (필수)DiffSinger 커뮤니티 보코더 프로젝트에서 사전 훈련된 보코더를 다운로드하여 pretrain/폴더에 압축풀기합니다.
    • 참고: 이름에 nsf_hifigan_finetune이 아닌 nsf_hifigan이 포함된 zip 파일을 다운로드해야 합니다.
  • 보코더 모델을 사용해야 하는 경우, 설정 파일에서 use_speaker_encoder를 true로 설정하고 여기에서 미리 학습된 보코더 모델을 다운로드합니다(mozilla/TTS에서 제공).

3. 전처리

1. 훈련 및 검증 데이터 세트 구성하기

1.1 수동 구성:

모든 훈련 세트 데이터(.wav 형식의 오디오 슬라이스)를 data/train/audio 또는 구성 파일에 지정된 폴더(예: xxxx/yyyy/audio)에 배치합니다.


모든 검증 세트 데이터(.wav 형식 오디오 슬라이스)를 data/val/audio 또는 구성 파일에 지정된 폴더(예: aaaa/bbbb/audi)에 배치합니다.


1.2 프로그램 무작위 선택(구현되지 않음):

python draw.py를 실행하면 프로그램이 유효성 검사 세트 데이터를 선택하는 데 도움을 줍니다(draw.py에서 파라미터를 조정하여 추출할 파일 수와 같은 파라미터를 수정할 수 있음).


1.3 폴더 구조 디렉토리 표시:

참고: 화자 아이디는 0이 아닌 1부터 시작해야 하며, 화자가 한 명뿐인 경우 화자 아이디는 1이어야 합니다.


디렉토리 구조:

data

├─ train

│    ├─ audio

│    │    ├─ 1

│    │    │   ├─ aaa.wav

│    │    │   ├─ bbb.wav

│    │    │   └─ ....wav

│    │    ├─ 2

│    │    │   ├─ ccc.wav

│    │    │   ├─ ddd.wav

│    │    │   └─ ....wav

│    │    └─ ...

|

├─ val

|    ├─ audio

│    │    ├─ 1

│    │    │   ├─ eee.wav

│    │    │   ├─ fff.wav

│    │    │   └─ ....wav

│    │    ├─ 2

│    │    │   ├─ ggg.wav

│    │    │   ├─ hhh.wav

│    │    │   └─ ....wav

│    │    └─ ...

2. 공식적인 전처리

python preprocess.py -c configs/config.yaml

전처리하기 전에 구성 파일 configs/config.yaml을 수정할 수 있습니다.


3. 참고:

  1. 모든 오디오 슬라이스의 샘플 레이트를 yaml 구성 파일의 샘플 레이트와 동일하게 유지하세요! (리샘플링, 전처리 등에는 faq 사용을 권장합니다.)
  2. 긴 오디오를 작은 섹션으로 슬라이스하면 훈련 속도를 높일 수 있지만 모든 오디오 슬라이스는 2초 이상이어야 합니다. 오디오 슬라이스가 너무 많으면 많은 양의 메모리가 필요합니다. 구성 파일에서 cache_all_data 옵션을 false로 설정하면 이 문제를 해결할 수 있습니다.
  3. 유효성 검사 세트의 오디오 슬라이스 총 개수는 10개 내외를 권장하며, 너무 많으면 유효성 검사 프로세스가 느려집니다.
  4. 데이터 세트의 품질이 좋지 않은 경우 구성 파일에서 "f0_extractor"를 "crepe"로 설정하세요. 크레이프 알고리즘은 노이즈에 가장 잘 견디지만 데이터 전처리에 필요한 시간이 크게 늘어나는 단점이 있습니다.
  5. 구성 파일의 'n_spk' 매개변수는 다중 화자 모델을 훈련할지 여부를 제어합니다. 멀티 스피커 모델을 훈련하는 경우, 스피커에 번호를 매기려면 모든 오디오 폴더의 이름이 'n_spk'보다 크지 않은 양의 정수여야 합니다.


4. 훈련

1. 사전 훈련된 데이터를 사용하지 않고 훈련하려면:

python train.py -c configs/config.yaml

2. 사전 훈련된 모델:

  • 직접 훈련하는 것보다 훨씬 쉽고 경제적이며 작은 데이터 세트보다 더 높은 상한에 도달할 수 있는 사전 훈련된 모델을 사용하여 미세 조정(fine-tuning)하는 것을 강력히 권장합니다.
  • 기본 모델을 미세 조정하려면 기본 모델과 동일한 인코더(예: ContentVec)를 사용해야 하며, 다른 인코더(예: 보이스프린트)도 동일하게 사용해야 하며, 네트워크 크기와 같은 파라미터도 동일해야 한다는 점에 유의하세요.


!!!!!!!!! 얕은 확산 모델 + naive 모델 훈련 권장!!!!!!!!!

k_step_max 깊이까지만 훈련된 얕은 확산 모델과 naive 모델을 함께 사용하면 전체 확산만 사용하는 것보다 훈련 품질이 더 우수하고 훈련 속도가 빠릅니다. 그러나 나이브 모델에는 범위 문제가 있을 수 있습니다.


2.1 확산 사전 학습 모델의 전체 프로세스 학습


사용된 인코더네트워크 크기데이터 세트다운로드
contentvec768l12(권장)512*20

VCTK

m4singer

Huggingface
hubertsoft512*20

VCTK

m4singer

Huggingface
WHISPER-PPG(sovits 전용)512*20

VCTK

m4singer

opencpop

kiritan

Huggingface

 

m4singer/opencpop/vctk 데이터 세트를 사용하여 contentvec768l12로 인코딩된 전체 라이브 베이스 모델을 추가합니다(권장되지 않으며 정상 작동을 보장하지 않음): 다운로드.


2.2  k_step_max 깊이 사전 학습 확산 모델


사용된 인코더네트워크 크기k_step_max데이터 세트확산 모델 다운로드
contentvec768l12512*30100VCTK
m4singer
HuggingFace
contentvec768l12512*20200VCTK
m4singer
HuggingFace
  • 실험 결과, naive 모델은 작은 데이터에서 f0 범위 문제가 있는 것으로 나타났습니다. 더 적은 단계로 naive 모델을 미세 조정하거나 무한 음역대 ddsp 모델을 직접 사용하는 것을 권장합니다.


2.3 (2.2)와 매칭되는 naive 사전 훈련 모델 및 DDSP 사전 훈련 모델


사용된 인코더네트워크 크기데이터 세트종류naive 모델
contentvec768l123*256VCTK
m4singer
NaiveHuggingFace
  • 사전 훈련된 naive 모델은 전체 확산 모델의 이전 나이브 모델에도 사용할 수 있습니다. 그리고 Shallow 모델을 미세 조정할 때는 설정에 decay_step을 포함하는 것이 좋습니다(예: 10000).


3. 사전 훈련된 데이터(프리미티브)로 훈련하기:

  1. 사전 훈련된 다중 화자 모델을 사용할 수 있습니다(훈련에는 오픈 소스에 동의하는 라이선스가 부여된 데이터 세트를 사용하세요).
  2. 사전 학습된 모델은 위를 참조하되, 동일한 인코더가 있는 모델을 사용하도록 특별히 주의하세요.
  3. config.yaml의 "expdir: exp/*****" 파라미터로 지정된 모델 내보내기 폴더에 model_0.pt라는 이름의 사전 학습된 모델을 배치하거나, 폴더가 없는 경우 새로 생성하면 프로그램이 해당 폴더에 사전 학습된 모델을 자동으로 로드합니다.
  4. 프로그램은 해당 폴더에 사전 학습된 모델을 자동으로 로드하고 사전 학습된 데이터를 사용하지 않는 것과 마찬가지로 학습을 시작합니다.

4.1. Naive 및 결합 모델

Naive모델

Naive 모델은 얕은 확산의 전구체로 사용할 수 있는 경량 svc 모델이며, 확산 모델과 동일한 방식으로 학습되며, 예제 구성 파일은 configs/config_naive.yaml에 있습니다. 확산 모델과 동일한 전처리를 거쳐야 합니다.


python train.py -c configs/config_naive.yaml


추론의 경우 -nmodel을 사용하여 사용할 모델 파일을 가리키며, 이 때 얕은 확산 깊이 -kstep가 필요합니다.


모델 결합하기

확산 모델과 naive 모델은 combo.py를 사용하여 콤보 모델로 결합할 수 있으며, 얕은 확산을 위해서는 이 모델만 필요합니다. 두 모델 모두 추론에 동일한 매개 변수를 사용하므로 동일한 매개 변수(예: 동일한 화자 ID)로 훈련해야 합니다.


python combo.py -model <모델> -nmodel <nmodel> -exp <exp> -n <name>

위의 명령을 사용하여 두 모델을 결합합니다. 여기서 -model은 확산 모델의 경로이고 -nmodel은 naive 모델의 경로이며, 모델과 같은 디렉터리에 있는 구성 파일도 자동으로 읽습니다. -exp는 결합된 모델이 출력되는 디렉터리이고, -n은 저장된 결합된 모델의 이름입니다. 위의 명령은 결합 모델을 <exp> 아래 <name>.ptc로 출력합니다.


조합 모델은 추론 시 직접 확산 모델로 로드하여 얕은 확산을 올바르게 수행할 수 있으며, -nmodel을 추가로 입력하여 naive 모델을 로드할 필요 없이 바로 사용할 수 있습니다.


4.2. k_step_max 및 얕은 확산에 대해

(다이어그램은 readme 앞부분 참조)


얕은 확산 시 확산 모델은 특정 가산 잡음 깊이에서만 확산을 시작하며 가우시안 잡음에서 시작할 필요가 없습니다. 따라서 가우시안 노이즈로 시작하지 않고 특정 가산 노이즈 깊이까지만 얕은 확산을 목적으로 확산 모델을 훈련할 수도 있습니다.


이는 구성 파일에 확산 깊이로 k_step_max를 지정하여 수행되며, 이 값은 1000보다 작아야 합니다(완전한 확산을 위한 단계 수). 이러한 방식으로 훈련된 모델은 자체적으로 추론할 수 없으며 이전 모델의 출력 결과 또는 입력 소스에 대해 얕게 확산되어야 하며, 최대 확산 깊이는 k_step_max를 초과할 수 없습니다.


예제 구성 파일은 configs/config_shallow.yaml에서 확인할 수 있습니다.


이 얕은 확산 전용 모델을 naive 모델과 조합하여 조합 모델로 사용하는 것이 좋습니다.


5. 시각화

# 텐서보드를 사용하여 학습 상태를 확인합니다.
tensorboard --logdir=exp

첫 번째 검증이 끝나면 합성된 테스트 오디오를 텐서보드에서 확인할 수 있습니다.


6. 비실시간 추론

python main.py -i <input.wav> -model <model_ckpt.pt> -o <output.wav> -k <keychange> -id <speaker_id> -speedup <speedup> -method <method> -kstep <kstep> -nmodel <nmodel>

-model은 모델의 경로, -k는 키 변경,-speedup은 속도 향상 승수, -methodpndm 또는 dpm-solver, -kstep은 얕은 확산 단계의 수, -id는 확산 모델의 스피커 ID입니다.


-kstep이 비어 있지 않으면 입력 소스의 멜(mel)을 사용하여 얕은 확산이 수행되고, -kstep이 비어 있으면 전체 깊이의 가우시안 확산이 수행됩니다.


-nmodel(선택 사항, 별도 훈련 필요)은 naive 모델의 경로로, 확산 모델에 대략적인 mel을 제공하여 k_step 깊이로 얕은 확산을 수행하는 데에 사용되며, 해당 모델의 매개 변수는 메인 모델과 일치해야 합니다.


보컬 인코딩을 사용하는 경우 -spkemb를 통해 외부 보컬 사전을 지정하거나 -spkembdict를 통해 모델 모델의 보컬 사전을 재정의할 수 있습니다.


7. Units 인덱싱(선택 사항, 권장하지 않음)

RVCso-vits-svc와 유사한 기능 인덱스입니다.


이 기능은 선택적 기능이며 인덱싱하지 않고 정상적으로 사용할 수 있습니다. 인덱싱은 저장 공간을 많이 차지하고 인덱싱 시 CPU도 많이 사용하므로 이 기능은 권장하지 않습니다.


# 인덱스 훈련, 전처리를 먼저 수행해야 합니다.
python train_units_index.py -c config.yaml

추론할 때 -lr 매개변수와 함께 사용됩니다. 이 매개변수는 검색 비율입니다.


8. 실시간 추론

실시간 추론을 위해서는 이 리포지토리와 함께 제공되는 GUI를 사용하는 것이 좋으며, 얕은 확산을 사용해야 하는 경우 먼저 모델을 결합하세요.


python gui_realtime.py


이 프로젝트는 실시간 추론을 위해 rtvc와 함께 사용할 수 있습니다.


참고: 현재 flask_api는 실험 단계이며 rtvc가 완벽하지 않으므로 권장하지 않습니다.

pip install rtvc
python rtvc
python flask_api.py


9. 호환성

9.1. Units 인코더


Diffusion-SVCDDSP-SVCso-vits-svc
ContentVec
HubertSoft
Hubert(기본,대형)×
CNHubert(기본,대형(√*
CNHubertSoft×
Wav2Vec2-xlsr-53-espeak-cv-ft√*××
DPHubert××
Whisper-PPG××
√*
WavLM(Base,Large)××√*


10. 코랩

TheMandateOfRock이 작성한 Diffusion_SVC_EN.ipynb 노트를 사용할 수 있지만, 제가 테스트할 수 있는 상황이 아니므로 해당 노트의 작성자에게 문제점에 대한 피드백을 보내주세요.


11. onnx 출력

exp 폴더 아래에 새 폴더를 만들고(폴더 이름은 나중에 명령에서 ProjectName입니다) 모델과 구성 파일을 그 안에 넣고 모델 이름을 model.pt로, 구성 이름을 config.yaml로 바꿉니다.


그런 다음 다음 명령을 실행하여 내보냅니다.


python diffusion/onnx_export.py --project <ProjectName>


내보내기가 완료되면 MoeVS 구성 파일이 자동으로 생성되는데, 이는 onnx 내보내기를 지원해준 NaruseMioShirakana(MoeVS 작성자) 덕분입니다.