Korean FastSpeech 2 - Pytorch Implementation
Introduction
Fastspeech2๋ ๊ธฐ์กด์ ์๊ธฐํ๊ท(Autoregressive) ๊ธฐ๋ฐ์ ๋๋ฆฐ ํ์ต ๋ฐ ํฉ์ฑ ์๋๋ฅผ ๊ฐ์ ํ ๋ชจ๋ธ์ ๋๋ค. ๋น์๊ธฐํ๊ท(Non Autoregressive) ๊ธฐ๋ฐ์ ๋ชจ๋ธ๋ก, Variance Adaptor์์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ค์ ํตํด, speech ์์ธก์ ์ ํ๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ์ฆ ๊ธฐ์กด์ audio-text๋ง์ผ๋ก ์์ธก์ ํ๋ ๋ชจ๋ธ์์, pitch,energy,duration์ ์ถ๊ฐํ ๋ชจ๋ธ์ ๋๋ค. Fastspeech2์์ duration์ MFA(Montreal Forced Aligner)๋ฅผ ํตํด ์ถ์ถํฉ๋๋ค. ์ด๋ ๊ฒ ์ถ์ถํ duration์ ๋ฐํ์ผ๋ก phoneme(์์)์ ์์ฑ๊ฐ์ alignment๊ฐ ๋ง๋ค์ด์ง๋๋ค.
- This Repository๋ https://github.com/HGU-DLLAB/Korean-FastSpeech2-Pytorch
Install Dependencies
python=3.9, pytorch=1.13, ffmpeg g2pk
sudo apt update
sudo apt install ffmpeg
pip install g2pk
pip install -r requirements.txt
Preprocessing
Step 1
MFA(Montreal Forced Aligner)๋ Fastspeech2 ํ์ต์ ๋ฐ๋์ ํ์ํ, Duration์ ์ถ์ถํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. MFA๋ ๋ฐํ(์์ฑ ํ์ผ)์ Phoneme sequence๊ฐ์ alignment๋ฅผ ์คํํ๊ณ ์ด๋ฅผ TextGrid๋ผ๋ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
- wav-lab pair ์์ฑ
wavํ์ผ๊ณผ ๊ทธ wavํ์ผ์ ๋ฐํ๋ฅผ transcriptํ labํ์ผ์ด ํ์ํฉ๋๋ค.
ํด๋น ํจ์๋ metadata๋ก ๋ถํฐ wavํ์ผ๊ณผ text๋ฅผ ์ธ์ํ์ฌ, wavํ์ผ๊ณผ ํ์ฅ์๋ง ๋ค๋ฅธ transcriptํ์ผ(.lab) ์ ์์ฑํฉ๋๋ค.
์์ ์ด ๋๋๋ฉด ์์ ํํ์ ๊ฐ์ด wav-lab pair๊ฐ ๋ง๋ค์ด์ ธ์ผ ํฉ๋๋ค.
- lexicon ํ์ผ ์์ฑ
๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ด์ ๋ชจ๋ ๋ฐํ์ ๋ํ, phoneme์ ๊ธฐ๋กํ lexicon ํ์ผ์ ์์ฑํฉ๋๋ค.
processing_utils.ipynb ๋ ธํธ๋ถ ๋ด์ make_p_dict ์ make_lexicon ํจ์๋ฅผ ์ฐจ๋ก๋๋ก ์คํํด์ฃผ์ธ์.
์์ ์ด ๋๋๋ฉด ์์ ๊ฐ์ ํํ๋ฅผ ๋๋ p_lexicon.txt ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค.
- MFA ์ค์น
- MFA์ ๋ํ ์์ธํ ์ค์น ๋ฐฉ๋ฒ์ https://montreal-forced-aligner.readthedocs.io/en/latest/installation.html ์ด๊ณณ์ ํ์ธํด์ฃผ์ธ์.
- MFA ์คํ
MFA์ ๊ฒฝ์ฐ pre-trained๋ ํ๊ตญ์ด acoustic model๊ณผ g2p ๋ชจ๋ธ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ํด๋น ๋ชจ๋ธ์ english phoneme์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํ๊ตญ์ด phoneme์ ์์ฑํ๊ธฐ ์ํด์๋ ์ง์ train์ ์์ผ์ฃผ์ด์ผ ํฉ๋๋ค.
MFA ์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ์๋์ ๊ฐ์ ์ปค๋ฉ๋๋ฅผ ์คํํด์ฃผ์ธ์.
mfa train <๋ฐ์ดํฐ์
์์น> <p_lexicon์ ์์น> <out directory>
MFA๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํํ์ TextGrid ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค.
(3) ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ
1.hparms.py
- dataset : ๋ฐ์ดํฐ์ ํด๋๋ช
- data_path : dataset์ ์์ ํด๋
- meta_name : metadata์ ํ์ผ๋ช ex)transcript.v.1.4.txt
- textgrid_path : textgrid ์์ถ ํ์ผ์ ์์น (textgrid ํ์ผ๋ค์ ๋ฏธ๋ฆฌ ์์ถํด์ฃผ์ธ์)
- tetxgrid_name : textgird ์ํน ํ์ผ์ ํ์ผ๋ช
- preprocess.py
ํด๋น ๋ถ๋ถ์ ๋ณธ์ธ์ ๋ฐ์ดํฐ์ ์ด๋ฆ์ ๋ง๊ฒ ๋ณ๊ฒฝํด์ฃผ์ธ์
- data/kss.py
- line 19 : basename,text = parts[?],parts[?] #๊ฐ๊ฐ ํ ์คํธ์ ์์น ("|")๋ก splitํ์๋, metadata์ ๊ธฐ๋ก๋ wav์ text์ ์์น
- line 37 : basename,text = parts[?],parts[?]
์์ ๋ณ๊ฒฝ ์์ ์ด ๋ชจ๋ ์๋ฃ๋๋ฉด ์๋์ ์ปค๋ฉ๋๋ฅผ ์คํํด์ฃผ์ธ์.
python preprocess.py
Train
๋ชจ๋ธ ํ์ต ์ ์, kss dataset์ ๋ํด ์ฌ์ ํ์ต๋ VocGAN(neural vocoder)์ ๋ค์ด๋ก๋ ํ์ฌ vocoder/pretrained_models/
๊ฒฝ๋ก์ ์์น์ํต๋๋ค.
๋ค์์ผ๋ก, ์๋์ ์ปค๋งจ๋๋ฅผ ์ ๋ ฅํ์ฌ ๋ชจ๋ธ ํ์ต์ ์ํํฉ๋๋ค.
python train.py
ํ์ต๋ ๋ชจ๋ธ์ ckpt/
์ ์ ์ฅ๋๊ณ tensorboard log๋ log/
์ ์ ์ฅ๋ฉ๋๋ค. ํ์ต์ evaluate ๊ณผ์ ์์ ์์ฑ๋ ์์ฑ์ eval/
ํด๋์ ์ ์ฅ๋ฉ๋๋ค.
Synthesis
ํ์ต๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ์ ์์ฑํ๋ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
python synthesis.py --step 500000
ํฉ์ฑ๋ ์์ฑ์ results/
directory์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
Pretrained model
pretrained model(checkpoint)์ ๋ค์ด๋ก๋ํด ์ฃผ์ธ์.
๊ทธ ํ, hparams.py
์ ์๋ checkpoint_path
๋ณ์์ ๊ธฐ๋ก๋ ๊ฒฝ๋ก์ ์์น์์ผ์ฃผ์๋ฉด ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
Fine-Tuning
Pretrained model์ ํ์ฉํ์ฌ Fine-tuning์ ํ ๊ฒฝ์ฐ, ์ต์ 30๋ถ ์ด์์ ๋ฐ์ดํฐ๊ฐ ๊ถ์ฅ๋ฉ๋๋ค. 10๋ถ ์ ๋ ๋ถ๋์ ๋ฐ์ดํฐ๋ก ์คํ์ ๋ชฉ์๋ฆฌ์ ๋ฐ์์ ๋์ฒด์ ์ผ๋ก ๋น์ทํ๊ฒ ๋ฐ๋ผํ๋ ๋ ธ์ด์ฆ๊ฐ ์ฌํ์ต๋๋ค.
Fine-tuning ์, Learning Rate์ ์กฐ์ ์ด ํ์ํฉ๋๋ค. Learning Rate๋ ์ ๋นํ ๋ฎ์ ๊ฐ์ด ํ์ํ๋ฉฐ, ์ด๋ ๊ฒฝํ์ ์ผ๋ก ์์๋ด์ ์ผ ํฉ๋๋ค. (์ ๋ ์ต์ข step์์์ Learning Rate๋ฅผ ์ฌ์ฉํ์ต๋๋ค.)
python train.py --restore_step 350000
Tensorboard
tensorboard --logdir log/hp.dataset/
tensorboard log๋ค์ log/hp.dataset/
directory์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ ์ปค๋ฉ๋๋ฅผ ์ด์ฉํ์ฌ tensorboard๋ฅผ ์คํํด ํ์ต ์ํฉ์ ๋ชจ๋ํฐ๋ง ํ์ค ์ ์์ต๋๋ค.