์ธ์ด: English ็ฎไฝไธญๆ ํ๊ตญ์ด
DDSP-SVC

0. ์๊ฐ
DDSP-SVC๋ ์๋ก์ด ์คํ ์์ค ๋ ธ๋ ์์ฑ ๋ณํ ํ๋ก์ ํธ์ด๋ฉฐ ๊ฐ์ธ ์ปดํจํฐ์์ ๋์คํํ ์ ์๋ ๋ฌด๋ฃ AI ์์ฑ ๋ณํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ ๋ ํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ณด๋ค ๋ ์ ๋ช ํ Diff-SVC์ SO-VITS-SVC๋ ๋น๊ตํด๋ณด์์๋, ํ๋ จ๊ณผ ํฉ์ฑ ๊ณผ์ ์์ ์กฐ๊ธ ๋ ๋ฎ์ ์ปดํจํฐ ์ฌ์์์๋ ๋์ํ๊ณ ํ๋ จ ์๊ฐ๋ ๋ช ๋ฐฐ ๋ ๋จ์ถ ํ ์ ์์ต๋๋ค. ๋ํ ์ค์๊ฐ์ผ๋ก ์์ฑ์ ๋ณ๊ฒฝ ํ ๋ SO-VITS-SVC์์ ์๊ตฌํ๋ ํ๋์จ์ด ์์๋ณด๋ค ์๊ตฌ ๊ธฐ์ค์ด ๋ฎ์ผ๋ฉฐ Diff-SVC์ ๊ฒฝ์ฐ ์ค์๊ฐ ์์ฑ ๋ณ๊ฒฝ์ด ๋๋ฌด ๋๋ฆฝ๋๋ค.
๋ณธ๋ DDSP ์ ํฉ์ฑ ํ์ง์ด ๊ทธ๋ฅ ์ด์์ ์ด์ง๋ ์์ง๋ง (ํ๋ จ ์ค์ TensorBoard์์ ๋ณธ๋์ ์ถ๋ ฅ์ ๋ค์ ์ ์์) ์ฌ์ ํ๋ จ๋ ๋ณด์ฝ๋ ๊ธฐ๋ฐ enhancer๋ฅผ ์ฌ์ฉํ์ฌ ๋ช๋ช ๋ฐ์ดํฐ์ ์ด SO-VITS-SVC์ ์์ง๊ณผ ๋น์ทํ ์์ค์ผ๋ก ๋๋ฌ ํ ์ ์์ต๋๋ค.
ํ์ต ๋ฐ์ดํฐ์ ํ์ง์ด ๋งค์ฐ ๋์ ๊ฒฝ์ฐ์๋ Diff-SVC์ ์์ง์ด ๊ฐ์ฅ ์ข์ ์ ์์ต๋๋ค. ๋ฐ๋ชจ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ samples
ํด๋์ ์กด์ฌํ๋ฉฐ ๊ด๋ จ๋ ์ฒดํฌํฌ์ธํธ ๋ชจ๋ธ๋ค์ Releases ํ์ด์ง์์ ๋ค์ด๋ก๋ ํ์ค ์ ์์ต๋๋ค.
๊ฒฝ๊ณ : DDSP-SVC๋ฅผ ํตํด ํ์ต์ํค๋ ๋ชจ๋ธ์ด ํฉ๋ฒ์ ์ผ๋ก ํ๊ฐ๋ ๋ฐ์ดํฐ๋ก ํ์ต๋๋๋ก ํด์ฃผ์๊ณ ๋ถ๋ฒ์ ์ธ ๋ฐฉ์์ผ๋ก ์์ฑ์ ํฉ์ฑํ์ฌ ์ฌ์ฉํ๋ ์ผ์ด ์๋๋ก ํด์ฃผ์ธ์. ๋ณธ ์ ์ฅ์์ ์์ ์๋ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ์ ์ค๋์ค ์ด์ฉํ ๊ถ๋ฆฌ ์นจํด, ์ฌ๊ธฐ ๋ฐ ๊ธฐํ ๋ถ๋ฒ ํ์์ ๋ํด ์ฑ ์์ ์ง์ง ์์ต๋๋ค.
1. ์์กด์ฑ ์ค์นํ๊ธฐ
์ฐ์ PyTorch๋ฅผ ๊ณต์ ์น์ฌ์ดํธ์ ์ค์นํ๋๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค. ์ดํ ๋ค์ ๋ช ๋ น์ ์คํํด์ฃผ์ธ์:
pip install -r requirements.txt
์๋ด : ์๋์ฐ ๊ธฐ์ค Python 3.8 + torch 1.9.1 + torchaudio 0.6.0 ๋ฒ์ ์์ ํ ์คํธ ๋์์ต๋๋ค. ๋๋ฌด ์ต์ ๋ฒ์ ์ด๊ฑฐ๋ ๊ตฌ ๋ฒ์ ์ ์์กด์ฑ์ผ ๊ฒฝ์ฐ ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
^ ์ ๋ฐ์ดํธ: ์๋์ฐ ๊ธฐ์ค Python 3.8 + cuda 11.8 + torch 2.0.0 + torchaudio 2.0.1 ์์ ๋์ํ๊ณ , ํ์ต ์๋๊ฐ ๋ ๋น ๋ฆ ๋๋ค!
2. ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ ์ค๋นํ๊ธฐ
์ ๋ฐ์ดํธ: ContentVec ์ธ์ฝ๋๊ฐ ์ด์ ์ง์๋ฉ๋๋ค. HubertSoft ์ธ์ฝ๋ ๋์ ContentVec ์ธ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ ํ๊ณ ์ค์ ํ์ผ์ ์์ ํ์ฌ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
- (์๊ตฌ๋จ) ์ฌ์ ํ๋ จ๋ HubertSoft ์ธ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ ํ๊ณ
pretrain/hubert
ํด๋์ ์ ์ฅํฉ๋๋ค.. - ์ฌ์ ํ๋ จ๋ ๋ณด์ฝ๋ ๊ธฐ๋ฐ enhancer๋ฅผ DiffSinger ์ปค๋ฎค๋ํฐ ๋ณด์ฝ๋ ํ๋ก์ ํธ์์ ๋ค์ด๋ก๋ํ์ฌ
pretrain/
ํด๋์ ์์ถ์ ํ์ด์ฃผ์ธ์.
3. ์ ์ฒ๋ฆฌ ์์
ํ์ต์ํฌ ๋ฐ์ดํฐ์
(.wav ํ์์ ์ค๋์ค ํด๋ฆฝ)์ data/train/audio
ํด๋์ ๋ฃ์ด์ฃผ์ธ์.
๊ฒ์ฆํ ๋ฐ์ดํฐ์
(.wav ํ์์ ์ค๋์ค ํด๋ฆฝ, ์ ๋ฐ์ดํฐ์
์์ ํ๋ฆฌํฐ๊ฐ ๊ด์ฐฎ์ ๋ฐ์ดํฐ๋ค)์ data/val/audio
ํด๋์ ๋ฃ์ด์ฃผ์ธ์.
๋ํ,
python draw.py
๋ฅผ ์คํ ํ์ฌ ๊ฒ์ฆ ๋ฐ์ดํฐ์
์ ์ ํํ ์ ์์ต๋๋ค. (draw.py
์ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ์ฌ ์์ถ ํด์ ํ ํ์ผ๋ค๊ณผ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ค์ ์์ ํ ์ ์์ต๋๋ค.)
Combtooth substractive synthesiser (๊ถ์ฅ๋จ)๋ฅผ ์ด์ฉํด ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค:
python preprocess.py -c configs/combsub.yaml
๋๋ Sinusoids additive synthesiser๋ฅผ ์ด์ฉํด ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค:
python preprocess.py -c configs/sins.yaml
์ ์ฒ๋ฆฌ ์ด์ ์ config/<๋ชจ๋ธ ์ด๋ฆ>.yaml
์ ์์นํ ์ค์ ํ์ผ์ ์์ ํ์ค ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ค์ ์ GTX-1660 ๊ทธ๋ํฝ ์นด๋๋ก 44.1khz ์ํ๋ง ์๋ synthesiser๋ฅผ ์ด์ฉํ๋๋ฐ ์ ํฉํ๊ฒ ๋์ด์์ต๋๋ค.
์๋ด 1: ๋ชจ๋ ์ค๋์ค ํด๋ฆฝ์ ์ํ๋ง ์๋๋ฅผ yaml ์ค์ ํ์ผ์์ ์ค์ ํ ์๋์ ๋์ผํ๊ฒ ์ ์งํด์ฃผ์ธ์! ๋์ผํ์ง ์์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ๋์ํ๋ ์ํ๋ง ์๋๋ฅผ ๋ณํํ๋ ๊ณผ์ ์์ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
์๋ด 2: ํ์ต ๋ฐ์ดํฐ์ ์ ์ค๋์ค ํด๋ฆฝ ๊ฐฏ์๋ (๋ถํ ํ๋ค๋ ๊ธฐ์ค์ผ๋ก) 1000๊ฐ ์ ๋๊ฐ ๊ถ์ฅ๋ฉ๋๋ค. ๊ธด ์ค๋์ค ํ์ผ์ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ์ผ๋ก ๋ถํ ํ์ฌ ๋ฃ๋๋ค๋ฉด ํ์ต ์๋๋ ํฅ์๋๋ ๋ชจ๋ ์ค๋์ค ํ์ผ์ ๊ธธ์ด๊ฐ 2์ด ์ดํ์ด๋ฉด ์๋ฉ๋๋ค. ์ค๋์ค ํ์ผ์ด ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ๋ง์์ผ ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ๋ถ์กฑํ ๊ฒฝ์ฐ 'cache_all_data'๋ฅผ false๋ก ๋ฐ๊ฟ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณผ ์ ์์ต๋๋ค.
์๋ด 3: ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ ์ค๋์ค ํด๋ฆฝ ๊ฐฏ์๋ 10๊ฐ ์ ๋๊ฐ ๊ถ์ฅ๋ฉ๋๋ค. ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ด ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ ๊ฒ์ฆ ๊ณผ์ ์์ ์๋๊ฐ ๋๋ ค์ง๋ ์กฐ์ ํด์ ๋ฃ์ด์ฃผ์ธ์.
์๋ด 4: ๋ฐ์ดํฐ์ ์ด ๋์ ํ์ง์ด ์๋ ๊ฒฝ์ฐ ์ค์ ํ์ผ์์ 'f0_extractor'๋ฅผ 'crepe'๋ก ์ค์ ํด์ฃผ์ธ์. Crepe ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ต์ ์ ํนํ๋์ด ์์ผ๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ง์ ์๊ฐ์ ํ์๋ก ํฉ๋๋ค.
์ ๋ฐ์ดํธ: ๋ค์ค Speaker ํ์ต์ ์ด์ ์ง์ํฉ๋๋ค. ์ค์ ํ์ผ์ 'n_spk' ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ค Speaker ๋ชจ๋ธ์ธ์ง๋ฅผ ์ ์ดํฉ๋๋ค. ๋ค์ค Speaker ๋ชจ๋ธ๋ก ํ์ตํ๊ณ ์ถ์์ ๊ฒฝ์ฐ ์์ฑ ํด๋ ์ด๋ฆ์ด ์์์ฌ์ผ ํ๋ฉฐ Speaker์ ID๋ฅผ ๋ํํ๋ 'n_spk'์ ์๋ณด๋ค ํฌ๋ฉด ์๋ฉ๋๋ค. ํด๋ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค:
# ํ์ต ๋ฐ์ดํฐ์
# ์ฒซ๋ฒ์งธ Speaker
data/train/audio/1/aaa.wav
data/train/audio/1/bbb.wav
...
# ๋๋ฒ์งธ Speaker
data/train/audio/2/ccc.wav
data/train/audio/2/ddd.wav
...
# ๊ฒ์ฆ ๋ฐ์ดํฐ์
# ์ฒซ๋ฒ์งธ Speaker
data/val/audio/1/eee.wav
data/val/audio/1/fff.wav
...
# ๋๋ฒ์งธ Speaker
data/val/audio/2/ggg.wav
data/val/audio/2/hhh.wav
...
'n_spk' = 1์ธ ๊ฒฝ์ฐ 1์ธ Speaker ๋ชจ๋ธ์ ๋ํ ํด๋ ๊ตฌ์กฐ๋ ์ง์ํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# ํ์ต ๋ฐ์ดํฐ์
data/train/audio/aaa.wav
data/train/audio/bbb.wav
...
# ๊ฒ์ฆ ๋ฐ์ดํฐ์
data/val/audio/ccc.wav
data/val/audio/ddd.wav
...
4. ํ์ต์ํค๊ธฐ
# combsub ๋ชจ๋ธ์ ํ์ต์ํจ๋ค๋ ์
python train.py -c configs/combsub.yaml
๋ค๋ฅธ ๋ชจ๋ธ๋ค์ ํ์ตํ ๋์๋ ๋ช ๋ น์ ๋น์ทํฉ๋๋ค.
์ค๋์ ํ์ต์ ์ผ์ ์ค๋จ ํ์ ๋ ์์ ํ๋ฉฐ ๋์ผํ ๋ช ๋ น์ ์ ๋ ฅํด ๋ค์ ํ์ต์ ์ด์ด๊ฐ์ค ์ ์์ต๋๋ค.
ํ์ต ์งํ ๋์ค ์ผ์ ์ค๋จํ์ฌ ์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ์ต ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ๋ค (batchsize, lr ๋ฑ) ๋์ผํ ๋ช ๋ น์ ์ ๋ ฅํด ๋ชจ๋ธ์ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ์ค ์ ์์ต๋๋ค.
5. ์๊ฐํ
# TensorBoard๋ฅผ ์ด์ฉํด ํ์ต ์ํ ํ์ธํ๊ธฐ
tensorboard --logdir=exp
ํ ์คํธ ์์ฑ ์ํ๋ค์ ์ฒซ ๊ฒ์ฆ ์ดํ TensorBoard์ ํ์๋ฉ๋๋ค.
์๋ด: TensorBoard์ ํ์๋๋ ํ ์คํธ ์์ฑ ์ํ๋ค์ DDSP-SVC ๋ชจ๋ธ์ ํตํ ์ถ๋ ฅ๋ฌผ์ด๋ฉฐ Enhancer๋ฅผ ํตํด ํฅ์๋ ์์ฑ์ด ์๋๋๋ค. Enhancer๋ฅผ ์ฌ์ฉํ๊ณ ํฉ์ฑ ๊ฒฐ๊ณผ๋ฌผ์ ํ ์คํธ ํ๊ณ ์ถ์ผ์ ๊ฒฝ์ฐ ์๋ ๋ด์ฉ์ ์ค๋ช ๋ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํด์ฃผ์ธ์.
6. ๋น์ค์๊ฐ ์์ฑ ๋ณํ์ ํ ๊ฒฝ์ฐ
(์ถ์ฒ๋จ) ์ฌ์ ํ์ต๋ ๋ณด์ฝ๋ ๊ธฐ๋ฐ Enhancer๋ฅผ ์ด์ฉํด ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํฅ์์ํค๊ธฐ:
# enhancer_message_key = 0(๊ธฐ๋ณธ๊ฐ)์ธ ๊ฒฝ์ฐ ์ผ๋ฐ ์์ฑ ๋ฒ์์์ ๋์ ์ค๋์ค ํ์ง์ ์ฌ์ฉํฉ๋๋ค.
# enhancer_adaptive_key ์ 0 ์ด์์ผ๋ก ์ค์ ํ์ฌ Enhancer๋ฅผ ๋ ๋์ ์์ญ์ผ๋ก ์ ์ฉ์ํต๋๋ค.
python main.py -i <์
๋ ฅ.wav> -m <๋ชจ๋ธํ์ผ.pt> -o <์ถ๋ ฅ.wav> -k <ํค ๋ณ๊ฒฝ (๋ฐ์)> -id <speaker ์์ด๋> -eak <enhancer_adaptive_key (๋ฐ์)>
DDSP์ ๋ (Raw) ์ถ๋ ฅ๋ฌผ:
# ๋น ๋ฅด์ง๋ง ์๋์ ์ผ๋ก ๋ฎ์ ํ์ง (TensorBoard์์ ๋ค์ผ์๋๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.)
python main.py -i <์
๋ ฅ.wav> -m <๋ชจ๋ธํ์ผ.pt> -o <์ถ๋ ฅ.wav> -k <ํค ๋ณ๊ฒฝ (๋ฐ์)> -id <speaker ์์ด๋> -e false
f0 ์ถ์ถ๊ณผ ์๋ต ์๊ณ๊ฐ์ ๋ํ ๊ธฐํ ์ต์ ์ ๋์๋ง์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
python main.py -h
(์ ๋ฐ์ดํธ) ๋ค์ค Speaker๊ฐ ์ด์ ์ง์๋ฉ๋๋ค. "-mix" ์ต์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๋ถ๋ค์ ์์์ ๋์์ธํ์ค ์ ์์ผ๋ฉฐ ์๋๋ ์์์ ๋๋ค:
# ์ฒซ๋ฒ์งธ Speaker์ ๋๋ฒ์งธ Speaker์ ์์์ 0.5, 0.5 ๋น์จ๋ก ํผํฉํฉ๋๋ค
python main.py -i <์
๋ ฅ.wav> -m <๋ชจ๋ธํ์ผ.pt> -o <์ถ๋ ฅ.wav> -k <ํค ๋ณ๊ฒฝ (๋ฐ์)> -mix "{1:0.5, 2:0.5}" -eak 0
7. ์ค์๊ฐ ์์ฑ ๋ณํ์ ํ ๊ฒฝ์ฐ
๋ค์ ๋ช ๋ น์ ์ด์ฉํด ๊ฐ๋จํ GUI๋ฅผ ์คํํฉ๋๋ค:
python gui.py
ํ๋ก ํธ์๋์์๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ, ํฌ๋ก์ค ํ์ด๋ฉ, SOLA ๊ธฐ๋ฐ ์คํ๋ผ์ด์ฑ ๋ฐ contextual semantic ์ฐธ์กฐ์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์งง์ ๋๊ธฐ ์๊ฐ๊ณผ ๋ฆฌ์์ค ์ ์ ๋ก ๋น์ค์๊ฐ ํฉ์ฑ์ ๊ฐ๊น์ด ์์ง์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ ๋ฐ์ดํธ: Phase ๋ณด์ฝ๋ ๊ธฐ๋ฐ์ ์คํ๋ผ์ด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ์ถ๊ฐ๋์์ผ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ SOLA ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฏธ ์คํ๋ผ์ด์ฑ ์์ง์ด ์ถฉ๋ถํ ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ ๋์ด์์ต๋๋ค. ๊ทน๋์ ์ ์ง์ฐ ์ค์๊ฐ ์์ง์ ์ถ๊ตฌํ์ ๋ค๋ฉด ํ์ฑํ ํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์คํ๊ฒ ์กฐ์ ํด๋ณผ ์ ์์ผ๋ฉฐ ์์ง์ด ๋ ๋์์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ ํ ์คํธ์์ ํฌ๋ก์ค ํ์ด๋ ์๊ฐ์ด 0.1์ด๋ณด๋ค ๊ธธ๋ฉด Phase ๋ณด์ฝ๋๊ฐ ์์ง์ ํฌ๊ฒ ์ ํ์ํค๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค.