diff - svc를 로컬 환경에서 사용해보기 튜토리얼

diff-svc를 그래픽카드로 학습하고 출력하는 법

안녕하십니까, zerobit입니다. diffusion모델로 음성을 학습시키는 글을 이미 한번 썼지만, Colab환경의 경우 자주 오류도 발생하고, 자동 클릭을 설정해서 꺼지지 않게 처리해줘야 하는 등, 귀찮은 점이 한두 가지가 아닙니다. 심지어 공식 노트북은 저작권 문제로 공유가 중단되었기 때문에, 마음 편하게 로컬환경에서 돌리는 게 여러 방면으로 이득일 수 있습니다.

그러므로 이번 글에서는 로컬 환경으로 돌리는 방법을 설명해 드리겠습니다.

 

권장사양

머신러닝을 원활하게 하기 위해서는 최소한 다음과 같은 사양을 요구합니다.

  • ram 8기가 이상
  • rtx 2060 이상의 6Gb 램 탑재 그래픽카드
  • cpu i3 7세대 / 라이젠 3700 정도면 충분

STEP.1 준비

https://github.com/wlsdml1114/diff-svc

 

GitHub - wlsdml1114/diff-svc: Singing Voice Conversion via diffusion model

Singing Voice Conversion via diffusion model. Contribute to wlsdml1114/diff-svc development by creating an account on GitHub.

github.com

위 깃허브 링크로 접속해서 리포지트리를 ZIP 파일로 다운로드해 줍니다. 바탕화면같이 접근하기 쉬운 곳에 압축해제 해 줍니다. 압축을 푼 폴더가 모든 소스파일을 넣고 수정할 폴더입니다.

 원본 깃허브에서 지시하는 모든 파일을 다운로드합니다.   아나콘다 3, CUDA의 경우 그냥 설치하면 됩니다. 그러나 ffmpeg의 경우 설치한 다음 시스템 환경변수를 설정해주어야 해서 살짝 까다롭습니다.

ffmpeg

ffmpeg설치화면에서, git-full.7z로 끝나는 파일을 다운로드해 줍니다. 그 후 편한 곳에다 압축해제하면 됩니다.

환경변수 설정

압축해제한 ffmpeg에서 bin 폴더를 선택한 다음 우클릭 > 경로로 복사를 클릭해 복사합니다.

시스템 환경 변수

시스템 환경 변수에 등록해 주기 위해 윈도우 검색창에 시스템 환경 변수를 검색합니다.

등록 1등록 2

그 후 시스템 속성 > 환경변수(N) > 시스템 변수를 스크롤하다 보면 path가 보입니다. 선택하고 편집(I)을 선택한 다음, 새로 만들기를 선택해 좀 전의 단계에서 복사해 둔 bin 폴더의 경로를 추가합니다. 확인을 누르고 종료합니다.

 

pre-trained-model 다운

사전학습 모델을 사용하는 이유는 조금 더 효율적인 학습이 가능해지기 때문인듯합니다. 

전용 GPU 메모리가 6Gb 미만이라면 Hubert만, 6Gb 이상이라면 Hifigan모델도 추가로 다운로드해 사용하시면 됩니다.

Hubert모델의 경우에는 전용 디스코드 서버에서 다운로드하실 수 있습니다. https://discord.gg/jvA5c2xzSE에 가입해서,

휴버트 모델 다운

pre-trained-models 카테고리의 맨 위로 스크롤하면 나오는 메가 링크를 다운로드해 주시면 됩니다.

체크포인트모델 완성

다운로드한 파일을 diff-svc main 폴더에 바로 압축해제하면 됩니다. 기본적으로는 Hubert모델만 있으며, Hifigan은 https://github.com/MLo7Ghinsan/MLo7_Diff-SVC_models/releases/download/diff-svc-necessary checkpoints/nsf_hifigan.zip 에서 다운로드 하실 수 있습니다. 다운로드 한 파일은 checkpoints에 동일하게 넣어주시면 됩니다. 이로써 모든 준비는 완벽합니다.

 

 


STEP.2 학습

이제 목소리를 학습시킬 차례입니다. 당연하게도, 목소리 파일이 필요하며 최소 1시간 분량이 필요합니다. 목소리 파일의 품질이 결과물의 값을 결정하기 때문에, 가능하면 잡음이 없고, 다양한 발음과 음정으로 준비하시는 것이 좋습니다.

이제, anaconda prompt를 관리자 권한으로 열어서 다음과 같은 기본 라이브러리들을 설치해 줍시다.

conda create -n diff-svc python=3.9
conda activate diff-svc
pip install -r requirements.txt
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

계속 진행할 거냐고 묻는다면 y 치고 엔터 또는 바로 엔터키를 누르면 계속 진행됩니다. 전부 설치되었다면 환경설정을 진행합니다.

 

set PYTHONPATH=.
set CUDA_VISIBLE_DEVICES=0

이 부분은 매번 새로 실행시킬 때마다 해줘야 하는 곳이다. 저 코드들을 실행시키기 전에는 항상 conda activate diff-svc가 선행돼야 한다는 걸 기억하자.

아나콘다 프롬프트

다 완료했다면 진행할 목소리 파일을 preprocess폴더를 만들어서 전부 mp4(mp3 아님) 또는 wav 파일로 넣어주면 됩니다.

굳이 잘라줄 필요는 없습니다. 프로그램이 알아서 잘라줘요. 단, 한글과 공백이 파일이름에 들어가 있다면 오류가 납니다.

간단 오류 tip

ValueError: The channel dimension of input Tensor must match `audio_channels` of HDemucs model. Found:1.
오류가 뜨면 음성 데이터가 단일채널이라 발생하는 오류임.
오다시티등의 프로그램으로 채널을 2개로 늘리면 해결됨

preporesess에 넣어두었다면, 다음의 코드를 실행해 진행합니다.

python sep_wav.py

완료된 후에는 preprocess_out 폴더에 이것저것 잘린 소스들을 확인할 수 있는데, 이것들을 data/raw/test 경로를 만들어서 전부 복사한다. 또는 training 폴더의 config.yaml 파일을 매모장으로 열어 커스텀할 수 있다.

 

모두 복사가 되었다면 바이너리화 한다.

6기가 미만
python preprocessing/binarize.py --config training/config.yaml

6기가 이상
python preprocessing/binarize.py --config training/config_nsf.yaml

쭉 진행되다가 완료하면 준비는 완료되었습니다.

 

6기가 미만
python run.py --config training/config.yaml --exp_name test --reset

6기가 이상
python run.py --config training/config_nsf.yaml --exp_name test --reset

을 입력해서 학습을 시작합니다. ctrl + c로 작업을 중단하고 python run.py --exp_name test로 가장 최근에 저장된 체크포인트에서 이어서 학습하실 수 있습니다. 보통 210000 스텝정도 학습시키면 쓸만하다고 알려져 있으나, total loss부분이 일정 수준으로 수렴하거나 줄어들지 않는다면 그만둬도 무방합니다.

 

STEP.3 출력

이제 음성을 원하는 노래 또는 음성에 추가할 수 있습니다. 바꾸려는 음성 파일을 raw폴더에 wav 형식으로 집어넣으면 됩니다. 다만, 주의할 점은 2명 이상의 목소리가 겹치게 된다면 인식하지 못하고 노이즈로 변해버립니다. 반드시 하나의 목소리만 나오는 파일을 사용하시는 게 좋습니다.

 

 

 

예시를 보면 알 수 있지만, 일반적으로 말하는 목소리만 녹음되어서 고음이 아예 없고, 중간에 목소리가 겹치는 경우 이상하게 진행되는 모습을 알 수 있습니다.