내 목소리를 TTS로 만들기(FastSpeech2)

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

내 목소리를 TTS로 만들기

이 문서는 자신의 목소리를 TTS(Text-To-Speech)로 만드는 방법을 설명합니다. 단, 리눅스, WSL, Git, Python, Node.js에 능숙하다는 가정하에 작성되었습니다.

목차

  1. 내 목소리를 TTS로 만드는 과정
  2. 권장 사양
  3. 필수 설치
    1. WSL2 설치
    2. miniconda 설치
    3. Node.js 설치
    4. Git 설치
  4. 필수 데이터
    1. KSS Dataset 다운로드
  5. 환경 설정
    1. miniconda 환경 생성
  6. KSS Dataset TTS 학습하기
    1. MFARunner로 TextGrid 생성하기
    2. Korean-FastSpeech2-Pytorch로 학습하기
      1. 데이터 전처리하기
      2. 음성합성 학습하기
      3. 음성합성 테스트해보기
  7. KSS Dataset Vocoder 학습하기
    1. 학습 데이터와 검증 데이터 준비하기
    2. VocGAN으로 학습하기
      1. 데이터 전처리하기
      2. Vocoder 학습하기
  8. KSS Dataset TTS 파인튜닝하기
    1. Korean-FastSpeech2-Pytorch로 파인튜닝하기
    2. 음성합성 테스트해보기
  9. 내 목소리 TTS 학습하기
    1. mimic-recording-studio로 내 목소리 녹음하기
    2. 음성 데이터를 학습할 형태로 정리하기
    3. MFARunner로 TextGrid 생성하기
    4. Korean-FastSpeech2-Pytorch로 학습하기
      1. 데이터 전처리하기
      2. 음성합성 학습하기
      3. 음성합성 테스트해보기
  10. 내 목소리 Vocoder 학습하기
    1. 학습 데이터와 검증 데이터 준비하기
    2. VocGAN으로 학습하기
      1. 데이터 전처리하기
      2. Vocoder 학습하기
  11. 내 목소리 TTS 파인튜닝하기
    1. Korean-FastSpeech2-Pytorch로 파인튜닝하기
    2. 음성합성 테스트해보기

내 목소리를 TTS로 만드는 과정

  1. mimic-recording-studio로 내 목소리를 녹음하여 wav 파일로 저장합니다(권장 8시간 이상).
  2. MFARunner를 이용하여 wav 파일에서 TextGrid를 추출합니다.
  3. Korean-FastSpeech2-Pytorch로 wav 파일을 전처리(preprocess)합니다.
  4. Korean-FastSpeech2-Pytorch로 wav 파일, TextGrid를 학습(train)하여 모델 체크포인트 파일을 생성합니다.
  5. VocGAN로 wav 파일을 학습하여 모델 체크포인트 파일을 생성합니다.
  6. Korean-FastSpeech2-Pytorch로 학습된 모델 체크포인트 파일에 VocGAN 체크 포인트 파일을 더해 다시 학습합니다(파인 튜닝).
  7. Korean-FastSpeech2-Pytorch로 텍스트를 wav 파일로 음성합성합니다. 끝.

하지만, 내 목소리를 TTS로 만드는 과정에서 자신의 목소리를 녹음하는 부분이 많은 부담이 됩니다. 따라서, 다음과 같이 KSS Dataset(한국어 성우 예제 데이터)을 사용하여 TTS 학습(train) 및 음성합성을 해보고 품질을 확인한 뒤, 자신의 목소리를 녹음할지 결정하기 바랍니다.

  1. KSS Dataset을 다운로드합니다(약 12시간 분량).
  2. MFARunner를 이용하여 wav 파일에서 TextGrid를 추출합니다.
  3. Korean-FastSpeech2-Pytorch로 wav 파일을 전처리(preprocess)합니다.
  4. Korean-FastSpeech2-Pytorch로 wav 파일, TextGrid를 학습(train)하여 모델 체크포인트 파일을 생성합니다.
  5. VocGAN로 wav 파일을 학습하여 모델 체크포인트 파일을 생성합니다.
  6. Korean-FastSpeech2-Pytorch로 학습된 모델 체크포인트 파일에 VocGAN 체크 포인트 파일을 더해 다시 학습합니다(파인 튜닝).
  7. Korean-FastSpeech2-Pytorch로 텍스트를 wav 파일로 음성합성합니다. 끝.

주의사항

이 TTS의 결과물은 완벽/완전하지 않습니다. 따라서 품질을 보증하지 않습니다.

권장 사양

윈도우 로컬머신 또는 클라우드

  • 윈도우 10, 11
  • WSL2(Ubuntu)
  • NVIDIA GeForce RTX 20, 30, 40 시리즈 또는 NVIDIA Tesla V100, A100 그래픽 카드

리눅스(Ubuntu) 로컬머신 또는 클라우드

  • 아래 그래픽 카드가 장착된 컴퓨터 또는 인스턴스
  • NVIDIA GeForce RTX 20, 30, 40 시리즈 또는 NVIDIA Tesla V100, A100 그래픽 카드

운영체제는 리눅스(Ubuntu)를 사용해야 하며, 그래픽 카드는 CUDA 11.6 이상을 지원해야 합니다.

필수 설치

WSL2 설치

WSL2 설치 방법은 생략하겠습니다.

아래 문서를 참고하여 WSL2에 NVIDIA GPU를 사용할 수 있도록 설정합니다.

miniconda 설치

윈도우 로컬 및 WSL2 안에 miniconda를 설치합니다. 설치 방법은 생략하겠습니다.

Node.js 설치

윈도우에는 Node.js 16 LTS를 설치합니다. 설치 방법은 생략하겠습니다.

또는, NVM for Windows로 Node.js 16 LTS를 설치해도 됩니다.

Git 설치

윈도우 로컬 및 WSL2 안에 git을 설치합니다. 설치 방법은 생략하겠습니다.

필수 데이터

KSS Dataset 다운로드

다음 웹 사이트에서 KSS Dataset을 다운로드합니다. 이때, kaggle 가입이 필요하므로 먼저 가입을 하도록 합니다.

Download 버튼을 클릭하면 3GB 분량의 archive.zip 파일이 다운로드 됩니다. 이 파일을 C:\data\kss 폴더에 넣고 압축을 해제합니다(윈도우 7-Zip 기준 "여기에 압축 풀기").

압축을 해제하면 C:\data\kss\kss, C:\data\kss\transcript.v.1.4.txt와 같은 모양이 되어야 합니다.

환경 설정

miniconda 환경 생성

WSL2 안에서 다음 명령을 실행하여 mfatts 환경을 생성합니다.

리눅스
$ conda create --name mfa python=3.8
$ conda create --name tts python=3.8

KSS Dataset TTS 학습하기

MFARunner로 TextGrid 생성하기

WSL2 안에서 MFARunner를 클론합니다.

리눅스
$ cd ~/
$ git clone https://github.com/pyrasis/MFARunner

mfa 환경을 활성화하고 관련 패키지를 설치합니다.

리눅스
$ conda activate mfa
$ conda config --add channels conda-forge
$ conda install montreal-forced-aligner==2.0.6
$ cd MFARunner
$ pip install -r requirements.txt
$ sudo apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl
$ pip install konlpy==0.6.0 ffmpeg==1.4
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

config.py 파일을 다음과 같이 수정합니다. 즉, dataset_path를 KSS Dataset 압축을 해제한 폴더로 지정합니다.

config.py
class Arguments:

        #dataset_path = "/home/minsu/hdd1/dataset/speech/korean/emotiontts_open_db"
        #dataset_path = "/home/minsu/hdd1/dataset/speech/korean/korean_emotional_speech"
        dataset_path = "/mnt/c/data/kss"

        preprocessed_file_dir = "./preprocessed"

        result_dir = "./result"
        phone_set = None                # if use pretrained model, set phone_set to 'english_us_arpa' or etcs..

        num_jobs=8

main.py를 실행하여 TextGrid를 생성합니다.

리눅스
$ python main.py

TextGrid 생성이 끝났으면 다음 명령을 실행하여 TextGrid를 zip 파일로 압축합니다.

리눅스
$ cd result/kss
$ zip -r TextGrid.zip ./TextGrid

이렇게 하면 MFARunner/result/kss 디렉터리 안에 TextGrid.zip 파일이 생성됩니다.

Korean-FastSpeech2-Pytorch로 학습하기

WSL2 안에서 Korean-FastSpeech2-Pytorch를 클론합니다.

리눅스
$ cd ~/
$ git clone https://github.com/pyrasis/Korean-FastSpeech2-Pytorch

tts 환경을 활성화하고 관련 패키지를 설치합니다.

리눅스
$ conda activate tts
$ conda install pytorch==1.13.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia
$ conda install numpy==1.23.5 scipy==1.10.0 librosa==0.8.0 matplotlib==3.6.3 tensorboard==2.11.2
$ pip install tgt==1.4.4 pyworld==0.2.10 jamo==0.4.1 g2pk==0.9.4
$ sudo apt install ffmpeg

hparams.py 파일을 다음과 같이 수정합니다. 즉, dataset_path를 KSS Dataset 압축을 해제한 경로로 지정합니다.

hparams.py
import os
### kss ###
dataset = "kss"
data_path = os.path.join("/mnt/c/data/kss", dataset)
meta_name = "transcript.v.1.4.txt"      # "transcript.v.1.4.txt" or "transcript.v.1.3.txt"
textgrid_name = "TextGrid.zip"

... 생략 ...

# Vocoder
vocoder = None
vocoder_pretrained_model_name = "vocgan_kss_pretrained_model_epoch_4500.pt"
vocoder_pretrained_model_path = os.path.join("./vocoder/pretrained_models/", vocoder_pretrained_model_name)

... 생략 ...

데이터 전처리하기

다음 명령을 실행하여 MFARunner에서 생성한 TextGrid.zip 파일을 복사합니다.

리눅스
$ cp ../MFARunner/result/kss/TextGrid.zip .

이제 preprocess.py를 실행합니다.

리눅스
$ export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
$ python preprocess.py

실행이 끝나면 C:\data\kss\kss\wavs 폴더가 생성되며 전처리된 wav 파일이 저장됩니다. 기존 wav 파일들은 C:\data\kss\kss\wavs_bak 아래에 보관됩니다.

음성합성 학습하기

train.py를 실행하여 음성합성 학습을 시작합니다.

리눅스
$ python train.py

10000 스텝마다 ckpt/kss 아래에 체크포인트 파일이 저장됩니다. 350000 스텝까지 학습합니다.

Ctrl+C를 입력하면 학습을 중단할 수 있습니다.

학습이 중단된 뒤 다시 이어서 학습하려면 --restore_step 옵션을 사용하면 됩니다.

리눅스
$ python train.py --restore_step 100000

음성합성 테스트해보기

synthesize.py --step <스텝> 형식으로 음성합성을 해볼 수 있습니다. 다음과 같이 실행한 뒤 4를 입력하고 안녕하세요. 반갑습니다.를 입력합니다.

리눅스
$ python synthesize.py --step 350000
which sentence do you want?
1.eval_sentence 2.train_sentence 3.test_sentence 4.create new sentence
4
you went for mode 4
input sentence
안녕하세요. 반갑습니다.

이렇게하면 results 디렉터리에 wav와 png 파일이 생성됩니다.

윈도우에서 접근하려면 탐색기에서 \\wsl$로 이동합니다. 그리고 Ubuntu 폴더 안에서 home\<사용자>\Korean-FastSpeech2-Pytorch\results로 이동합니다. wav 파일을 더블클릭하면 합성된 음성을 들을 수 있습니다.

아직 음성에 잡음이 섞여서 들립니다. 이것을 VocGAN으로 학습한 것과 합쳐서 다시 학습(파인튜닝)한 뒤 음성합성을 해야 깨끗한 음성을 들을 수 있습니다.

KSS Dataset Vocoder 학습하기

이번에는 파인튜닝에 사용되는 Vocoder를 학습해보겠습니다.

학습 데이터와 검증 데이터 준비하기

다음 명령을 실행하여 Korean-FastSpeech2-Pytorch에서 preprocess.py로 전처리했던 wav 파일을 학습 데이터(train)과 검증 데이터(val)로 분리 복사하겠습니다.

리눅스
$ cd /mnt/c/data/kss/kss
$ mkdir -p vocgan/train vocgan/val
$ cp wavs/1_*.wav vocgan/val/
$ cp wavs/2_*.wav vocgan/train/
$ cp wavs/3_*.wav vocgan/train/
$ cp wavs/4_*.wav vocgan/train/

VocGAN으로 학습하기

WSL2 안에서 VocGAN를 클론합니다.

리눅스
$ cd ~/
$ git clone https://github.com/pyrasis/VocGAN

tts 환경을 활성화하고 관련 패키지를 설치합니다.

리눅스
$ conda activate tts
$ conda install tqdm pyyaml tensorboardX

config/default.yaml 파일을 다음과 같이 수정합니다. 즉, trainvalidation을 앞에서 만든 디렉터리로 지정합니다. 그리고 mel_pathvocgan 디렉터리가 있는 위치에 mels 디렉터리를 지정합니다.

config/default.yaml
data: # root path of train/validation data (either relative/absoulte path is ok)
  train: '/mnt/c/data/kss/kss/vocgan/train'
  validation: '/mnt/c/data/kss/kss/vocgan/val'
  mel_path: '/mnt/c/data/kss/kss/mels'
  eval_path: ''

... 생략 ...

데이터 전처리하기

다음과 같이 preprocess.py를 실행합니다.

리눅스
$ export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
$ python preprocess.py -c config/default.yaml -d /mnt/c/data/kss/kss/vocgan

실행이 끝나면 C:\data\kss\kss\mels 폴더가 생성되며 전처리된 .npy 파일이 저장됩니다.

Vocoder 학습하기

trainer.py를 실행하여 Vocoder 학습을 시작합니다.

리눅스
$ python trainer.py -c config/default.yaml -n kss

20 epoch 마다 chkpt/kss 아래에 체크포인트 파일이 저장됩니다. 4500 epoch까지 학습합니다.

Ctrl+C를 입력하면 학습을 중단할 수 있습니다.

학습이 중단된 뒤 다시 이어서 학습하려면 -p 옵션을 사용하면 됩니다.

리눅스
$ python trainer.py -c config/default.yaml -n kss -p chkpt/kss/kss_2dfbde2_2000.pt

KSS Dataset TTS 파인튜닝하기

Korean-FastSpeech2-Pytorch로 파인튜닝하기

이제 Korean-FastSpeech2-Pytorch로 학습한 체크포인트와 VocGAN으로 학습한 체크포인트를 합쳐서 다시 학습하는 파인튜닝을 해보겠습니다.

먼저 VocGAN으로 학습한 체크포인트 파일을 Korean-FastSpeech2-Pytorch 안으로 복사합니다.

리눅스
$ cd ~/
$ cd Korean-FastSpeech2-Pytorch
$ mkdir vocoder/pretrained_models
$ cp ../VocGAN/chkpt/kss/kss_2dfbde2_4500.pt vocoder/pretrained_models/

hparams.py 파일을 다음과 같이 수정합니다.

hparams.py
... 생략 ...

# Vocoder
vocoder = 'vocgan'
vocoder_pretrained_model_name = "kss_2dfbde2_4500.pt"
vocoder_pretrained_model_path = os.path.join("./vocoder/pretrained_models/", vocoder_pretrained_model_name)

... 생략 ...

앞에서 350000 스텝까지 학습한 체크포인트에 이어서 파인튜닝을 합니다.

리눅스
$ python train.py --restore_step 350000

이렇게 700000 스텝까지 학습합니다.

음성합성 테스트해보기

다시 synthesize.py --step <스텝> 형식으로 음성합성을 해봅니다. 다음과 같이 실행한 뒤 4를 입력하고 **안녕하세요. 반갑습니다.**를 입력합니다.

리눅스
$ python synthesize.py --step 700000
which sentence do you want?
1.eval_sentence 2.train_sentence 3.test_sentence 4.create new sentence
4
you went for mode 4
input sentence
안녕하세요. 반갑습니다.

이렇게하면 results 디렉터리에 wav와 png 파일이 생성됩니다.

윈도우에서 접근하려면 탐색기에서 \\wsl$로 이동합니다. 그리고 Ubuntu 폴더 안에서 home\<사용자>\Korean-FastSpeech2-Pytorch\results로 이동합니다. wav 파일을 더블클릭하면 합성된 음성을 들을 수 있습니다.

파일명에 griffin_lim이라고 붙은 것은 기존 방식대로 합성한 것이고, vocgan이라고 붙은 파일이 VocGAN을 이용하여 합성한 것입니다. vocgan 음성을 들어보면 깨끗하게 들리는 것을 확인할 수 있습니다.

이렇게 KSS Dataset을 FastSpeech2와 VocGAN으로 학습하여 음성합성을 해보았습니다. 품질은 이정도로 나옵니다. 이것을 들어보고 본인의 목소리를 녹음할지 결정하기 바랍니다. 물론 KSS Dataset은 성우가 녹음한 것이고 소음이 거의 없다는 점을 감안해야 합니다.

내 목소리 TTS 학습하기

이제 KSS Dataset의 텍스트를 활용하여 내 목소리를 녹음하고, TTS로 만들어보겠습니다.

mimic-recording-studio로 내 목소리 녹음하기

윈도우에서 mimic-recording-studio를 클론합니다.

윈도우 PowerShell
git clone https://github.com/pyrasis/mimic-recording-studio

miniconda 환경을 생성한 후 백엔드를 실행합니다.

윈도우 PowerShell
conda create --name mimic python=3.8
conda activate mimic
conda install ffmpeg
cd mimic-recording-studio
cd backend
pip install -r .\requirements.txt
python run.py

PowerShell 창을 하나 더 열고 프론트엔드를 실행합니다.

윈도우 PowerShell
cd mimic-recording-studio
cd frontend
npm install
npm run start

웹 브라우저에 Mimic Recording Studio가 표시됩니다.

  • 마이크 사용 권한을 요청: 허용
  • Your Name: 이름 입력(큰 상관 없습니다)
  • RECORD 버튼 클릭

이제 음성 녹음을 시작합니다. 순서는 다음과 같습니다.

  1. 문장이 나오면 스페이스를 누르고 문장을 읽습니다.
  2. 문장을 다 읽고 잠시 기다리면 녹음이 자동으로 끝납니다. 만약 자동으로 녹음이 끝나지 않으면 ESC 키를 누릅니다. 또는 문장을 잘못 읽었다면 ESC 키를 눌러서 중단시킬 수 있습니다.
  3. REVIEW 버튼을 클릭하면 녹음했던 목소리를 들을 수 있습니다.
  4. 음성 녹음이 잘 되었다면 NEXT 버튼을 눌러 다음 문장으로 넘어갑니다. NEXT 버튼을 눌러 다음 문장으로 넘어가기 전까지는 스페이스를 눌러 다시 녹음할 수 있습니다.

음성 녹음은 언제든지 중단할 수 있으며 mimic-recording-studio 백엔드와 프론트엔드를 다시 실행하면 마지막으로 녹음한 부분부터 다시 이어서 녹음할 수 있습니다.

녹음 주의사항

  1. 문장을 읽을 때, 최대한 일정한 속도로 읽습니다.
    어느 문장만 길게 늘여서 읽고, 또 어느 문장은 아주 천천히 읽는다면 학습이 잘 되지 않을 수 있습니다.
  2. 문장부호인 물음표, 느낌표, 마침표는 분명히 구분해서 읽습니다.
  3. 전체 녹음 과정에서 입과 마이크의 간격을 일정하게 유지하고, 동일한 성량으로 읽습니다.
  4. 숨소리, 키보드소리, 에어컨소리 등 잡음이 최대한 들어가지 않도록 주의합니다.
    마이크는 우리에 귀로 들을 수 있는 소리를 모두 녹음한다고 생각하셔야 합니다.
    따라서 아주 작은 소음이라도 녹음 중간에 들어갔다면, 해당 녹음은 다시 진행하시는 편이 좋습니다.
  5. 여러 날에 걸쳐 녹음할 때에는, 다른 날에 녹음한 파일을 들어보며 최대한 비슷하게 읽습니다.

TTS 학습을 위해 최소 1시간 이상의 음성 데이터를 녹음하는 것 권장하며, 더 많이 녹음할수록 더 잘 학습될 가능성이 높습니다.


출처: SCE_TTS

이 mimic-recording-studio는 KSS Dataset 형태에 맞게 wav 파일을 저장하도록 수정되었습니다.

  • wav 파일은 backend\audio_files\<UUID> 아래의 1, 2, 3, 4 폴더에 저장됩니다.
  • transcript.v.1.4.txt 파일은 backend\audio_files에 저장됩니다.

음성 데이터를 학습할 형태로 정리하기

  • backend\audio_files\<UUID> 아래의 1, 2, 3, 4 폴더를 C:\data\kss_myvoice\kss_myvoice로 복사합니다. 즉, C:\data\kss_myvoice\kss_myvoice\1, C:\data\kss_myvoice\kss_myvoice\2, C:\data\kss_myvoice\kss_myvoice\3, C:\data\kss_myvoice\kss_myvoice\4와 같은 모양이 되어야 합니다.
  • backend\audio_files\transcript.v.1.4.txt 파일은 C:\data\kss_myvoice로 복사합니다. 즉, C:\data\kss_myvoice\transcript.v.1.4.txt 형태가 되어야 합니다.

MFARunner로 TextGrid 생성하기

mfa 환경을 활성화하고 MFARunner 디렉터리로 이동합니다. 앞의 과정을 모두 진행했다는 전제하에 설명하겠습니다.

리눅스
$ conda activate mfa
$ cd MFARunner

config.py 파일을 다음과 같이 수정합니다. 즉, dataset_path를 myvoice 경로로 지정합니다.

config.py
class Arguments:

        #dataset_path = "/home/minsu/hdd1/dataset/speech/korean/emotiontts_open_db"
        #dataset_path = "/home/minsu/hdd1/dataset/speech/korean/korean_emotional_speech"
        dataset_path = "/mnt/c/data/kss_myvoice"

        preprocessed_file_dir = "./preprocessed"

        result_dir = "./result"
        phone_set = None                # if use pretrained model, set phone_set to 'english_us_arpa' or etcs..

        num_jobs=8

main.py를 실행하여 TextGrid를 생성합니다.

리눅스
$ python main.py

TextGrid 생성이 끝났으면 다음 명령을 실행하여 TextGrid를 zip 파일로 압축합니다.

리눅스
$ cd result/kss_myvoice
$ zip -r TextGrid.zip ./TextGrid

이렇게 하면 MFARunner/result/kss_myvoice 디렉터리 안에 TextGrid.zip 파일이 생성됩니다.

Korean-FastSpeech2-Pytorch로 학습하기

tts 환경을 활성화하고 Korean-FastSpeech2-Pytorch 디렉터리로 이동합니다.

리눅스
$ conda activate tts
$ cd Korean-FastSpeech2-Pytorch

hparams.py 파일을 다음과 같이 수정합니다. 즉, dataset을 kss_myvoice로 지정하고, dataset_path를 myvoice 경로로 지정합니다. 또한, vocoder를 반드시 None으로 지정합니다.

hparams.py
import os
### kss ###
dataset = "kss_myvoice"
data_path = os.path.join("/mnt/c/data/kss_myvoice", dataset)
meta_name = "transcript.v.1.4.txt"      # "transcript.v.1.4.txt" or "transcript.v.1.3.txt"
textgrid_name = "TextGrid.zip"

... 생략 ...

# Vocoder
vocoder = None
vocoder_pretrained_model_name = "vocgan_kss_pretrained_model_epoch_4500.pt"
vocoder_pretrained_model_path = os.path.join("./vocoder/pretrained_models/", vocoder_pretrained_model_name)

... 생략 ...

데이터 전처리하기

다음 명령을 실행하여 MFARunner에서 생성한 TextGrid.zip 파일을 복사합니다.

리눅스
$ cp ../MFARunner/result/kss_myvoice/TextGrid.zip .

이제 preprocess.py를 실행합니다.

리눅스
$ export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
$ python preprocess.py

실행이 끝나면 C:\data\kss_myvoice\kss_myvoice\wavs 폴더가 생성되며 전처리된 wav 파일이 저장됩니다. 기존 wav 파일들은 C:\data\kss_myvoice\kss_myvoice\wavs_bak 아래에 보관됩니다.

음성합성 학습하기

train.py를 실행하여 음성합성 학습을 시작합니다.

리눅스
$ python train.py

10000 스텝마다 ckpt/kss_myvoice 아래에 체크포인트 파일이 저장됩니다. 350000 스텝까지 학습합니다.

Ctrl+C를 입력하면 학습을 중단할 수 있습니다.

학습이 중단된 뒤 다시 이어서 학습하려면 --restore_step 옵션을 사용하면 됩니다.

리눅스
$ python train.py --restore_step 100000

음성합성 테스트해보기

synthesize.py --step <스텝> 형식으로 음성합성을 해볼 수 있습니다. 다음과 같이 실행한 뒤 4를 입력하고 **안녕하세요. 반갑습니다.**를 입력합니다.

리눅스
$ python synthesize.py --step 350000
which sentence do you want?
1.eval_sentence 2.train_sentence 3.test_sentence 4.create new sentence
4
you went for mode 4
input sentence
안녕하세요. 반갑습니다.

이렇게하면 results 디렉터리에 wav와 png 파일이 생성됩니다.

윈도우에서 접근하려면 탐색기에서 \\wsl$로 이동합니다. 그리고 Ubuntu 폴더 안에서 home\<사용자>\Korean-FastSpeech2-Pytorch\results로 이동합니다. wav 파일을 더블클릭하면 합성된 음성을 들을 수 있습니다.

내 목소리 Vocoder 학습하기

이번에는 파인튜닝에 사용되는 Vocoder를 학습해보겠습니다.

학습 데이터와 검증 데이터 준비하기

다음 명령을 실행하여 Korean-FastSpeech2-Pytorch에서 preprocess.py로 전처리했던 wav 파일을 학습 데이터(train)과 검증 데이터(val)로 분리 복사하겠습니다.

리눅스
$ cd /mnt/c/data/kss_myvoice/kss_myvoice
$ mkdir -p vocgan/train vocgan/val
$ cp wavs/1_*.wav vocgan/val/
$ cp wavs/2_*.wav vocgan/train/
$ cp wavs/3_*.wav vocgan/train/
$ cp wavs/4_*.wav vocgan/train/

VocGAN으로 학습하기

tts 환경을 활성화하고 VocGAN 디렉터리로 이동합니다.

리눅스
$ conda activate tts
$ cd VocGAN

config/default.yaml 파일을 다음과 같이 수정합니다. 즉, trainvalidation을 앞에서 만든 디렉터리로 지정합니다. 그리고 mel_pathvocgan 디렉터리가 있는 위치에 mels 디렉터리를 지정합니다.

config/default.yaml
data: # root path of train/validation data (either relative/absoulte path is ok)
  train: '/mnt/c/data/kss_myvoice/kss_myvoice/vocgan/train'
  validation: '/mnt/c/data/kss_myvoice/kss_myvoice/vocgan/val'
  mel_path: '/mnt/c/data/kss_myvoice/kss_myvoice/mels'
  eval_path: ''

... 생략 ...

데이터 전처리하기

다음과 같이 preprocess.py를 실행합니다.

리눅스
$ export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
$ python preprocess.py -c config/default.yaml -d /mnt/c/data/kss_myvoice/kss_myvoice/vocgan

실행이 끝나면 C:\data\kss_myvoice\kss_myvoice\mels 폴더가 생성되며 전처리된 .npy 파일이 저장됩니다.

Vocoder 학습하기

trainer.py를 실행하여 Vocoder 학습을 시작합니다.

리눅스
$ python trainer.py -c config/default.yaml -n kss_myvoice

20 epoch 마다 chkpt/kss_myvoice 아래에 체크포인트 파일이 저장됩니다. 4500 epoch까지 학습합니다.

Ctrl+C를 입력하면 학습을 중단할 수 있습니다.

학습이 중단된 뒤 다시 이어서 학습하려면 -p 옵션을 사용하면 됩니다.

리눅스
$ python trainer.py -c=config/default.yaml -n kss_myvoice -p chkpt/kss_myvoice/kss_myvoice_2dfbde2_2000.pt

내 목소리 TTS 파인튜닝하기

Korean-FastSpeech2-Pytorch로 파인튜닝하기

이제 Korean-FastSpeech2-Pytorch로 학습한 체크포인트와 VocGAN으로 학습한 체크포인트를 합쳐서 다시 학습하는 파인튜닝을 해보겠습니다.

먼저 VocGAN으로 학습한 체크포인트 파일을 Korean-FastSpeech2-Pytorch 안으로 복사합니다.

리눅스
$ cd ~/
$ cd Korean-FastSpeech2-Pytorch
$ mkdir vocoder/pretrained_models
$ cp ../VocGAN/chkpt/kss_myvoice/kss_myvoice_2dfbde2_4500.pt vocoder/pretrained_models/

hparams.py 파일을 다음과 같이 수정합니다.

hparams.py
... 생략 ...

# Vocoder
vocoder = 'vocgan'
vocoder_pretrained_model_name = "kss_myvoice_2dfbde2_4500.pt"
vocoder_pretrained_model_path = os.path.join("./vocoder/pretrained_models/", vocoder_pretrained_model_name)

... 생략 ...

앞에서 350000 스텝까지 학습한 체크포인트에 이어서 파인튜닝을 합니다.

리눅스
$ python train.py --restore_step 350000

이렇게 700000 스텝까지 학습합니다.

음성합성 테스트해보기

다시 synthesize.py --step <스텝> 형식으로 음성합성을 해봅니다. 다음과 같이 실행한 뒤 4를 입력하고 **안녕하세요. 반갑습니다.**를 입력합니다.

리눅스
$ python synthesize.py --step 700000
which sentence do you want?
1.eval_sentence 2.train_sentence 3.test_sentence 4.create new sentence
4
you went for mode 4
input sentence
안녕하세요. 반갑습니다.

이렇게하면 results 디렉터리에 wav와 png 파일이 생성됩니다.

윈도우에서 접근하려면 탐색기에서 \\wsl$로 이동합니다. 그리고 Ubuntu 폴더 안에서 home\<사용자>\Korean-FastSpeech2-Pytorch\results로 이동합니다. wav 파일을 더블클릭하면 합성된 음성을 들을 수 있습니다.

파일명에 griffin_lim이라고 붙은 것은 기존 방식대로 합성한 것이고, vocgan이라고 붙은 파일이 VocGAN을 이용하여 합성한 것입니다. vocgan 음성을 들어보면 깨끗하게 들리는 것을 확인할 수 있습니다.

이렇게 내 목소리를 TTS로 만들어보았습니다. 쉽지 않은 과정이고 노력에 비해 품질이 마음에 들지 않을 수도 있습니다. 따라오시느라 수고 많으셨습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2023-02-05