This commit is contained in:
litagin02
2024-02-02 21:11:23 +09:00
parent 7a8477b9bc
commit e566ac62f3
17 changed files with 1535 additions and 1162 deletions

View File

@@ -40,6 +40,7 @@ def initialize(
freeze_JP_bert,
freeze_ZH_bert,
freeze_style,
use_jp_extra,
):
global logger_handler
dataset_path, _, train_path, val_path, config_path = get_path(model_name)
@@ -52,14 +53,20 @@ def initialize(
logger_handler = logger.add(os.path.join(dataset_path, file_name))
logger.info(
f"Step 1: start initialization...\nmodel_name: {model_name}, batch_size: {batch_size}, epochs: {epochs}, save_every_steps: {save_every_steps}, bf16_run: {bf16_run}, freeze_ZH_bert: {freeze_ZH_bert}, freeze_JP_bert: {freeze_JP_bert}, freeze_EN_bert: {freeze_EN_bert}, freeze_style: {freeze_style}"
f"Step 1: start initialization...\nmodel_name: {model_name}, batch_size: {batch_size}, epochs: {epochs}, save_every_steps: {save_every_steps}, bf16_run: {bf16_run}, freeze_ZH_bert: {freeze_ZH_bert}, freeze_JP_bert: {freeze_JP_bert}, freeze_EN_bert: {freeze_EN_bert}, freeze_style: {freeze_style}, use_jp_extra: {use_jp_extra}"
)
if os.path.isfile(config_path):
with open(config_path, "r", encoding="utf-8") as f:
config = json.load(f)
else:
# Use default config
with open("configs/config.json", "r", encoding="utf-8") as f:
default_config_path = (
"configs/config.json"
if not use_jp_extra
else "configs/configs_jp_extra.json"
)
with open(default_config_path, "r", encoding="utf-8") as f:
config = json.load(f)
config["model_name"] = model_name
config["data"]["training_files"] = train_path
@@ -83,14 +90,15 @@ def initialize(
dirs_exist_ok=True,
)
shutil.rmtree(model_path)
pretrained_dir = "pretrained" if not use_jp_extra else "pretrained_jp_extra"
try:
shutil.copytree(
src="pretrained",
src=pretrained_dir,
dst=model_path,
)
except FileNotFoundError:
logger.error("Step 1: `pretrained` folder not found.")
return False, "Step 1, Error: pretrainedフォルダが見つかりません。"
logger.error(f"Step 1: {pretrained_dir} folder not found.")
return False, f"Step 1, Error: {pretrained_dir}フォルダが見つかりません。"
with open(config_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=2, ensure_ascii=False)
@@ -138,7 +146,7 @@ def resample(model_name, normalize, trim, num_processes):
return True, "Step 2, Success: 音声ファイルの前処理が完了しました"
def preprocess_text(model_name):
def preprocess_text(model_name, use_jp_extra):
logger.info("Step 3: start preprocessing text...")
dataset_path, lbl_path, train_path, val_path, config_path = get_path(model_name)
try:
@@ -153,25 +161,32 @@ def preprocess_text(model_name):
"\\", "/"
)
f.writelines(f"{path}|{spk}|{language}|{text}\n")
success, message = run_script_with_log(
[
"preprocess_text.py",
"--config-path",
config_path,
"--transcription-path",
lbl_path,
"--train-path",
train_path,
"--val-path",
val_path,
]
)
cmd = [
"preprocess_text.py",
"--config-path",
config_path,
"--transcription-path",
lbl_path,
"--train-path",
train_path,
"--val-path",
val_path,
]
if use_jp_extra:
cmd.append("--use_jp_extra")
success, message = run_script_with_log(cmd)
if not success:
logger.error(f"Step 3: preprocessing text failed.")
return False, f"Step 3, Error: 書き起こしファイルの前処理に失敗しました:\n{message}"
return (
False,
f"Step 3, Error: 書き起こしファイルの前処理に失敗しました:\n{message}",
)
elif message:
logger.warning(f"Step 3: preprocessing text finished with stderr.")
return True, f"Step 3, Success: 書き起こしファイルの前処理が完了しました:\n{message}"
return (
True,
f"Step 3, Success: 書き起こしファイルの前処理が完了しました:\n{message}",
)
logger.success("Step 3: preprocessing text finished.")
return True, "Step 3, Success: 書き起こしファイルの前処理が完了しました"
@@ -193,7 +208,10 @@ def bert_gen(model_name):
return False, f"Step 4, Error: BERT特徴ファイルの生成に失敗しました:\n{message}"
elif message:
logger.warning(f"Step 4: bert_gen finished with stderr.")
return True, f"Step 4, Success: BERT特徴ファイルの生成が完了しました:\n{message}"
return (
True,
f"Step 4, Success: BERT特徴ファイルの生成が完了しました:\n{message}",
)
logger.success("Step 4: bert_gen finished.")
return True, "Step 4, Success: BERT特徴ファイルの生成が完了しました"
@@ -212,10 +230,16 @@ def style_gen(model_name, num_processes):
)
if not success:
logger.error(f"Step 5: style_gen failed.")
return False, f"Step 5, Error: スタイル特徴ファイルの生成に失敗しました:\n{message}"
return (
False,
f"Step 5, Error: スタイル特徴ファイルの生成に失敗しました:\n{message}",
)
elif message:
logger.warning(f"Step 5: style_gen finished with stderr.")
return True, f"Step 5, Success: スタイル特徴ファイルの生成が完了しました:\n{message}"
return (
True,
f"Step 5, Success: スタイル特徴ファイルの生成が完了しました:\n{message}",
)
logger.success("Step 5: style_gen finished.")
return True, "Step 5, Success: スタイル特徴ファイルの生成が完了しました"
@@ -233,6 +257,7 @@ def preprocess_all(
freeze_JP_bert,
freeze_ZH_bert,
freeze_style,
use_jp_extra,
):
if model_name == "":
return False, "Error: モデル名を入力してください"
@@ -246,13 +271,14 @@ def preprocess_all(
freeze_JP_bert,
freeze_ZH_bert,
freeze_style,
use_jp_extra,
)
if not success:
return False, message
success, message = resample(model_name, normalize, trim, num_processes)
if not success:
return False, message
success, message = preprocess_text(model_name)
success, message = preprocess_text(model_name, use_jp_extra)
if not success:
return False, message
success, message = bert_gen(model_name) # bert_genは重いのでプロセス数いじらない
@@ -262,10 +288,13 @@ def preprocess_all(
if not success:
return False, message
logger.success("Success: All preprocess finished!")
return True, "Success: 全ての前処理が完了しました。ターミナルを確認しておかしいところがないか確認するのをおすすめします。"
return (
True,
"Success: 全ての前処理が完了しました。ターミナルを確認しておかしいところがないか確認するのをおすすめします。",
)
def train(model_name, skip_style=False):
def train(model_name, skip_style=False, use_jp_extra=True):
dataset_path, _, _, _, config_path = get_path(model_name)
# 学習再開の場合は念のためconfig.ymlの名前等を更新
with open("config.yml", "r", encoding="utf-8") as f:
@@ -274,12 +303,12 @@ def train(model_name, skip_style=False):
yml_data["dataset_path"] = dataset_path
with open("config.yml", "w", encoding="utf-8") as f:
yaml.dump(yml_data, f, allow_unicode=True)
cmd = ["train_ms.py", "--config", config_path, "--model", dataset_path]
train_py = "train_ms.py" if not use_jp_extra else "train_ms_jp_extra.py"
cmd = [train_py, "--config", config_path, "--model", dataset_path]
if skip_style:
cmd.append("--skip_default_style")
success, message = run_script_with_log(
["train_ms.py", "--config", config_path, "--model", dataset_path]
)
success, message = run_script_with_log(cmd)
if not success:
logger.error(f"Train failed.")
return False, f"Error: 学習に失敗しました:\n{message}"
@@ -348,6 +377,10 @@ if __name__ == "__main__":
gr.Markdown("### 自動前処理")
with gr.Row(variant="panel"):
with gr.Column():
use_jp_extra = gr.Checkbox(
label="日本語特化版を使う(日本語の性能が上がるが英語と中国語は話せなくなる)",
value=False,
)
batch_size = gr.Slider(
label="バッチサイズ",
value=4,
@@ -412,12 +445,18 @@ if __name__ == "__main__":
)
with gr.Column():
preprocess_button = gr.Button(value="自動前処理を実行", variant="primary")
preprocess_button = gr.Button(
value="自動前処理を実行", variant="primary"
)
info_all = gr.Textbox(label="状況")
with gr.Accordion(open=False, label="手動前処理"):
with gr.Row(variant="panel"):
with gr.Column():
gr.Markdown(value="#### Step 1: 設定ファイルの生成")
use_jp_extra_manual = gr.Checkbox(
label="日本語特化版を使う",
value=False,
)
batch_size_manual = gr.Slider(
label="バッチサイズ",
value=4,
@@ -515,6 +554,10 @@ if __name__ == "__main__":
info="学習再開の場合の場合はチェックしてください",
value=False,
)
use_jp_extra_train = gr.Checkbox(
label="日本語特化版を使う",
value=True,
)
train_btn = gr.Button(value="学習を開始する", variant="primary")
info_train = gr.Textbox(label="状況")
@@ -533,6 +576,7 @@ if __name__ == "__main__":
freeze_JP_bert,
freeze_ZH_bert,
freeze_style,
use_jp_extra,
],
outputs=[info_all],
)
@@ -548,6 +592,7 @@ if __name__ == "__main__":
freeze_JP_bert_manual,
freeze_ZH_bert_manual,
freeze_style_manual,
use_jp_extra_manual,
],
outputs=[info_init],
)
@@ -577,7 +622,9 @@ if __name__ == "__main__":
outputs=[info_style],
)
train_btn.click(
second_elem_of(train), inputs=[model_name, skip_style], outputs=[info_train]
second_elem_of(train),
inputs=[model_name, skip_style, use_jp_extra_train],
outputs=[info_train],
)
parser = argparse.ArgumentParser()