vincenthugging commited on
Commit
81ba8ab
·
1 Parent(s): 88ea080

🔧 修复默认音频文件路径错误

Browse files

🐛 主要修复:
1. **文件路径问题**
- 移除UI初始化时的音频文件预设,避免无效路径
- 修改为只预填充对话文本,音频需要用户主动加载
- 添加音频文件存在性检查和日志输出

2. **用户体验优化**
- 更新提示信息:指导用户点击'默认音频'按钮
- 改进错误提示:友好引导而非简单的错误信息
- 保持开箱即用体验:文本预填充 + 一键音频加载

3. **交互流程调整**
- 页面打开:自动填充对话文本 ✅
- 用户点击'🎧 默认音频':加载参考音频和文本 ✅
- 点击'🎬 开始合成':生成音频 ✅

🎯 解决问题:
- 消除 'No such file or directory' 错误
- 避免 Gradio 临时文件路径冲突
- 确保文件系统访问安全性
- 提供清晰的用户操作指导

✨ 新的用户流程:
1. 打开页面 → 看到预填充的对话文本
2. 点击'默认音频' → 加载示例音频和参考文本
3. 点击'开始合成' → 生成对话音频

现在用户有两种体验方式:快速体验(默认音频)或自定义(上传音频)!

Files changed (1) hide show
  1. app.py +18 -25
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
- audio1 if os.path.exists(audio1) else None,
219
  text1,
220
- audio2 if os.path.exists(audio2) else None,
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
- default_content = load_default_audio()
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):