Commit
·
c78a910
1
Parent(s):
34d2a8c
✨ 美化UI并完善场景加载功能
Browse files🎨 UI Enhancement:
- 现代化渐变设计与动画效果
- 响应式布局,支持大屏幕显示
- 改进按钮样式与交互体验
- 美化说话者区域布局
🚀 Feature Enhancement:
- 集成JSON场景文件与默认配置
- 场景选择自动加载对应音频和文本
- 新增'默认音频'快速加载功能
- 确保音频文件与文本严格一一对应
📦 Structure Improvement:
- 统一场景配置管理
- 增强错误处理与用户反馈
- 优化文件路径处理逻辑
- 完善使用说明与提示信息
🎯 User Experience:
- 一键加载预设场景(科技、教育、生活等6个场景)
- 智能路径解析,自动查找音频文件
- 详细的操作指南与质量建议
- app.py +252 -26
- examples/zh_spk1_moon.wav +3 -0
- examples/zh_spk2_moon.wav +3 -0
- scenarios/健康播客_运动健身.jsonl +8 -0
- scenarios/商业播客_创业经验.jsonl +8 -0
- scenarios/心理播客_情绪管理.jsonl +8 -0
- scenarios/教育播客_学习方法.jsonl +8 -0
- scenarios/生活播客_美食文化.jsonl +8 -0
- scenarios/科技播客_AI发展.jsonl +8 -0
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 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
"
|
| 82 |
-
|
| 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:
|
| 205 |
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 206 |
-
padding:
|
| 207 |
-
border-radius:
|
| 208 |
color: white;
|
| 209 |
-
box-shadow: 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 210 |
}
|
| 211 |
.section {
|
| 212 |
background: #f8fafc;
|
| 213 |
-
padding:
|
| 214 |
-
border-radius:
|
| 215 |
border: 1px solid #e2e8f0;
|
| 216 |
-
margin-bottom:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
}
|