Commit
·
893d32f
1
Parent(s):
c78a910
🔧 修复场景加载错误
Browse files🐛 Bug Fixes:
- 修复场景下拉菜单默认值为 None 导致的加载错误
- 添加场景选择验证,确保用户先选择场景再加载
- 改进错误处理,使用 Gradio 通知系统提供用户友好的反馈
✨ Enhancements:
- 自动设置第一个场景为默认选中
- 添加调试日志,便于排查场景加载问题
- 使用 gr.Info/gr.Warning/gr.Error 提供即时反馈
- 确保默认示例总是可用,提高稳定性
🔍 Debug Info:
- 添加场景文件检查日志
- 显示加载场景的详细信息
- 统计总可用场景数量
现在用户可以正常选择和加载场景,不会再看到'无法加载场景: None'的错误。
app.py
CHANGED
|
@@ -124,8 +124,10 @@ def get_scenario_examples():
|
|
| 124 |
# 加载 JSON 文件场景
|
| 125 |
for key, config in SCENARIO_CONFIG.items():
|
| 126 |
try:
|
| 127 |
-
|
| 128 |
-
|
|
|
|
|
|
|
| 129 |
data = json.load(f)
|
| 130 |
scenarios[config["title"]] = {
|
| 131 |
"text": data.get("text", ""),
|
|
@@ -136,28 +138,29 @@ def get_scenario_examples():
|
|
| 136 |
"text2": data.get("prompt_text_speaker2", ""),
|
| 137 |
"base_path": data.get("base_path", ""),
|
| 138 |
}
|
|
|
|
|
|
|
|
|
|
| 139 |
except Exception as e:
|
| 140 |
print(f"⚠️ 加载场景 {key} 失败: {e}")
|
| 141 |
|
| 142 |
-
#
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
"
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
"base_path": "",
|
| 158 |
-
}
|
| 159 |
-
}
|
| 160 |
|
|
|
|
| 161 |
return scenarios
|
| 162 |
|
| 163 |
|
|
@@ -430,9 +433,13 @@ def create_space_ui() -> gr.Blocks:
|
|
| 430 |
|
| 431 |
with gr.Group():
|
| 432 |
gr.Markdown("### 🚀 快速操作")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 433 |
scenario_dropdown = gr.Dropdown(
|
| 434 |
-
choices=
|
| 435 |
-
value=
|
| 436 |
label="🎭 选择场景",
|
| 437 |
info="选择一个预设场景,自动填充对话文本和参考音频"
|
| 438 |
)
|
|
@@ -503,44 +510,61 @@ def create_space_ui() -> gr.Blocks:
|
|
| 503 |
# ===== 交互逻辑 =====
|
| 504 |
def on_load_scenario(name: str):
|
| 505 |
"""加载选中的场景,包括文本和音频"""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 506 |
scenarios = get_scenario_examples()
|
| 507 |
if name not in scenarios:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 508 |
return (
|
| 509 |
-
|
| 510 |
-
|
|
|
|
|
|
|
|
|
|
| 511 |
)
|
| 512 |
-
|
| 513 |
-
|
| 514 |
-
|
| 515 |
-
# 处理音频路径
|
| 516 |
-
audio1_path = None
|
| 517 |
-
audio2_path = None
|
| 518 |
-
|
| 519 |
-
if scenario.get("audio1"):
|
| 520 |
-
audio1_full = scenario["audio1"]
|
| 521 |
-
if scenario.get("base_path") and not audio1_full.startswith("/"):
|
| 522 |
-
audio1_full = os.path.join(scenario["base_path"], audio1_full)
|
| 523 |
-
if os.path.exists(audio1_full):
|
| 524 |
-
audio1_path = audio1_full
|
| 525 |
-
|
| 526 |
-
if scenario.get("audio2"):
|
| 527 |
-
audio2_full = scenario["audio2"]
|
| 528 |
-
if scenario.get("base_path") and not audio2_full.startswith("/"):
|
| 529 |
-
audio2_full = os.path.join(scenario["base_path"], audio2_full)
|
| 530 |
-
if os.path.exists(audio2_full):
|
| 531 |
-
audio2_path = audio2_full
|
| 532 |
-
|
| 533 |
-
return (
|
| 534 |
-
scenario.get("text", ""),
|
| 535 |
-
audio1_path,
|
| 536 |
-
scenario.get("text1", ""),
|
| 537 |
-
audio2_path,
|
| 538 |
-
scenario.get("text2", "")
|
| 539 |
-
)
|
| 540 |
|
| 541 |
def on_load_default():
|
| 542 |
"""加载默认音频和文本"""
|
| 543 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 544 |
|
| 545 |
btn_load_scenario.click(
|
| 546 |
fn=on_load_scenario,
|
|
|
|
| 124 |
# 加载 JSON 文件场景
|
| 125 |
for key, config in SCENARIO_CONFIG.items():
|
| 126 |
try:
|
| 127 |
+
file_path = config["file"]
|
| 128 |
+
print(f"🔍 检查场景文件: {file_path}")
|
| 129 |
+
if os.path.exists(file_path):
|
| 130 |
+
with open(file_path, "r", encoding="utf-8") as f:
|
| 131 |
data = json.load(f)
|
| 132 |
scenarios[config["title"]] = {
|
| 133 |
"text": data.get("text", ""),
|
|
|
|
| 138 |
"text2": data.get("prompt_text_speaker2", ""),
|
| 139 |
"base_path": data.get("base_path", ""),
|
| 140 |
}
|
| 141 |
+
print(f"✅ 成功加载场景: {config['title']}")
|
| 142 |
+
else:
|
| 143 |
+
print(f"❌ 场景文件不存在: {file_path}")
|
| 144 |
except Exception as e:
|
| 145 |
print(f"⚠️ 加载场景 {key} 失败: {e}")
|
| 146 |
|
| 147 |
+
# 添加默认示例(确保总有可用场景)
|
| 148 |
+
scenarios["🎧 默认示例"] = {
|
| 149 |
+
"text": (
|
| 150 |
+
"[S1]大家好,欢迎收听今天的节目,我是主播小雨。"
|
| 151 |
+
"[S2]大家好,我是嘉宾阿明,很高兴和大家见面。"
|
| 152 |
+
"[S1]今天我们要聊的话题非常有趣,相信大家会喜欢的。"
|
| 153 |
+
"[S2]是的,让我们开始今天的精彩内容吧!"
|
| 154 |
+
),
|
| 155 |
+
"description": "默认的示例对话,适合快速体验",
|
| 156 |
+
"audio1": DEFAULT_AUDIO_CONFIG["speaker1"]["audio"],
|
| 157 |
+
"text1": DEFAULT_AUDIO_CONFIG["speaker1"]["text"],
|
| 158 |
+
"audio2": DEFAULT_AUDIO_CONFIG["speaker2"]["audio"],
|
| 159 |
+
"text2": DEFAULT_AUDIO_CONFIG["speaker2"]["text"],
|
| 160 |
+
"base_path": "",
|
| 161 |
+
}
|
|
|
|
|
|
|
|
|
|
| 162 |
|
| 163 |
+
print(f"📊 总共加载了 {len(scenarios)} 个场景")
|
| 164 |
return scenarios
|
| 165 |
|
| 166 |
|
|
|
|
| 433 |
|
| 434 |
with gr.Group():
|
| 435 |
gr.Markdown("### 🚀 快速操作")
|
| 436 |
+
# 获取场景选项,设置第一个为默认值
|
| 437 |
+
scenario_choices = list(get_scenario_examples().keys())
|
| 438 |
+
default_scenario = scenario_choices[0] if scenario_choices else None
|
| 439 |
+
|
| 440 |
scenario_dropdown = gr.Dropdown(
|
| 441 |
+
choices=scenario_choices,
|
| 442 |
+
value=default_scenario,
|
| 443 |
label="🎭 选择场景",
|
| 444 |
info="选择一个预设场景,自动填充对话文本和参考音频"
|
| 445 |
)
|
|
|
|
| 510 |
# ===== 交互逻辑 =====
|
| 511 |
def on_load_scenario(name: str):
|
| 512 |
"""加载选中的场景,包括文本和音频"""
|
| 513 |
+
if not name or name.strip() == "":
|
| 514 |
+
gr.Warning("⚠️ 请先选择一个场景")
|
| 515 |
+
return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
|
| 516 |
+
|
| 517 |
scenarios = get_scenario_examples()
|
| 518 |
if name not in scenarios:
|
| 519 |
+
gr.Error(f"❌ 场景不存在: {name}")
|
| 520 |
+
return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
|
| 521 |
+
|
| 522 |
+
try:
|
| 523 |
+
scenario = scenarios[name]
|
| 524 |
+
|
| 525 |
+
# 处理音频路径
|
| 526 |
+
audio1_path = None
|
| 527 |
+
audio2_path = None
|
| 528 |
+
|
| 529 |
+
if scenario.get("audio1"):
|
| 530 |
+
audio1_full = scenario["audio1"]
|
| 531 |
+
if scenario.get("base_path") and not audio1_full.startswith("/"):
|
| 532 |
+
audio1_full = os.path.join(scenario["base_path"], audio1_full)
|
| 533 |
+
if os.path.exists(audio1_full):
|
| 534 |
+
audio1_path = audio1_full
|
| 535 |
+
else:
|
| 536 |
+
print(f"⚠️ 音频文件不存在: {audio1_full}")
|
| 537 |
+
|
| 538 |
+
if scenario.get("audio2"):
|
| 539 |
+
audio2_full = scenario["audio2"]
|
| 540 |
+
if scenario.get("base_path") and not audio2_full.startswith("/"):
|
| 541 |
+
audio2_full = os.path.join(scenario["base_path"], audio2_full)
|
| 542 |
+
if os.path.exists(audio2_full):
|
| 543 |
+
audio2_path = audio2_full
|
| 544 |
+
else:
|
| 545 |
+
print(f"⚠️ 音频文件不存在: {audio2_full}")
|
| 546 |
+
|
| 547 |
+
gr.Info(f"✅ 成功加载场景: {name}")
|
| 548 |
return (
|
| 549 |
+
scenario.get("text", ""),
|
| 550 |
+
audio1_path,
|
| 551 |
+
scenario.get("text1", ""),
|
| 552 |
+
audio2_path,
|
| 553 |
+
scenario.get("text2", "")
|
| 554 |
)
|
| 555 |
+
except Exception as e:
|
| 556 |
+
gr.Error(f"❌ 加载场景时出错: {str(e)}")
|
| 557 |
+
return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 558 |
|
| 559 |
def on_load_default():
|
| 560 |
"""加载默认音频和文本"""
|
| 561 |
+
try:
|
| 562 |
+
result = load_default_audio()
|
| 563 |
+
gr.Info("✅ 成功加载默认音频和文本")
|
| 564 |
+
return result
|
| 565 |
+
except Exception as e:
|
| 566 |
+
gr.Error(f"❌ 加载默认音频时出错: {str(e)}")
|
| 567 |
+
return gr.update(), gr.update(), gr.update(), gr.update(), gr.update()
|
| 568 |
|
| 569 |
btn_load_scenario.click(
|
| 570 |
fn=on_load_scenario,
|