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. 生成音频
现在可以先确定说话者音频风格,然后自由切换不同场景的对话内容!
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("
|
541 |
-
btn_load_default = gr.Button("🎧
|
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.
|
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()
|
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()
|
744 |
|
745 |
try:
|
746 |
scenario = scenarios[name]
|
|
|
747 |
|
748 |
-
|
749 |
-
|
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()
|
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,
|
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(
|