shiny-rufflet commited on
Commit
7d653ef
·
1 Parent(s): 966a19e
Files changed (2) hide show
  1. app.py +6 -8
  2. gradio_tabs/sample.py +16 -34
app.py CHANGED
@@ -8,7 +8,7 @@ start_time = time.time()
8
  # Hugging Face Spacesでは推論のみ行うのが一般的なので、
9
  # only_infer=True を指定して不要なモデルのダウンロードをスキップします。
10
  # これにより起動が高速化します。
11
- initialize.main(only_infer=True)
12
  end_time = time.time()
13
  print(f"--- [2/3] Model Setup Complete. Elapsed time: {end_time - start_time:.2f} seconds ---")
14
  # ===================================================================
@@ -26,8 +26,8 @@ import torch
26
  # 拡張機能タブから必要なものだけをインポート
27
  from gradio_tabs.single import create_synthesis_app
28
  from gradio_tabs.merge import create_merge_app
29
- # ★★★ このインポートが正しく動作するようになる ★★★
30
- from gradio_tabs.sample import create_player_app
31
 
32
  from config import get_path_config
33
  from style_bert_vits2.constants import GRADIO_THEME, VERSION
@@ -44,7 +44,7 @@ update_dict()
44
 
45
 
46
  parser = argparse.ArgumentParser()
47
- parser.add_argument("--device", type="str", default="cuda")
48
  parser.add_argument("--no_autolaunch", action="store_true")
49
 
50
  args = parser.parse_args()
@@ -58,8 +58,6 @@ else:
58
 
59
  path_config = get_path_config()
60
 
61
- # この時点で、initialize.pyが作成したモデルへのシンボリックリンクが
62
- # Path(path_config.assets_root) 以下に存在しているはずです。
63
  model_holder = TTSModelHolder(Path(path_config.assets_root), device)
64
 
65
  # 起動時にトップへスクロールさせるjsを追加
@@ -71,9 +69,9 @@ with gr.Blocks(theme=GRADIO_THEME, js="() => { window.scrollTo(0, 0); }") as app
71
  create_synthesis_app(model_holder=model_holder)
72
  with gr.Tab("融☆合"):
73
  create_merge_app(model_holder=model_holder)
74
- # ★★★ ここに新しい「再生」タブを追加 ★★★
75
  with gr.Tab("サンプル"):
76
- create_player_app()
77
 
78
  # Hugging Face Spacesでは、share=Trueは不要(自動で公開URLが生成される)
79
  # また、サーバー名とポートも指定しない方が安定します。
 
8
  # Hugging Face Spacesでは推論のみ行うのが一般的なので、
9
  # only_infer=True を指定して不要なモデルのダウンロードをスキップします。
10
  # これにより起動が高速化します。
11
+ initialize.main(only_infer=True)
12
  end_time = time.time()
13
  print(f"--- [2/3] Model Setup Complete. Elapsed time: {end_time - start_time:.2f} seconds ---")
14
  # ===================================================================
 
26
  # 拡張機能タブから必要なものだけをインポート
27
  from gradio_tabs.single import create_synthesis_app
28
  from gradio_tabs.merge import create_merge_app
29
+ # ▼▼▼ ここを追加 ▼▼▼
30
+ from gradio_tabs.sample import create_player_tab # sample.pyから関数をインポート
31
 
32
  from config import get_path_config
33
  from style_bert_vits2.constants import GRADIO_THEME, VERSION
 
44
 
45
 
46
  parser = argparse.ArgumentParser()
47
+ parser.add_argument("--device", type=str, default="cuda")
48
  parser.add_argument("--no_autolaunch", action="store_true")
49
 
50
  args = parser.parse_args()
 
58
 
59
  path_config = get_path_config()
60
 
 
 
61
  model_holder = TTSModelHolder(Path(path_config.assets_root), device)
62
 
63
  # 起動時にトップへスクロールさせるjsを追加
 
69
  create_synthesis_app(model_holder=model_holder)
70
  with gr.Tab("融☆合"):
71
  create_merge_app(model_holder=model_holder)
72
+ # ▼▼▼ ここを追加 ▼▼▼
73
  with gr.Tab("サンプル"):
74
+ create_player_tab() # インポートした関数を呼び出してUIを構築
75
 
76
  # Hugging Face Spacesでは、share=Trueは不要(自動で公開URLが生成される)
77
  # また、サーバー名とポートも指定しない方が安定します。
gradio_tabs/sample.py CHANGED
@@ -4,7 +4,7 @@ import glob
4
  import re
5
 
6
  # --- 定数定義 ---
7
- # Style-Bert-VITS2の出力フォルダ名を指定
8
  OUTPUT_DIR = "sample_audio"
9
 
10
  # --- 1. ヘルパー関数 ---
@@ -14,54 +14,41 @@ def natural_sort_key(s):
14
  """
15
  return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)]
16
 
17
- # --- 2. Gradioアプリのロジックとなる関数 ---
18
  def get_folders():
19
- """outputディレクトリ内のサブフォルダのリストを自然順ソートで取得します。"""
20
  if not os.path.exists(OUTPUT_DIR) or not os.path.isdir(OUTPUT_DIR):
21
- # outputフォルダが存在しない場合、空のリストと警告を返す
22
  print(f"警告: '{OUTPUT_DIR}' フォルダが見つかりません。")
23
  return []
24
 
25
- # is_dir() でディレクトリのみをフィルタリング
26
  folders = [f.name for f in os.scandir(OUTPUT_DIR) if f.is_dir()]
27
-
28
- # フォルダ名を自然順でソート
29
  folders.sort(key=natural_sort_key)
30
  return folders
31
 
32
  def update_file_list(folder_name):
33
  """
34
  選択されたフォルダに応じて、ファイルリストの選択肢を更新します。
35
- ファイルパス全体ではなく、内容がわかるテキスト部分のみを表示します。
36
  """
37
  if not folder_name:
38
  return gr.update(choices=[], value=None, label="ファイルを選択")
39
 
40
- # [XXX]/[XXX]_[YYY].wav のパターンに一致するファイルを検索
41
  search_pattern = os.path.join(OUTPUT_DIR, folder_name, f"{folder_name}_*.wav")
42
  file_paths = sorted(glob.glob(search_pattern))
43
 
44
- # 表示用の選択肢リストを作成 (表示名, 実際の値) のタプルのリスト
45
  choices_list = []
46
  for path in file_paths:
47
- # ファイル名部分を取得 (例: FN1_こんにちは.wav)
48
  basename = os.path.basename(path)
49
- # プレフィックスと拡張子を除去して表示名を作成 (例: こんにちは)
50
  prefix_to_remove = f"{folder_name}_"
51
  if basename.startswith(prefix_to_remove):
52
  display_name = basename[len(prefix_to_remove):]
53
  else:
54
  display_name = basename
55
 
56
- # .wav拡張子を削除
57
  display_name = display_name.removesuffix(".wav")
58
-
59
  choices_list.append((display_name, path))
60
 
61
  if not choices_list:
62
  return gr.update(choices=[], value=None, label=f"{folder_name} にはファイルがありません")
63
 
64
- # Gradioコンポーネントを更新して返す
65
  return gr.update(choices=choices_list, value=None, label=f"「{folder_name}」のファイルリスト")
66
 
67
  def play_audio(filepath):
@@ -71,8 +58,11 @@ def play_audio(filepath):
71
  return gr.update(value=filepath, visible=bool(filepath))
72
 
73
 
74
- # --- 3. Gradio UIの構築 ---
75
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
 
 
 
76
  gr.Markdown(
77
  f"""
78
  # Style-Bert-VITS2 音声再生プレイヤー
@@ -81,7 +71,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
81
  """
82
  )
83
 
84
- # 初期のフォルダリストを取得
85
  initial_folders = get_folders()
86
 
87
  if not initial_folders:
@@ -93,36 +82,29 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
93
  label="1. フォルダ(話者)を選択",
94
  interactive=True
95
  )
96
- file_selector = gr.Radio(
97
- label="2. ファイルを選択",
98
- choices=[], # 最初は空
99
- interactive=True
100
- )
 
 
101
 
102
- # 最初は非表示にしておき、ファイルが選択されたら表示する
103
  audio_player = gr.Audio(label="再生プレイヤー", type="filepath", visible=False)
104
 
105
- # --- 4. コンポーネント間の連携を設定 ---
106
-
107
- # フォルダセレクタの値が変更されたら、ファイルリストを更新する
108
  folder_selector.change(
109
  fn=update_file_list,
110
  inputs=folder_selector,
111
  outputs=file_selector
112
  ).then(
113
- # フォルダが切り替わったらプレイヤーを非表示にする
114
  fn=lambda: gr.update(value=None, visible=False),
115
  inputs=None,
116
  outputs=audio_player
117
  )
118
 
119
- # ファイルセレクタの値が変更されたら、オーディオプレイヤーを更新する
120
  file_selector.change(
121
  fn=play_audio,
122
  inputs=file_selector,
123
  outputs=audio_player
124
- )
125
-
126
- # --- 5. アプリの実行 ---
127
- if __name__ == "__main__":
128
- demo.launch()
 
4
  import re
5
 
6
  # --- 定数定義 ---
7
+ # Style-Bert-VITS2の実際の出力フォルダ名を指定
8
  OUTPUT_DIR = "sample_audio"
9
 
10
  # --- 1. ヘルパー関数 ---
 
14
  """
15
  return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)]
16
 
 
17
  def get_folders():
18
+ """outputsディレクトリ内のサブフォルダのリストを自然順ソートで取得します。"""
19
  if not os.path.exists(OUTPUT_DIR) or not os.path.isdir(OUTPUT_DIR):
 
20
  print(f"警告: '{OUTPUT_DIR}' フォルダが見つかりません。")
21
  return []
22
 
 
23
  folders = [f.name for f in os.scandir(OUTPUT_DIR) if f.is_dir()]
 
 
24
  folders.sort(key=natural_sort_key)
25
  return folders
26
 
27
  def update_file_list(folder_name):
28
  """
29
  選択されたフォルダに応じて、ファイルリストの選択肢を更新します。
 
30
  """
31
  if not folder_name:
32
  return gr.update(choices=[], value=None, label="ファイルを選択")
33
 
 
34
  search_pattern = os.path.join(OUTPUT_DIR, folder_name, f"{folder_name}_*.wav")
35
  file_paths = sorted(glob.glob(search_pattern))
36
 
 
37
  choices_list = []
38
  for path in file_paths:
 
39
  basename = os.path.basename(path)
 
40
  prefix_to_remove = f"{folder_name}_"
41
  if basename.startswith(prefix_to_remove):
42
  display_name = basename[len(prefix_to_remove):]
43
  else:
44
  display_name = basename
45
 
 
46
  display_name = display_name.removesuffix(".wav")
 
47
  choices_list.append((display_name, path))
48
 
49
  if not choices_list:
50
  return gr.update(choices=[], value=None, label=f"{folder_name} にはファイルがありません")
51
 
 
52
  return gr.update(choices=choices_list, value=None, label=f"「{folder_name}」のファイルリスト")
53
 
54
  def play_audio(filepath):
 
58
  return gr.update(value=filepath, visible=bool(filepath))
59
 
60
 
61
+ # --- 2. Gradio UIの構築 ---
62
+ def create_player_tab():
63
+ """
64
+ 音声再生プレイヤーのUIコンポーネントを作成し、タブ内に配置できるようにする関数。
65
+ """
66
  gr.Markdown(
67
  f"""
68
  # Style-Bert-VITS2 音声再生プレイヤー
 
71
  """
72
  )
73
 
 
74
  initial_folders = get_folders()
75
 
76
  if not initial_folders:
 
82
  label="1. フォルダ(話者)を選択",
83
  interactive=True
84
  )
85
+ # フォルダリストが長い場合に見やすくなるようにコンポーネントを分ける
86
+ with gr.Column(scale=2): # 横幅の比率を調整
87
+ file_selector = gr.Radio(
88
+ label="2. ファイルを選択",
89
+ choices=[],
90
+ interactive=True
91
+ )
92
 
 
93
  audio_player = gr.Audio(label="再生プレイヤー", type="filepath", visible=False)
94
 
95
+ # --- 3. コンポーネント間の連携を設定 ---
 
 
96
  folder_selector.change(
97
  fn=update_file_list,
98
  inputs=folder_selector,
99
  outputs=file_selector
100
  ).then(
 
101
  fn=lambda: gr.update(value=None, visible=False),
102
  inputs=None,
103
  outputs=audio_player
104
  )
105
 
 
106
  file_selector.change(
107
  fn=play_audio,
108
  inputs=file_selector,
109
  outputs=audio_player
110
+ )