Skip to content

Commit 071eab3

Browse files
committed
Merge branch 'dev'
2 parents 023592e + c33baf0 commit 071eab3

File tree

3 files changed

+75
-4
lines changed

3 files changed

+75
-4
lines changed

docs/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
- 学習の際のメモリ使用量を削減しようと頑張った
88

99
### バグ修正や改善
10+
- 学習WebUIからTensorboardのログを見れるように
1011
- 音声合成(やそのAPI)において、同時に別の話者が選択され音声合成がリクエストされた場合に発生するエラーを修正
1112
- モデルマージ時に、そのレシピを`recipe.json`ファイルへ保存するように変更
1213
- 「改行で分けて生成」がより感情が乗る旨の明記等、軽微な説明文の改善
14+
-`ーーそれは面白い`」や「`なるほど。ーーーそういうことか。`」等、長音記号の前が母音でない場合、長音記号``でなくダッシュ``の勘違いだと思われるので、ダッシュ記号として処理するように変更
1315

1416
## v2.0.1 (2024-02-05)
1517

text/japanese.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,9 +485,26 @@ def distribute_phone(n_phone: int, n_word: int) -> list[int]:
485485

486486

487487
def handle_long(sep_phonemes: list[list[str]]) -> list[list[str]]:
488+
"""
489+
フレーズごとに分かれた音素(長音記号がそのまま)のリストのリスト`sep_phonemes`を受け取り、
490+
その長音記号を処理して、音素のリストのリストを返す。
491+
基本的には直前の音素を伸ばすが、直前の音素が母音でない場合もしくは冒頭の場合は、
492+
おそらく長音記号とダッシュを勘違いしていると思われるので、ダッシュに対応する音素`-`に変換する。
493+
"""
488494
for i in range(len(sep_phonemes)):
489495
if sep_phonemes[i][0] == "ー":
490-
sep_phonemes[i][0] = sep_phonemes[i - 1][-1]
496+
if i != 0:
497+
prev_phoneme = sep_phonemes[i - 1][-1]
498+
if prev_phoneme in VOWELS:
499+
# 母音と「ん」のあとの伸ばし棒なので、その母音に変換
500+
sep_phonemes[i][0] = sep_phonemes[i - 1][-1]
501+
else:
502+
# 「。ーー」等おそらく予期しない長音記号
503+
# ダッシュの勘違いだと思われる
504+
sep_phonemes[i][0] = "-"
505+
else:
506+
# 冒頭に長音記号が来ていおり、これはダッシュの勘違いと思われる
507+
sep_phonemes[i][0] = "-"
491508
if "ー" in sep_phonemes[i]:
492509
for j in range(len(sep_phonemes[i])):
493510
if sep_phonemes[i][j] == "ー":

webui_train.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
import json
33
import os
44
import shutil
5+
import subprocess
6+
import socket
7+
import sys
8+
import time
9+
import webbrowser
510
from datetime import datetime
611
from multiprocessing import cpu_count
712

@@ -10,9 +15,11 @@
1015

1116
from common.constants import LATEST_VERSION
1217
from common.log import logger
18+
from common.stdout_wrapper import SAFE_STDOUT
1319
from common.subprocess_utils import run_script_with_log, second_elem_of
1420

1521
logger_handler = None
22+
tensorboard_executed = False
1623

1724
# Get path settings
1825
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):
316323
return True, "Success: 学習が完了しました"
317324

318325

326+
def wait_for_tensorboard(port=6006, timeout=10):
327+
start_time = time.time()
328+
while True:
329+
try:
330+
with socket.create_connection(("localhost", port), timeout=1):
331+
return True # ポートが開いている場合
332+
except OSError:
333+
pass # ポートがまだ開いていない場合
334+
335+
if time.time() - start_time > timeout:
336+
return False # タイムアウト
337+
338+
time.sleep(0.1)
339+
340+
341+
def run_tensorboard(model_name):
342+
global tensorboard_executed
343+
if not tensorboard_executed:
344+
python = sys.executable
345+
tensorboard_cmd = [
346+
python,
347+
"-m",
348+
"tensorboard.main",
349+
"--logdir",
350+
f"Data/{model_name}/models",
351+
]
352+
subprocess.Popen(
353+
tensorboard_cmd,
354+
stdout=SAFE_STDOUT, # type: ignore
355+
stderr=SAFE_STDOUT, # type: ignore
356+
)
357+
yield gr.Button("起動中…")
358+
if wait_for_tensorboard():
359+
tensorboard_executed = True
360+
else:
361+
logger.error("Tensorboard did not start in the expected time.")
362+
webbrowser.open("http://localhost:6006")
363+
yield gr.Button("Tensorboardを開く")
364+
365+
319366
initial_md = f"""
320367
# Style-Bert-VITS2 ver {LATEST_VERSION} 学習用WebUI
321368
@@ -369,7 +416,7 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False):
369416
"""
370417

371418
if __name__ == "__main__":
372-
with gr.Blocks(theme="NoCrypt/miku") as app:
419+
with gr.Blocks(theme="NoCrypt/miku").queue() as app:
373420
gr.Markdown(initial_md)
374421
with gr.Accordion(label="データの前準備", open=False):
375422
gr.Markdown(prepare_md)
@@ -548,7 +595,7 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False):
548595
style_gen_btn = gr.Button(value="実行", variant="primary")
549596
info_style = gr.Textbox(label="状況")
550597
gr.Markdown("## 学習")
551-
with gr.Row(variant="panel"):
598+
with gr.Row():
552599
skip_style = gr.Checkbox(
553600
label="スタイルファイルの生成をスキップする",
554601
info="学習再開の場合の場合はチェックしてください",
@@ -564,7 +611,8 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False):
564611
visible=False, # Experimental
565612
)
566613
train_btn = gr.Button(value="学習を開始する", variant="primary")
567-
info_train = gr.Textbox(label="状況")
614+
tensorboard_btn = gr.Button(value="Tensorboardを開く")
615+
info_train = gr.Textbox(label="状況")
568616

569617
preprocess_button.click(
570618
second_elem_of(preprocess_all),
@@ -635,6 +683,10 @@ def train(model_name, skip_style=False, use_jp_extra=True, speedup=False):
635683
inputs=[model_name, skip_style, use_jp_extra_train, speedup],
636684
outputs=[info_train],
637685
)
686+
tensorboard_btn.click(
687+
run_tensorboard, inputs=[model_name], outputs=[tensorboard_btn]
688+
)
689+
638690
use_jp_extra.change(
639691
lambda x: gr.Checkbox(value=x),
640692
inputs=[use_jp_extra],

0 commit comments

Comments
 (0)