심심풀이/AI 음성2024. 1. 3. 19:15
 

EasyBertVits2를 이용해 애니메이션 캐릭터의 TTS 만들기-학습(2)

이제 추출한 영상을 flac으로 1차변환해주고 잡음 제거를 거쳐 wav파일로 완성해주면 됩니다. 샤나인코더와 같은 인코딩 프로그램을 열어서 분리된 영상들을 넣어줍니다. 이 프로그램의 경우 빠

joonnotes.tistory.com

 

이제 마지막으로 학습 데이터를 지정된 위치에 넣어주고 파라미터 값을 적절하게 수정하여 학습 코드를 실행시키면 됩니다. 먼저 EasyBertVits2 폴더에 있는 Download-LearningSample-JVNV.bat을 실행해서 학습 샘플을 다운로드합니다. Bert-VITS2/Data/JVNV-F2 폴더에 파일들이 다운로드되는데 여기있는 파일들을 복사 붙여넣기해서 새로운 학습에 사용할 것입니다.

TTS 작업에는 hiyoriUI를 활용한 그래픽 인터페이스가 제공되지만 학습은 그렇지 않기에 다소 어려운 부분이 있습니다. 때문에 먼저 학습을 위한 폴더 구조를 파악할 필요가 있습니다.

JVNV-F2 폴더에 있는 파일들을 부분적으로 복사해서 위와 같은 구조의 폴더와 파일을 만들어야합니다. 여기서 적색으로 표시된 글자는 파일 안에 파라미터 등을 담고 있어 수정을 한 다음에 학습을 실행해야합니다. D_0.pth 등의 파일은 학습의 기본 모델입니다. /audios/raw 안에는 음성데이터를 넣어줍니다.

 

-esd.list

(음성데이터 경로)|(모델이름)|(언어)|(대본) 형식의 리스트로 학습 데이터들을 정리해놓습니다. 메모장 등의 프로그램으로 열어서 수작업으로 수정할 수도 있으나 파일의 개수가 많기 때문에 파이썬 코드를 활용하여 정리하는 편이 효율적입니다. 음성데이터 파일과 Whisper로 생성된 대본 파일 이름 사이의 유사성을 활용하여 파일 경로와 대본 텍스트를 연결시켜주면 손쉽게 작업할 수 있습니다.

import os
import re

# Paths to the folders containing the .wav and .txt files
wav_folder_path = ''
txt_folder_path = ''

# Output file
output_file = 'esd.list'

# Speaker name and language
speaker_name = ''
language = ''

# Function to extract the leading number from the filename
def extract_leading_number(filename):
    match = re.match(r'(\d+)', filename)
    return match.group(1) if match else None

# Function to find the corresponding .txt file for a .wav file based on the leading number
def find_corresponding_txt(number):
    for txt_file in os.listdir(txt_folder_path):
        if txt_file.startswith(number):
            return txt_file
    return None

with open(output_file, 'w', encoding='utf-8') as output:
    for wav_file in os.listdir(wav_folder_path):
        if wav_file.endswith('.wav'):
            number = extract_leading_number(wav_file)
            if number:
                txt_file_name = find_corresponding_txt(number)

                if txt_file_name:
                    wav_file_path = os.path.join(wav_folder_path, wav_file)
                    txt_file_path = os.path.join(txt_folder_path, txt_file_name)

                    with open(txt_file_path, 'r', encoding='utf-8') as txt_file:
                        text = txt_file.read().strip()

                    output_line = f"{wav_file_path}|{speaker_name}|{language}|{text}\n"
                    output.write(output_line)
                else:
                    print(f"No corresponding .txt file found for {wav_file}")

print(f"Data written to {output_file}")
Data/Gigi/audios/wavs\10_[SHANA]output9_(Vocals).wav|Gigi|JP|子供の論理って正しいことありますよ
Data/Gigi/audios/wavs\11_[SHANA]output10_(Vocals).wav|Gigi|JP|そうね 精錬潔白というわけにはいかないそれをどう考えるんですか
Data/Gigi/audios/wavs\12_[SHANA]output11_(Vocals).wav|Gigi|JP|あなたってパターンしか喋らないんだ
Data/Gigi/audios/wavs\13_[SHANA]output12_(Vocals).wav|Gigi|JP|かわいいですよスーダン語、アラブ語、古いアイルランド語の合成というよりひどいメドレー名前じゃないわマフティナビー・ユエリン

여기서 주의해야할 점은 파일 경로가 드라이브 단위에서 시작하는 것이 아니라 Data부터 시작된다는 점입니다. C:/ 와 같이 파일 경로가 시작되며 학습 시 에러가 나오니 주의하셔야합니다.

또한 학습 데이터를 넣는 폴더는 raw지만 학습을 시행하면 wavs 폴더가 생성되면서 그 안에 학습용으로 재가공된 파일이 담기므로 /audios/wavs를 경로로 사용해야합니다.

 

-config.json

{
  "train": {
    "log_interval": 200,
    "eval_interval": 2000,
    "seed": 42,
    "epochs": 200,
    "learning_rate": 0.0002,
    "betas": [
      0.8,
      0.99
    ],
    "eps": 1e-09,
    "batch_size": 3,
    "fp16_run": false,
    "lr_decay": 0.99995,
    "segment_size": 16384,
    "init_lr_ratio": 1,
    "warmup_epochs": 0,
    "c_mel": 45,
    "c_kl": 1.0,
    "skip_optimizer": true
  },

학습 구조도

학습 시 여러 파라미터가 담아져 있습니다. 크게 수정할 부분은 interval 파라미터, batch_size, epochs 정도 입니다.

interval의 경우 로그 파일이나 모델의 중간 저장 간격을 몇 번의 iteration으로 설정할 것인가를 물어봅니다. 기본 설정 정도면 무난한 수치이므로 작업을 여러번 하시다가 수정할 필요가 느껴지면 바꾸셔도 무방합니다.

batch_size는 한 번의 epoch에서 몇 개의 음성 데이터 파일을 이용할 것인지를 결정해주는 파라미터입니다. 값이 클수록 한 번의 epoch에 들어가는 학습 데이터가 적어집니다.

epochs는 학습을 몇 번의 epoch 동안 진행할 것인지를 정합니다.

결국 iterations은 (data size/batch size)*epochs로 결정됩니다. 대개 iterations=2000부터 수렴이 진행된다고 알려져있으나 개별 음성 파일의 길이에 따라 값의 편차가 존재하니 경험적으로 파악해야합니다.

 

-config.yml

# グローバル設定
# 2 つの GPU で 2 つのトレーニング セットを同時に実行するなど、複数の設定ファイルを同時に使用する場合: 環境変数を使用して設定ファイルを指定します。指定しない場合、デフォルトは ./config.yml です。

# 共通のパス設定を提供し、データが無秩序に配置されるのを避けるためにデータを均一に保存します。
# 各データセットとそれに対応するモデルは統一されたパスの下に保存され、後続のすべてのパス設定は datasetPath に対する相対パスになります。
# 空白のままにした場合、パスはプロジェクトのルート ディレクトリを基準にした相対パスになります。
dataset_path: "Data/Gigi/"

이 파일의 경우 dataset_path에 준비된 데이터들이 모여있는 경로를 위와 같이 입력해주면 됩니다.

 

 

EasyBertVits2를 이용해 애니메이션 캐릭터의 TTS 만들기-학습(4)

https://joonnotes.tistory.com/50 EasyBertVits2를 이용해 애니메이션 캐릭터의 TTS 만들기-학습(3) 이제 마지막으로 학습 데이터를 지정된 위치에 넣어주고 파라미터 값을 적절하게 수정하여 학습 코드를 실

joonnotes.tistory.com

 

Posted by 돌멩이와 쥐