From f9e77ec5e363e6cc4d15992f0fc0d4a3104774b9 Mon Sep 17 00:00:00 2001 From: litagin02 Date: Wed, 7 Feb 2024 17:17:40 +0900 Subject: [PATCH 1/2] Improve: convert beginning long symbol to dash --- text/japanese.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/text/japanese.py b/text/japanese.py index 5c0558756..70658cd0e 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -485,9 +485,26 @@ def distribute_phone(n_phone: int, n_word: int) -> list[int]: def handle_long(sep_phonemes: list[list[str]]) -> list[list[str]]: + """ + フレーズごとに分かれた音素(長音記号がそのまま)のリストのリスト`sep_phonemes`を受け取り、 + その長音記号を処理して、音素のリストのリストを返す。 + 基本的には直前の音素を伸ばすが、直前の音素が母音でない場合もしくは冒頭の場合は、 + おそらく長音記号とダッシュを勘違いしていると思われるので、ダッシュに対応する音素`-`に変換する。 + """ for i in range(len(sep_phonemes)): if sep_phonemes[i][0] == "ー": - sep_phonemes[i][0] = sep_phonemes[i - 1][-1] + if i != 0: + prev_phoneme = sep_phonemes[i - 1][-1] + if prev_phoneme in VOWELS: + # 母音と「ん」のあとの伸ばし棒なので、その母音に変換 + sep_phonemes[i][0] = sep_phonemes[i - 1][-1] + else: + # 「。ーー」等おそらく予期しない長音記号 + # ダッシュの勘違いだと思われる + sep_phonemes[i][0] = "-" + else: + # 冒頭に長音記号が来ていおり、これはダッシュの勘違いと思われる + sep_phonemes[i][0] = "-" if "ー" in sep_phonemes[i]: for j in range(len(sep_phonemes[i])): if sep_phonemes[i][j] == "ー": From c33baf07b38144d8a9f904894cb7979386d8b4c8 Mon Sep 17 00:00:00 2001 From: litagin02 Date: Wed, 7 Feb 2024 17:50:54 +0900 Subject: [PATCH 2/2] Feat: open tensorboard button --- docs/CHANGELOG.md | 2 ++ webui_train.py | 58 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 00a890cf8..fff8989d5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,9 +7,11 @@ - 学習の際のメモリ使用量を削減しようと頑張った ### バグ修正や改善 +- 学習WebUIからTensorboardのログを見れるように - 音声合成(やそのAPI)において、同時に別の話者が選択され音声合成がリクエストされた場合に発生するエラーを修正 - モデルマージ時に、そのレシピを`recipe.json`ファイルへ保存するように変更 - 「改行で分けて生成」がより感情が乗る旨の明記等、軽微な説明文の改善 +- 「`ーーそれは面白い`」や「`なるほど。ーーーそういうことか。`」等、長音記号の前が母音でない場合、長音記号`ー`でなくダッシュ`―`の勘違いだと思われるので、ダッシュ記号として処理するように変更 ## v2.0.1 (2024-02-05) diff --git a/webui_train.py b/webui_train.py index 77301ba4d..f7d3ef1d9 100644 --- a/webui_train.py +++ b/webui_train.py @@ -2,6 +2,11 @@ import json import os import shutil +import subprocess +import socket +import sys +import time +import webbrowser from datetime import datetime from multiprocessing import cpu_count @@ -10,9 +15,11 @@ from common.constants import LATEST_VERSION from common.log import logger +from common.stdout_wrapper import SAFE_STDOUT from common.subprocess_utils import run_script_with_log, second_elem_of logger_handler = None +tensorboard_executed = False # Get path settings with open(os.path.join("configs", "paths.yml"), "r", encoding="utf-8") as f: @@ -316,6 +323,46 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False): return True, "Success: 学習が完了しました" +def wait_for_tensorboard(port=6006, timeout=10): + start_time = time.time() + while True: + try: + with socket.create_connection(("localhost", port), timeout=1): + return True # ポートが開いている場合 + except OSError: + pass # ポートがまだ開いていない場合 + + if time.time() - start_time > timeout: + return False # タイムアウト + + time.sleep(0.1) + + +def run_tensorboard(model_name): + global tensorboard_executed + if not tensorboard_executed: + python = sys.executable + tensorboard_cmd = [ + python, + "-m", + "tensorboard.main", + "--logdir", + f"Data/{model_name}/models", + ] + subprocess.Popen( + tensorboard_cmd, + stdout=SAFE_STDOUT, # type: ignore + stderr=SAFE_STDOUT, # type: ignore + ) + yield gr.Button("起動中…") + if wait_for_tensorboard(): + tensorboard_executed = True + else: + logger.error("Tensorboard did not start in the expected time.") + webbrowser.open("http://localhost:6006") + yield gr.Button("Tensorboardを開く") + + initial_md = f""" # Style-Bert-VITS2 ver {LATEST_VERSION} 学習用WebUI @@ -369,7 +416,7 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False): """ if __name__ == "__main__": - with gr.Blocks(theme="NoCrypt/miku") as app: + with gr.Blocks(theme="NoCrypt/miku").queue() as app: gr.Markdown(initial_md) with gr.Accordion(label="データの前準備", open=False): gr.Markdown(prepare_md) @@ -548,7 +595,7 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False): style_gen_btn = gr.Button(value="実行", variant="primary") info_style = gr.Textbox(label="状況") gr.Markdown("## 学習") - with gr.Row(variant="panel"): + with gr.Row(): skip_style = gr.Checkbox( label="スタイルファイルの生成をスキップする", info="学習再開の場合の場合はチェックしてください", @@ -564,7 +611,8 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False): visible=False, # Experimental ) train_btn = gr.Button(value="学習を開始する", variant="primary") - info_train = gr.Textbox(label="状況") + tensorboard_btn = gr.Button(value="Tensorboardを開く") + info_train = gr.Textbox(label="状況") preprocess_button.click( second_elem_of(preprocess_all), @@ -635,6 +683,10 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False): inputs=[model_name, skip_style, use_jp_extra_train, speedup], outputs=[info_train], ) + tensorboard_btn.click( + run_tensorboard, inputs=[model_name], outputs=[tensorboard_btn] + ) + use_jp_extra.change( lambda x: gr.Checkbox(value=x), inputs=[use_jp_extra],