vincenthugging commited on
Commit
0d65580
·
1 Parent(s): 2b574d8

🔧 修正场景和音频加载逻辑 - 功能独立化

Browse files

🎯 核心逻辑修正:
1. **场景加载重新定义**
- '📝 加载场景文本': 只更换对话文本,不影响音频设置
- 场景选择器信息更新为'获取不同主题的对话文本'
- on_load_scenario() 函数简化,只返回对话文本

2. **音频加载保持独立**
- '🎧 加载默认音频': 专门用于加载参考音频和对应文本
- 音频和文本设置完全独立于场景选择
- 保持原有的1:1音频-文本匹配逻辑

3. **UI交互优化**
- 按钮标签更清晰:'加载场景' → '📝 加载场景文本'
- 使用说明分步骤标注:【文本】【音频】【参考文本】【设置】【生成】
- 场景和音频操作完全解耦

4. **函数输出调整**
- on_load_scenario(): 5个输出 → 1个输出(只有对话文本)
- btn_load_scenario.click(): 只更新 dialogue_text 组件
- 保持 on_load_default() 的完整功能不变

🎨 用户体验改进:
- 场景选择不会意外覆盖已设置的音频
- 音频设置独立,可以先设好音频再换场景文本
- 操作逻辑更清晰:文本归文本,音频归音频
- 符合用户直觉:场景=内容主题,音频=声音风格

🔄 使用流程:
1. 设置音频(一次) → 2. 切换场景文本(多次) → 3. 生成音频
现在可以先确定说话者音频风格,然后自由切换不同场景的对话内容!

Files changed (1) hide show
  1. app.py +16 -52
app.py CHANGED
@@ -534,11 +534,11 @@ def create_space_ui() -> gr.Blocks:
534
  choices=predefined_scenarios,
535
  value=predefined_scenarios[0],
536
  label="🎭 选择场景",
537
- info="选择一个预设场景,自动填充对话文本和参考音频"
538
  )
539
  with gr.Row():
540
- btn_load_scenario = gr.Button("📥 加载场景", variant="secondary")
541
- btn_load_default = gr.Button("🎧 默认音频", variant="secondary")
542
 
543
  with gr.Row():
544
  with gr.Group():
@@ -696,11 +696,11 @@ def create_space_ui() -> gr.Blocks:
696
  gr.Markdown(
697
  """
698
  **🎯 快速开始:**
699
- 1. 选择场景并点击"加载场景",或自己输入对话文本
700
- 2. 上传两个参考音频(分别对应说话者1和说话者2)
701
- 3. 输入与参考音频完全匹配的参考文本
702
- 4. 勾选"文本标准化"(推荐)
703
- 5. 点击"开始合成"
704
 
705
  **📝 格式要求:**
706
  - 使用 `[S1]`/`[S2]` 标记不同说话者
@@ -722,62 +722,26 @@ def create_space_ui() -> gr.Blocks:
722
 
723
  # ===== 交互逻辑 =====
724
  def on_load_scenario(name: str):
725
- """加载选中的场景,包括文本和音频"""
726
  if not name or name.strip() == "":
727
  gr.Warning("⚠️ 请先选择一个场景")
728
- return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
729
-
730
- # 处理默认示例的特殊情况
731
- if name == "🎧 默认示例":
732
- try:
733
- result = load_default_audio()
734
- gr.Info("✅ 成功加载默认示例")
735
- return result
736
- except Exception as e:
737
- gr.Error(f"❌ 加载默认示例时出错: {str(e)}")
738
- return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
739
 
740
  scenarios = get_scenario_examples()
741
  if name not in scenarios:
742
  gr.Error(f"❌ 场景不存在: {name}")
743
- return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
744
 
745
  try:
746
  scenario = scenarios[name]
 
747
 
748
- # 处理音频路径
749
- audio1_path = None
750
- audio2_path = None
751
-
752
- if scenario.get("audio1"):
753
- audio1_full = scenario["audio1"]
754
- if scenario.get("base_path") and not audio1_full.startswith("/"):
755
- audio1_full = os.path.join(scenario["base_path"], audio1_full)
756
- if os.path.exists(audio1_full):
757
- audio1_path = audio1_full
758
- else:
759
- print(f"⚠️ 音频文件不存在: {audio1_full}")
760
 
761
- if scenario.get("audio2"):
762
- audio2_full = scenario["audio2"]
763
- if scenario.get("base_path") and not audio2_full.startswith("/"):
764
- audio2_full = os.path.join(scenario["base_path"], audio2_full)
765
- if os.path.exists(audio2_full):
766
- audio2_path = audio2_full
767
- else:
768
- print(f"⚠️ 音频文件不存在: {audio2_full}")
769
-
770
- gr.Info(f"✅ 成功加载场景: {name}")
771
- return (
772
- scenario.get("text", ""),
773
- audio1_path,
774
- scenario.get("text1", ""),
775
- audio2_path,
776
- scenario.get("text2", "")
777
- )
778
  except Exception as e:
779
  gr.Error(f"❌ 加载场景时出错: {str(e)}")
780
- return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
781
 
782
  def on_load_default():
783
  """加载默认音频和文本"""
@@ -820,7 +784,7 @@ def create_space_ui() -> gr.Blocks:
820
  btn_load_scenario.click(
821
  fn=on_load_scenario,
822
  inputs=[scenario_dropdown],
823
- outputs=[dialogue_text, speaker1_audio, speaker1_text, speaker2_audio, speaker2_text],
824
  )
825
 
826
  btn_load_default.click(
 
534
  choices=predefined_scenarios,
535
  value=predefined_scenarios[0],
536
  label="🎭 选择场景",
537
+ info="选择一个预设场景,获取不同主题的对话文本"
538
  )
539
  with gr.Row():
540
+ btn_load_scenario = gr.Button("📝 加载场景文本", variant="secondary")
541
+ btn_load_default = gr.Button("🎧 加载默认音频", variant="secondary")
542
 
543
  with gr.Row():
544
  with gr.Group():
 
696
  gr.Markdown(
697
  """
698
  **🎯 快速开始:**
699
+ 1. 【文本】选择场景并点击"📝 加载场景文本",或自己输入对话文本
700
+ 2. 【音频】点击"🎧 加载默认音频"使用示例音频,或上传自己的参考音频
701
+ 3. 【参考文本】确保参考文本与音频内容完全匹配
702
+ 4. 【设置】勾选"文本标准化",可选调整高级参数
703
+ 5. 【生成】点击"🎬 开始合成"
704
 
705
  **📝 格式要求:**
706
  - 使用 `[S1]`/`[S2]` 标记不同说话者
 
722
 
723
  # ===== 交互逻辑 =====
724
  def on_load_scenario(name: str):
725
+ """加载选中的场景 - 只更换对话文本,不影响音频"""
726
  if not name or name.strip() == "":
727
  gr.Warning("⚠️ 请先选择一个场景")
728
+ return gr.update()
 
 
 
 
 
 
 
 
 
 
729
 
730
  scenarios = get_scenario_examples()
731
  if name not in scenarios:
732
  gr.Error(f"❌ 场景不存在: {name}")
733
+ return gr.update()
734
 
735
  try:
736
  scenario = scenarios[name]
737
+ dialogue_text = scenario.get("text", "")
738
 
739
+ gr.Info(f"✅ 成功加载场景: {name} (仅更换对话文本)")
740
+ return dialogue_text
 
 
 
 
 
 
 
 
 
 
741
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
742
  except Exception as e:
743
  gr.Error(f"❌ 加载场景时出错: {str(e)}")
744
+ return gr.update()
745
 
746
  def on_load_default():
747
  """加载默认音频和文本"""
 
784
  btn_load_scenario.click(
785
  fn=on_load_scenario,
786
  inputs=[scenario_dropdown],
787
+ outputs=[dialogue_text], # 只更新对话文本
788
  )
789
 
790
  btn_load_default.click(