Commit
·
81ba8ab
1
Parent(s):
88ea080
🔧 修复默认音频文件路径错误
Browse files🐛 主要修复:
1. **文件路径问题**
- 移除UI初始化时的音频文件预设,避免无效路径
- 修改为只预填充对话文本,音频需要用户主动加载
- 添加音频文件存在性检查和日志输出
2. **用户体验优化**
- 更新提示信息:指导用户点击'默认音频'按钮
- 改进错误提示:友好引导而非简单的错误信息
- 保持开箱即用体验:文本预填充 + 一键音频加载
3. **交互流程调整**
- 页面打开:自动填充对话文本 ✅
- 用户点击'🎧 默认音频':加载参考音频和文本 ✅
- 点击'🎬 开始合成':生成音频 ✅
🎯 解决问题:
- 消除 'No such file or directory' 错误
- 避免 Gradio 临时文件路径冲突
- 确保文件系统访问安全性
- 提供清晰的用户操作指导
✨ 新的用户流程:
1. 打开页面 → 看到预填充的对话文本
2. 点击'默认音频' → 加载示例音频和参考文本
3. 点击'开始合成' → 生成对话音频
现在用户有两种体验方式:快速体验(默认音频)或自定义(上传音频)!
app.py
CHANGED
|
@@ -199,7 +199,7 @@ def load_scenario_data(scenario_key: str):
|
|
| 199 |
|
| 200 |
|
| 201 |
def load_default_audio():
|
| 202 |
-
"""
|
| 203 |
audio1 = DEFAULT_AUDIO_CONFIG["speaker1"]["audio"]
|
| 204 |
text1 = DEFAULT_AUDIO_CONFIG["speaker1"]["text"]
|
| 205 |
audio2 = DEFAULT_AUDIO_CONFIG["speaker2"]["audio"]
|
|
@@ -213,11 +213,17 @@ def load_default_audio():
|
|
| 213 |
"[S2]是的,让我们开始今天的精彩内容吧!"
|
| 214 |
)
|
| 215 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
return (
|
| 217 |
default_text,
|
| 218 |
-
|
| 219 |
text1,
|
| 220 |
-
|
| 221 |
text2
|
| 222 |
)
|
| 223 |
|
|
@@ -288,9 +294,9 @@ def generate_dialogue_audio(
|
|
| 288 |
if not dialogue_text or not dialogue_text.strip():
|
| 289 |
return None, "❌ 请输入对话文本"
|
| 290 |
|
| 291 |
-
#
|
| 292 |
if not speaker1_audio and not speaker2_audio:
|
| 293 |
-
return None, "
|
| 294 |
|
| 295 |
# 初始化模型,显示进度
|
| 296 |
tokenizer, model, spt, device = initialize_model()
|
|
@@ -459,9 +465,8 @@ def create_space_ui() -> gr.Blocks:
|
|
| 459 |
with gr.Group():
|
| 460 |
gr.Markdown("### 📝 对话文本")
|
| 461 |
|
| 462 |
-
#
|
| 463 |
-
|
| 464 |
-
default_text = default_content[0] if default_content else (
|
| 465 |
"[S1]大家好,欢迎收听今天的节目,我是主播小雨。"
|
| 466 |
"[S2]大家好,我是嘉宾阿明,很高兴和大家见面。"
|
| 467 |
"[S1]今天我们要聊的话题非常有趣,相信大家会喜欢的。"
|
|
@@ -502,37 +507,25 @@ def create_space_ui() -> gr.Blocks:
|
|
| 502 |
with gr.Row():
|
| 503 |
with gr.Group():
|
| 504 |
gr.Markdown("### 🎵 说话者1 (女声)")
|
| 505 |
-
# 设置默认音频和文本,实现开箱即用
|
| 506 |
-
default_audio1 = default_content[1] if len(default_content) > 1 else None
|
| 507 |
-
default_text1 = default_content[2] if len(default_content) > 2 else ""
|
| 508 |
-
|
| 509 |
speaker1_audio = gr.Audio(
|
| 510 |
label="参考音频",
|
| 511 |
-
type="filepath"
|
| 512 |
-
value=default_audio1
|
| 513 |
)
|
| 514 |
speaker1_text = gr.TextArea(
|
| 515 |
label="参考文本",
|
| 516 |
lines=2,
|
| 517 |
-
placeholder="请输入与参考音频内容完全匹配的文本..."
|
| 518 |
-
value=default_text1
|
| 519 |
)
|
| 520 |
with gr.Group():
|
| 521 |
gr.Markdown("### 🎵 说话者2 (男声)")
|
| 522 |
-
# 设置默认音频和文本,实现开箱即用
|
| 523 |
-
default_audio2 = default_content[3] if len(default_content) > 3 else None
|
| 524 |
-
default_text2 = default_content[4] if len(default_content) > 4 else ""
|
| 525 |
-
|
| 526 |
speaker2_audio = gr.Audio(
|
| 527 |
label="参考音频",
|
| 528 |
-
type="filepath"
|
| 529 |
-
value=default_audio2
|
| 530 |
)
|
| 531 |
speaker2_text = gr.TextArea(
|
| 532 |
label="参考文本",
|
| 533 |
lines=2,
|
| 534 |
-
placeholder="请输入与参考音频内容完全匹配的文本..."
|
| 535 |
-
value=default_text2
|
| 536 |
)
|
| 537 |
|
| 538 |
with gr.Group():
|
|
@@ -540,7 +533,7 @@ def create_space_ui() -> gr.Blocks:
|
|
| 540 |
with gr.Row():
|
| 541 |
use_normalize = gr.Checkbox(label="✅ 文本标准化(推荐)", value=True)
|
| 542 |
btn_generate = gr.Button("🎬 开始合成", variant="primary", size="lg")
|
| 543 |
-
gr.Markdown("💡
|
| 544 |
|
| 545 |
# 右侧:输出与说明
|
| 546 |
with gr.Column(scale=2):
|
|
|
|
| 199 |
|
| 200 |
|
| 201 |
def load_default_audio():
|
| 202 |
+
"""加载默认音频和文本,确保音频文件存在"""
|
| 203 |
audio1 = DEFAULT_AUDIO_CONFIG["speaker1"]["audio"]
|
| 204 |
text1 = DEFAULT_AUDIO_CONFIG["speaker1"]["text"]
|
| 205 |
audio2 = DEFAULT_AUDIO_CONFIG["speaker2"]["audio"]
|
|
|
|
| 213 |
"[S2]是的,让我们开始今天的精彩内容吧!"
|
| 214 |
)
|
| 215 |
|
| 216 |
+
# 检查音频文件是否存在,不存在则返回None
|
| 217 |
+
audio1_path = audio1 if os.path.exists(audio1) else None
|
| 218 |
+
audio2_path = audio2 if os.path.exists(audio2) else None
|
| 219 |
+
|
| 220 |
+
print(f"🔍 默认音频检查: audio1={audio1_path}, audio2={audio2_path}")
|
| 221 |
+
|
| 222 |
return (
|
| 223 |
default_text,
|
| 224 |
+
audio1_path,
|
| 225 |
text1,
|
| 226 |
+
audio2_path,
|
| 227 |
text2
|
| 228 |
)
|
| 229 |
|
|
|
|
| 294 |
if not dialogue_text or not dialogue_text.strip():
|
| 295 |
return None, "❌ 请输入对话文本"
|
| 296 |
|
| 297 |
+
# 引导用户上传音频或使用默认音频
|
| 298 |
if not speaker1_audio and not speaker2_audio:
|
| 299 |
+
return None, "💡 请先上传参考音频文件,或点击 '🎧 默认音频' 按钮快速加载示例音频!"
|
| 300 |
|
| 301 |
# 初始化模型,显示进度
|
| 302 |
tokenizer, model, spt, device = initialize_model()
|
|
|
|
| 465 |
with gr.Group():
|
| 466 |
gr.Markdown("### 📝 对话文本")
|
| 467 |
|
| 468 |
+
# 预填充默认对话文本,实现开箱即用
|
| 469 |
+
default_text = (
|
|
|
|
| 470 |
"[S1]大家好,欢迎收听今天的节目,我是主播小雨。"
|
| 471 |
"[S2]大家好,我是嘉宾阿明,很高兴和大家见面。"
|
| 472 |
"[S1]今天我们要聊的话题非常有趣,相信大家会喜欢的。"
|
|
|
|
| 507 |
with gr.Row():
|
| 508 |
with gr.Group():
|
| 509 |
gr.Markdown("### 🎵 说话者1 (女声)")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 510 |
speaker1_audio = gr.Audio(
|
| 511 |
label="参考音频",
|
| 512 |
+
type="filepath"
|
|
|
|
| 513 |
)
|
| 514 |
speaker1_text = gr.TextArea(
|
| 515 |
label="参考文本",
|
| 516 |
lines=2,
|
| 517 |
+
placeholder="请输入与参考音频内容完全匹配的文本..."
|
|
|
|
| 518 |
)
|
| 519 |
with gr.Group():
|
| 520 |
gr.Markdown("### 🎵 说话者2 (男声)")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 521 |
speaker2_audio = gr.Audio(
|
| 522 |
label="参考音频",
|
| 523 |
+
type="filepath"
|
|
|
|
| 524 |
)
|
| 525 |
speaker2_text = gr.TextArea(
|
| 526 |
label="参考文本",
|
| 527 |
lines=2,
|
| 528 |
+
placeholder="请输入与参考音频内容完全匹配的文本..."
|
|
|
|
| 529 |
)
|
| 530 |
|
| 531 |
with gr.Group():
|
|
|
|
| 533 |
with gr.Row():
|
| 534 |
use_normalize = gr.Checkbox(label="✅ 文本标准化(推荐)", value=True)
|
| 535 |
btn_generate = gr.Button("🎬 开始合成", variant="primary", size="lg")
|
| 536 |
+
gr.Markdown("💡 **快速体验**: 页面已填充默认对话文本,点击 '🎧 默认音频' 按钮加载参考音频,然后即可开始合成!")
|
| 537 |
|
| 538 |
# 右侧:输出与说明
|
| 539 |
with gr.Column(scale=2):
|