Diff-SVC 모델를 사용해 노래의 음성을 원하는 음성로 변환하는 프로젝트
Diff-SVC repository : https://github.com/prophesier/diff-svc
해당 리포지토리에서는, diff-svc-local 폴더를 fork하면 됨.
anaconda3와 cuda 설치 안되어있다면, 설치하기
python=3.8 인 conda 환경 구축하기 (3.8 버전 혹은 3.9 버전 설치 바람.)
conda create -n diff-svc python=3.8환경 활성화하기. (모델 돌리기 전에, 항상 먼저 실행해줘야 함.)
conda activate diff-svcconda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidiapytorch, torchvision 버전에 맞춰 설치하기.
pip install -r requirements.txt
pip install -r requirements_short.txtrequirements.txt를 통해 필요한 패키지 설치하기.
해당 구글드라이브 폴더에서 다운 받으면 됨. : checkpoints - Google Drive
다운받아 checkpoints 폴더에 넣어주면 됨.
nsf_hifigan_xxxx.zip https://github.com/openvpi/vocoders/releases 여기서도 다운 받을 수 있음. (44.1kHz 모델 훈련하고 싶으면, nsf_hifigan(44.1kHz vocoder) 파일 꼭 다운받아야함.)
nsf_hifigan_finetune, nsf_hifigan_onnx 필요 없음.
타깃 대상의 보컬 데이터 준비하기
- 배경음악 없어야 함.
- 단독 목소리이어야 함.
- 말하기 / 노래 데이터 사용 가능함. *일반적으로, 노래 데이터가 더 믾이 사용되는 편임.
.wav,.ovv파일 형태이어야 함.- 5~15초 길이의 오디오 파일이어야 함. (더 길어도 가능하지만, CUDA OOM에 문제가 생길 수 있음.)
- 샘플링 레이트는 24kHz 이상이 좋은 편임. 16kHZ 이하면 안됨.
- 폴더명, 파일명에 공백이 있으면 안됨.
- 파일명은 고유해야함. (다른 폴더에 있어도, 파일명이 같으면 안됨.)
- 최소 6개의 파일 이상 있어야함.
+) 노래 부르는 영상에서, 반주 제외하고, 음성 부분만 추출해줌.
- GAUDIO STUDIO : https://studio.gaudiolab.io/
+) 44100Hz & 16비트 변환
- wav to mp3 : https://js-audio-converter.com/kr/
데이터에 노이즈가 많다면, 정제해주는 것이 좋음.
- Adobe Podcast : https://podcast.adobe.com/enhance
- Adobe Audition : https://helpx.adobe.com/audition/using/match-loudness.html
굳이 따로 슬라이싱할 필요 없음. 프로그램이 알아서 슬라이싱해줌. 따로 슬라이싱 원하다면,
15초 간격으로 음성 분리해서 파일로 저장해줌.
- Free Batch Music Splitter : https://www.fosshub.com/Free-Batch-Music-Splitter.html
preprocess 라는 폴더 생성하고, 학습 데이터 넣어주기.
그 후,
python sep_wav.py
# 슬라이싱하는 데, 시간이 오래 걸릴 수 있음완료된 후, preprocess_out 폴더에 슬라이싱된 데이터 확인 가능함.
해당 데이터를 data/raw/{speaker_name} 를 생성해 넣어주기.
(여기서, 이미 따로 오디오 슬라이싱 작업을 진행한 경우 해당 단계를 패스함.)
원시 오디오 데이터를 이진 파일로 변환하기.
config.yaml (24kHz vocoder 사용하는 경우)
config_nsf.yaml (44.1kHz vocoder 사용하는 경우)
confg 파일에서 {speaker_name}으로 변경하기 (경로 마지막 부분 nsf라고 써있는 부분을 변경하기)
config 파일 수정하기 전, 복사본 생성해두기.
binary_data_dir: data/binary/{speaker_name}
# 전처리 데이터 파일 경로
raw_data_dir: data/raw/{speaker_name}
# 원시 데이터 파일 경로
speaker_id: {speaker_name}
# 타깃 대상 이름
work_dir: checkpoints/{speaker_name}(선택사항) pitch extraction 알고리즘 변경
CREPE 알고리즘 (pitch extraction)
use_crepe: true
# 더 좋은 결과를 위해 true로 설정함. 빠른 전처리를 원하면 false로 설정하기.**# Windows (cmd)**
set PYTHONPATH=.
set CUDA_VISIBLE_DEVICES=0
python preprocessing/binarize.py --config training/config_nsf.yaml
**# Linux**
export PYTHONPATH=.
CUDA_VISIBLE_DEVICES=0 # GPU 사용 설정
python preprocessing/binarize.py --config training/config_nsf.yaml이때,
File "preprocessing/binarize.py", line 6, in <module>
from utils.hparams import set_hparams, hparams
ModuleNotFoundError: No module named 'utils.hparams'오류가 뜨면,
최상위 폴더로 [binarize.py](http://binarize.py) 를 옮기고,
python binarize.py --config training/config_nsf.yaml이 오류가 나는 것은 환경변수 설정이 잘 안되어서임.
그리고 아래와 같은 오류가 뜨면,
RuntimeError: stft requires the return_complex parameter be given for real inputs, and will further require that return_complex=True in a future PyTorch release.modules/nsf_hifigan/nvSTFT.py 에서 해당 코드에 return_complex=False 파라미터 추가하기.
max_sentences: 88 # VRAM의 80G에 해당하므로, VRAM에 따라 조정해줘야 함.
# CUDA Out of Memory 에러가 뜨면,
# config 파일에서, max_sentences (batch_size)를 줄여주면 됨.
# 여기서는 10으로 설정함.
# 선택사항
endless_ds: false
# true로 설정하면, 1,000개의 epoch를 하나의 epoch로 취급함.
val_check_interval: 2000
# test dataset에 대한 추론할 때, 2,000 step마다 checkpoint를 저장함.
num_ckpt_keep: 10
# checkpoint 파일이 최신 10개로 유지됨.set CUDA_VISIBLE_DEVICES=0
python run.py --config training/config_nsf.yaml --exp_name {project_name} --reset
checkpoints는 `{your_project_folder}/checkpoints/{youer_project_name}` 에서 `val_check_interval` step (default는 2,000 step)마다 저장됨.+) Tensorboard (선택사항)
tensorboard를 통해, 진행사항을 보고 싶다면,
tensorboard --logdir=checkpoints/{your_project_name}/lightning_logs/lastest실행 후, http://localhost:6006/ 에서 Tensorboard 확인하기.
input 데이터 음성을 타깃 대상의 음성으로 변환하는 단계임. ex) 뉴진스 노래를 침착맨 목소리로 변경하기
이를 “랜더링 (rendering)”이라고 부르는 편임.
추론 단계에서, [infer.py](http://infer.py) 혹은 inference.ipynb 파일를 사용하게 됨.
사용의 편의를 위해 inference.ipynb 파일 사용을 추천함.
Jupyter Notebook을 사용하기 위해,
conda install notebook
conda install ipykernel
ipython kernel install --user --name=diff-svc # kernel 이름은 각자 편의대로.project_name: training에 사용된 프로젝트 이름; config 파일에서 설정한 이름model_path: checkpoint 파일 경로config_path: config 파일 경로wav_fn: input 오디오 파일 경로wav_gen: output 오디오 파일이 저장될 경로 *.wav 대신 .flac와 같은 다양한 오디오 파일 형식을 지원함.key=0(선택사항) : 피치 조정 ex) 남자 목소리를 여자 목소리로 변경한다면, 8 혹은 12로 설정pndm_speedup(선택사항) : 추론 가속 계수 default값이 20은, 1000/20=50 diffusion step이 추론 중에 실행된다는 의미. 더 빠른 추론을 원하면, 해당 값을 높이면 됨.use_crepe(선택사항) : true로 설정하면, CREPE 알고리을 사용해 추론 도중에 pitch extraction 한다는 의미. false로 설정하면, 더 빠르게 추론 결과를 얻을 수 있음
output 파일은 wav_gen 에서 설정한 경로로 저장됨.
-
Diff-SVC local guidebook : https://docs.google.com/document/d/1XQlOcv1Xx2BpVeSUyDleb2Th9sYOnG1miFrGZ8uGcsE/edit
-
인공 르르땅으로 핫한 Diff-svc 학습방법(로컬 환경, 집 컴퓨터) : https://www.youtube.com/watch?v=8hJ1Wullg_g
-
The Beginner’s Guide to Diff-SVC : https://diff-svc.gitbook.io/the-beginners-guide-to-diff-svc/






