vincenthugging commited on
Commit
c78a910
·
1 Parent(s): 34d2a8c

✨ 美化UI并完善场景加载功能

Browse files

🎨 UI Enhancement:
- 现代化渐变设计与动画效果
- 响应式布局,支持大屏幕显示
- 改进按钮样式与交互体验
- 美化说话者区域布局

🚀 Feature Enhancement:
- 集成JSON场景文件与默认配置
- 场景选择自动加载对应音频和文本
- 新增'默认音频'快速加载功能
- 确保音频文件与文本严格一一对应

📦 Structure Improvement:
- 统一场景配置管理
- 增强错误处理与用户反馈
- 优化文件路径处理逻辑
- 完善使用说明与提示信息

🎯 User Experience:
- 一键加载预设场景(科技、教育、生活等6个场景)
- 智能路径解析,自动查找音频文件
- 详细的操作指南与质量建议

app.py CHANGED
@@ -44,6 +44,52 @@ from generation_utils import load_model, process_batch
44
  SYSTEM_PROMPT = (
45
  "You are a speech synthesizer that generates natural, realistic, and human-like conversational audio from dialogue text."
46
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  MODEL_PATH = "fnlp/MOSS-TTSD-v0.5"
48
  SPT_CONFIG_PATH = "XY_Tokenizer/config/xy_tokenizer_config.yaml"
49
 
@@ -72,16 +118,105 @@ device = None
72
  # =========================
73
 
74
  def get_scenario_examples():
75
- return {
76
- "科技播客:AI发展": {
77
- "text": "[S1]大家好,欢迎收听今天的《AI前沿》播客。[S2]你好,我是嘉宾阿明。[S1]今天我们来聊聊最新的语音合成技术,特别是MOSS-TTSD这个项目。[S2]是的,这个开源项目确实很有意思,它能生成非常自然的对话音频。[S1]而且支持零样本语音克隆,只需要很短的参考音频就能复制音色。[S2]这对内容创作者来说是个巨大的福音,可以大大提高播客制作效率。",
78
- "description": "探讨人工智能发展趋势,专业而富有前瞻性的科技对话",
79
- },
80
- "教育播客:学习方法": {
81
- "text": "[S1]欢迎来到《学习有道》栏目,我是主播小雨。[S2]大家好,我是学习方法专家李老师。[S1]李老师,很多同学想知道如何提高学习效率,您有什么建议吗?[S2]首先要明确一点,学习不是时间的堆砌,而是方法的运用。我建议大家先制定明确的学习目标。[S1]具体应该怎么制定呢?[S2]目标要具体、可衡量、有时限。比如说,这周我要掌握英语的过去时态,而不是简单地说我要学好英语。",
82
- "description": "分享有效学习方法,教育专家的实用指导",
83
- },
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
 
87
  def initialize_model():
@@ -199,21 +334,70 @@ def generate_dialogue_audio(
199
 
200
  def create_space_ui() -> gr.Blocks:
201
  custom_css = """
 
 
 
 
 
202
  .header {
203
  text-align: center;
204
- margin-bottom: 16px;
205
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
206
- padding: 18px;
207
- border-radius: 12px;
208
  color: white;
209
- box-shadow: 0 4px 15px rgba(0,0,0,0.08);
 
 
 
 
 
 
 
 
 
 
210
  }
211
  .section {
212
  background: #f8fafc;
213
- padding: 16px;
214
- border-radius: 10px;
215
  border: 1px solid #e2e8f0;
216
- margin-bottom: 12px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  }
218
  """
219
 
@@ -246,13 +430,15 @@ def create_space_ui() -> gr.Blocks:
246
 
247
  with gr.Group():
248
  gr.Markdown("### 🚀 快速操作")
 
 
 
 
 
 
249
  with gr.Row():
250
- scenario_dropdown = gr.Dropdown(
251
- choices=list(get_scenario_examples().keys()),
252
- value="科技播客:AI发展",
253
- label="🎭 选择场景",
254
- )
255
  btn_load_scenario = gr.Button("📥 加载场景", variant="secondary")
 
256
 
257
  with gr.Row():
258
  with gr.Group():
@@ -316,15 +502,55 @@ def create_space_ui() -> gr.Blocks:
316
 
317
  # ===== 交互逻辑 =====
318
  def on_load_scenario(name: str):
 
319
  scenarios = get_scenario_examples()
320
- if name in scenarios:
321
- return scenarios[name]["text"]
322
- return f"❌ 无法加载场景: {name}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
 
324
  btn_load_scenario.click(
325
  fn=on_load_scenario,
326
  inputs=[scenario_dropdown],
327
- outputs=[dialogue_text],
 
 
 
 
 
328
  )
329
 
330
  btn_generate.click(
 
44
  SYSTEM_PROMPT = (
45
  "You are a speech synthesizer that generates natural, realistic, and human-like conversational audio from dialogue text."
46
  )
47
+
48
+ # 场景配置映射
49
+ SCENARIO_CONFIG = {
50
+ "科技播客_AI发展": {
51
+ "title": "🤖 科技播客 - AI发展趋势",
52
+ "description": "探讨人工智能的最新发展与未来趋势",
53
+ "file": "scenarios/科技播客_AI发展.jsonl"
54
+ },
55
+ "教育播客_学习方法": {
56
+ "title": "📚 教育播客 - 高效学习方法",
57
+ "description": "分享科学的学习方法与技巧",
58
+ "file": "scenarios/教育播客_学习方法.jsonl"
59
+ },
60
+ "生活播客_美食文化": {
61
+ "title": "🍜 生活播客 - 美食文化探索",
62
+ "description": "品味各地美食文化的魅力",
63
+ "file": "scenarios/生活播客_美食文化.jsonl"
64
+ },
65
+ "商业播客_创业经验": {
66
+ "title": "💼 商业播客 - 创业经验分享",
67
+ "description": "创业路上的经验教训与心得",
68
+ "file": "scenarios/商业播客_创业经验.jsonl"
69
+ },
70
+ "健康播客_运动健身": {
71
+ "title": "🏃 健康播客 - 运动健身指南",
72
+ "description": "科学健身与健康生活方式",
73
+ "file": "scenarios/健康播客_运动健身.jsonl"
74
+ },
75
+ "心理播客_情绪管理": {
76
+ "title": "🧠 心理播客 - 情绪管理技巧",
77
+ "description": "探索情绪管理与心理健康",
78
+ "file": "scenarios/心理播客_情绪管理.jsonl"
79
+ }
80
+ }
81
+
82
+ # 默认音频配置
83
+ DEFAULT_AUDIO_CONFIG = {
84
+ "speaker1": {
85
+ "audio": "examples/zh_spk1_moon.wav",
86
+ "text": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。"
87
+ },
88
+ "speaker2": {
89
+ "audio": "examples/zh_spk2_moon.wav",
90
+ "text": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
91
+ }
92
+ }
93
  MODEL_PATH = "fnlp/MOSS-TTSD-v0.5"
94
  SPT_CONFIG_PATH = "XY_Tokenizer/config/xy_tokenizer_config.yaml"
95
 
 
118
  # =========================
119
 
120
  def get_scenario_examples():
121
+ """获取所有可用的场景示例,整合 JSON 文件和默认配置"""
122
+ scenarios = {}
123
+
124
+ # 加载 JSON 文件场景
125
+ for key, config in SCENARIO_CONFIG.items():
126
+ try:
127
+ if os.path.exists(config["file"]):
128
+ with open(config["file"], "r", encoding="utf-8") as f:
129
+ data = json.load(f)
130
+ scenarios[config["title"]] = {
131
+ "text": data.get("text", ""),
132
+ "description": config["description"],
133
+ "audio1": data.get("prompt_audio_speaker1", ""),
134
+ "text1": data.get("prompt_text_speaker1", ""),
135
+ "audio2": data.get("prompt_audio_speaker2", ""),
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
+ # 添加默认示例(如果 JSON 文件不可用)
143
+ if not scenarios:
144
+ scenarios = {
145
+ "🎧 默认示例": {
146
+ "text": (
147
+ "[S1]大家好,欢迎收听今天的节目,我是主播小雨。"
148
+ "[S2]大家好,我是嘉宾阿明,很高兴和大家见面。"
149
+ "[S1]今天我们要聊的���题非常有趣,相信大家会喜欢的。"
150
+ "[S2]是的,让我们开始今天的精彩内容吧!"
151
+ ),
152
+ "description": "默认的示例对话,适合快速体验",
153
+ "audio1": DEFAULT_AUDIO_CONFIG["speaker1"]["audio"],
154
+ "text1": DEFAULT_AUDIO_CONFIG["speaker1"]["text"],
155
+ "audio2": DEFAULT_AUDIO_CONFIG["speaker2"]["audio"],
156
+ "text2": DEFAULT_AUDIO_CONFIG["speaker2"]["text"],
157
+ "base_path": "",
158
+ }
159
+ }
160
+
161
+ return scenarios
162
+
163
+
164
+ def load_scenario_data(scenario_key: str):
165
+ """加载场景数据,确保音频和文本一一对应"""
166
+ if scenario_key not in SCENARIO_CONFIG:
167
+ return None, None, None, None, None
168
+
169
+ try:
170
+ scenario_file = SCENARIO_CONFIG[scenario_key]["file"]
171
+ if not os.path.exists(scenario_file):
172
+ return None, None, None, None, None
173
+
174
+ with open(scenario_file, "r", encoding="utf-8") as f:
175
+ data = json.load(f)
176
+
177
+ # 确保音频文件路径正确
178
+ audio1_path = data.get("prompt_audio_speaker1", "")
179
+ audio2_path = data.get("prompt_audio_speaker2", "")
180
+
181
+ if audio1_path and not audio1_path.startswith("/"):
182
+ audio1_path = os.path.join(data.get("base_path", ""), audio1_path)
183
+ if audio2_path and not audio2_path.startswith("/"):
184
+ audio2_path = os.path.join(data.get("base_path", ""), audio2_path)
185
+
186
+ return (
187
+ data.get("text", ""),
188
+ audio1_path if os.path.exists(audio1_path) else None,
189
+ data.get("prompt_text_speaker1", ""),
190
+ audio2_path if os.path.exists(audio2_path) else None,
191
+ data.get("prompt_text_speaker2", "")
192
+ )
193
+ except Exception as e:
194
+ print(f"❌ 加载场景失败: {e}")
195
+ return None, None, None, None, None
196
+
197
+
198
+ def load_default_audio():
199
+ """加载默认音频和文本"""
200
+ audio1 = DEFAULT_AUDIO_CONFIG["speaker1"]["audio"]
201
+ text1 = DEFAULT_AUDIO_CONFIG["speaker1"]["text"]
202
+ audio2 = DEFAULT_AUDIO_CONFIG["speaker2"]["audio"]
203
+ text2 = DEFAULT_AUDIO_CONFIG["speaker2"]["text"]
204
+
205
+ # 默认对话文本
206
+ default_text = (
207
+ "[S1]大家好,欢迎收听今天的节目,我是主播小雨。"
208
+ "[S2]大家好,我是嘉宾阿明,很高兴和大家见面。"
209
+ "[S1]今天我们要聊的话题非常有趣,相信大家会喜欢的。"
210
+ "[S2]是的,让我们开始今天的精彩内容吧!"
211
+ )
212
+
213
+ return (
214
+ default_text,
215
+ audio1 if os.path.exists(audio1) else None,
216
+ text1,
217
+ audio2 if os.path.exists(audio2) else None,
218
+ text2
219
+ )
220
 
221
 
222
  def initialize_model():
 
334
 
335
  def create_space_ui() -> gr.Blocks:
336
  custom_css = """
337
+ .gradio-container {
338
+ max-width: 1400px !important;
339
+ margin: 0 auto !important;
340
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
341
+ }
342
  .header {
343
  text-align: center;
344
+ margin-bottom: 2rem;
345
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
346
+ padding: 2.5rem;
347
+ border-radius: 20px;
348
  color: white;
349
+ box-shadow: 0 10px 30px rgba(0,0,0,0.2);
350
+ }
351
+ .header h1 {
352
+ font-size: 2.5rem;
353
+ margin-bottom: 0.5rem;
354
+ font-weight: 700;
355
+ }
356
+ .header p {
357
+ font-size: 1.2rem;
358
+ opacity: 0.9;
359
+ margin: 0;
360
  }
361
  .section {
362
  background: #f8fafc;
363
+ padding: 1.5rem;
364
+ border-radius: 15px;
365
  border: 1px solid #e2e8f0;
366
+ margin-bottom: 1rem;
367
+ box-shadow: 0 2px 10px rgba(0,0,0,0.05);
368
+ }
369
+ .quick-btn {
370
+ background: linear-gradient(45deg, #FF6B6B, #4ECDC4) !important;
371
+ border: none !important;
372
+ color: white !important;
373
+ font-weight: 600 !important;
374
+ border-radius: 10px !important;
375
+ transition: all 0.3s ease !important;
376
+ }
377
+ .quick-btn:hover {
378
+ transform: translateY(-2px) !important;
379
+ box-shadow: 0 5px 15px rgba(0,0,0,0.2) !important;
380
+ }
381
+ .generate-btn {
382
+ background: linear-gradient(45deg, #667eea, #764ba2) !important;
383
+ border: none !important;
384
+ color: white !important;
385
+ font-weight: 700 !important;
386
+ font-size: 1.1rem !important;
387
+ border-radius: 15px !important;
388
+ padding: 1rem 2rem !important;
389
+ width: 100% !important;
390
+ transition: all 0.3s ease !important;
391
+ }
392
+ .generate-btn:hover {
393
+ transform: translateY(-3px) !important;
394
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4) !important;
395
+ }
396
+ .speaker-section {
397
+ background: linear-gradient(135deg, #667eea15, #764ba215);
398
+ padding: 1.5rem;
399
+ border-radius: 15px;
400
+ border: 2px solid #667eea20;
401
  }
402
  """
403
 
 
430
 
431
  with gr.Group():
432
  gr.Markdown("### 🚀 快速操作")
433
+ scenario_dropdown = gr.Dropdown(
434
+ choices=list(get_scenario_examples().keys()),
435
+ value=None,
436
+ label="🎭 选择场景",
437
+ info="选择一个预设场景,自动填充对话文本和参考音频"
438
+ )
439
  with gr.Row():
 
 
 
 
 
440
  btn_load_scenario = gr.Button("📥 加载场景", variant="secondary")
441
+ btn_load_default = gr.Button("🎧 默认音频", variant="secondary")
442
 
443
  with gr.Row():
444
  with gr.Group():
 
502
 
503
  # ===== 交互逻辑 =====
504
  def on_load_scenario(name: str):
505
+ """加载选中的场景,包括文本和音频"""
506
  scenarios = get_scenario_examples()
507
+ if name not in scenarios:
508
+ return (
509
+ f"❌ 无法加载场景: {name}",
510
+ None, "", None, ""
511
+ )
512
+
513
+ scenario = scenarios[name]
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
+ return load_default_audio()
544
 
545
  btn_load_scenario.click(
546
  fn=on_load_scenario,
547
  inputs=[scenario_dropdown],
548
+ outputs=[dialogue_text, speaker1_audio, speaker1_text, speaker2_audio, speaker2_text],
549
+ )
550
+
551
+ btn_load_default.click(
552
+ fn=on_load_default,
553
+ outputs=[dialogue_text, speaker1_audio, speaker1_text, speaker2_audio, speaker2_text],
554
  )
555
 
556
  btn_generate.click(
examples/zh_spk1_moon.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dd95ddcb03537bc04d19a6e5ab56b2694c9d65324c231c6676569877dc005ace
3
+ size 457956
examples/zh_spk2_moon.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ad41d9c8967148fd0875967c1498c7aaab7dfdd919d7e7e063ae91e7a4a1d19
3
+ size 414720
scenarios/健康播客_运动健身.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]欢迎来到《健康生活家》,我是营养师小慧。[S2]我是健身教练大强。今天我们来聊聊如何建立科学的运动习惯。[S1]现代人工作忙碌,很多人想运动但总是坚持不下来。大强教练,你有什么经验分享吗?[S2]首先要设定合理的目标。很多人一开始就制定过高的目标,比如每天跑步一小时,这样很容易放弃。建议从每天15分钟开始。[S1]确实,循序渐进很重要。我从营养角度补充一下,运动前后的饮食也很关键。[S2]对!运动前1-2小时吃点容易消化的碳水化合物,比如香蕉、燕麦,为身体提供能量。运动后要及时补充蛋白质帮助肌肉恢复。[S1]还有很重要的一点是选择适合自己的运动方式。不一定要去健身房,在家也能很好地锻炼。[S2]没错!比如深蹲、俯卧撑、平板支撑这些徒手动作,就能很好地锻炼全身肌肉。关键是要保持规律性。[S1]对于初学者,我建议一周3-4次,每次30分钟左右比较合适。[S2]还要注意倾听身体的声音,适度休息也是训练的一部分。过度训练反而会带来伤害。[S1]运动不仅能改善身体健康,还能释放压力,改善心情。[S2]是的,运动是最好的天然抗抑郁药。希望大家都能动起来,拥抱健康生活!",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }
scenarios/商业播客_创业经验.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]大家好,欢迎收听《创业观察》,我是主持人李敏。[S2]我是创业导师张总。今天我们来聊聊初创企业如何度过前期的困难阶段。[S1]很多创业者都会遇到资金紧张、团队磨合、市场验证等挑战。张总,您当年是怎么应对的?[S2]创业初期确实很艰难。我的经验是要专注核心问题,不要被太多琐事分散精力。首先要确保产品真正解决了用户的痛点。[S1]产品市场适配确实很关键。那么在团队建设方面,您有什么建议?[S2]早期团队要精而不在多。找到与你价值观一致、能力互补的合伙人比招一堆员工更重要。而且要建立清晰的股权分配和决策机制。[S1]说到资金,很多创业者都为融资发愁。[S2]我建议创业者要学会精打细算,延长资金使用时间。不一定非要拿投资,可以考虑先做到盈亏平衡,再谈增长。[S1]这个观点很实用。那么如何判断一个创业项目是否值得坚持呢?[S2]关键看三个指标:用户是否真正需要你的产品、是否愿意为此付费、市场规模是否足够大。如果这三点都成立,就值得坚持。[S1]对于正在创业路上的朋友,您还有什么寄语吗?[S2]创业是一场马拉松,不是短跑。保持初心,持续学习,相信时间的力量。成功往往在坚持不下去的时候再坚持一下。[S1]感谢张总的精彩分享。创业不易,但梦想值得追求。[S2]希望所有创业者都能在这条路上收获成长和成功!",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }
scenarios/心理播客_情绪管理.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]大家好,欢迎来到《心灵驿站》,我是心理咨询师小晴。[S2]我是情绪管理专家老李。今天我们来聊聊如何在快节奏的生活中管理好自己的情绪。[S1]现代人面临各种压力,工作、学习、人际关系等,情绪波动很正常。但如何让情绪成为我们的朋友而不是敌人呢?[S2]首先要学会认识和接纳自己的情绪。情绪没有好坏之分,愤怒、焦虑、悲伤都是正常的心理反应,关键是如何恰当地表达和处理。[S1]很多人习惯压抑负面情绪,觉得这样就能解决问题。[S2]这其实是不健康的。压抑的情绪就像弹簧,压得越紧反弹得越厉害。我们要学会倾听情绪,理解它想传达的信息。[S1]那么具体应该怎么做呢?[S2]我推荐一个简单的方法:STOP技术。S是停下来,T是深呼吸,O是观察自己的情绪和身体感受,P是暂停反应,选择合适的应对方式。[S1]这个方法很实用。我还想补充一点,就是要培养情绪表达的能力。很多人不知道如何准确表达自己的感受。[S2]对,我们从小被教育要理性,却很少学习如何表达情感。其实,用\"我感到...\"而不是\"你让我...\"的句式,能够更好地表达情绪而不伤害关系。[S1]运动和冥想也是很好的情绪调节方法。[S2]确实,运动能释放内啡肽,改善心情;冥想能让我们更好地觉察当下,不被情绪绑架。每天十分钟的正念练习就很有效果。[S1]最重要的是要记住,情绪管理是一个长期的过程,不要期望一蹴而就。[S2]对,要有耐心和自我慈悲。每个人都在学习如何更好地生活,给自己一些时间和空间成长。[S1]希望大家都能和自己的情绪和谐共处,过上更平衡的生活。",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }
scenarios/教育播客_学习方法.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]大家好,欢迎收听《学习有道》,我是教育咨询师林老师。[S2]我是学习方法专家王老师。今天我们来聊聊如何提高学习效率。[S1]现在很多学生都面临学习压力大、效率低的问题。王老师,你有什么建议吗?[S2]首先要明确一个概念,学习不是时间的堆砌,而是方法的艺术。我推荐使用番茄工作法,25分钟专注学习,5分钟休息。[S1]这个方法确实很实用。我还想补充一点,就是要学会主动学习,不要被动接受知识。[S2]没错,比如在学习新概念时,要学会提问:这是什么?为什么是这样?可以怎么应用?这样的深度思考能让记忆更持久。[S1]还有一个重要的点是要建立知识之间的联系,构建知识网络。[S2]对,孤立的知识点很容易遗忘,但形成体系的知识会相互强化,形成长期记忆。[S1]那么对于不同学科,有没有特殊的学习技巧呢?[S2]当然有。理科重在理解逻辑,要多做练习巩固;文科重在理解背景,要多阅读拓展视野。[S1]好的建议!希望听众朋友们都能找到适合自己的学习方法。[S2]学习是一生的事业,方法对了,事半功倍。我们下期再见!",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }
scenarios/生活播客_美食文化.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]各位听众朋友大家好,欢迎收听《舌尖上的故事》,我是美食博主小雪。[S2]我是文化学者老赵。今天我们来聊聊中华美食背后的文化故事。[S1]中国菜讲究色香味俱全,每道菜都有它的历史和故事。老赵,您觉得中华美食的精髓是什么?[S2]我认为是天人合一的哲学思想。中华美食不仅仅是填饱肚子,更是一种生活艺术,体现了中国人对自然、对生活的理解。[S1]确实,比如说八大菜系,每个菜系都有其地域特色和文化内涵。[S2]对,川菜的麻辣体现了巴蜀人民的豪爽性格,粤菜的清淡反映了岭南地区的气候特点,鲁菜的厚重则展现了齐鲁大地的文化底蕴。[S1]说到制作工艺,中华美食也很有讲究。比如刀工、火候、调味,每一个环节都是技艺的体现。[S2]这就是工匠精神的体现。一道看似简单的家常菜,背后可能有着几百年的传承和无数次的改良。比如红烧肉,各地都有不同的做法。[S1]对,而且中华美食还讲究药食同源,很多食材既是美味也是良药。[S2]像枸杞、山药、桂圆等,既能做菜也能调理身体。这体现了中国人的养生智慧,追求的是身心和谐。[S1]现在随着全球化,中华美食也在传播到世界各地。[S2]是的,但我们也要思考如何在传播中保持本味,既要适应当地口味,又不失传统精髓。[S1]美食是文化的载体,也是情感的纽带。每当我们品尝家乡菜时,都会想起家的温暖。[S2]民以食为天,食以文为魂。希望大家在享受美食的同时,也能感受到其中的文化韵味。",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }
scenarios/科技播客_AI发展.jsonl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_path": "examples",
3
+ "text": "[S1]欢迎收听《科技前沿》,我是主播小雨。今天我们来聊聊人工智能的最新发展。[S2]大家好,我是科技评论员阿明。最近AI领域确实发生了很多激动人心的变化。[S1]是的,特别是大语言模型和多模态AI的突破。你觉得哪个方向最值得关注?[S2]我觉得AI的实际应用落地是最值得关注的。比如在医疗、教育、创意设计等领域,AI正在真正改变我们的工作方式。[S1]确实,就拿内容创作来说,现在的AI已经能够生成非常自然的语音、图像和文本了。[S2]对,就像我们现在使用的语音合成技术,已经能够生成接近真人的对话效果。这对播客制作、有声读物等领域是革命性的。[S1]不过我们也要思考AI发展带来的挑战,比如就业问题、隐私安全等。[S2]是的,这需要我们在享受AI便利的同时,也要建立相应的规范和伦理框架。[S1]好的,今天的讨论就到这里,感谢大家收听。[S2]我们下期再见!",
4
+ "prompt_audio_speaker1": "zh_spk1_moon.wav",
5
+ "prompt_text_speaker1": "周一到周五,每天早晨七点半到九点半的直播片段。言下之意呢,就是废话有点多,大家也别嫌弃,因为这都是直播间最真实的状态了。",
6
+ "prompt_audio_speaker2": "zh_spk2_moon.wav",
7
+ "prompt_text_speaker2": "如果大家想听到更丰富更及时的直播内容,记得在周一到周五准时进入直播间,和大家一起畅聊新消费新科技新趋势。"
8
+ }