Update
This commit is contained in:
113
webui_train.py
113
webui_train.py
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user