diff --git a/app.py b/app.py
index 6768426..7dcadbe 100644
--- a/app.py
+++ b/app.py
@@ -62,11 +62,11 @@ def ui_history_dropdown(select_path: str | None = None) -> dict:
def _voice_player_html(wav_path: str | None) -> str:
- """带播放控件与语速滑块的 HTML 播放器(语速仅影响试听,不改变 WAV 文件)。"""
+ """带播放控件、语速滑块与按语速保存下载的 HTML 播放器。"""
if not wav_path:
return (
'
'
- "
合成完成后可在此试听,拖动下方滑块调节播放语速(0.5x~2.0x)。
"
+ "
合成完成后可在此试听,拖动滑块调节语速(0.5x~2.0x),点「保存」下载。
"
"
"
)
path = Path(wav_path)
@@ -79,18 +79,23 @@ def _voice_player_html(wav_path: str | None) -> str:
name = path.name
src = f"/outputs/{quote(name)}"
return f"""
-
+
🎧 {name}
-
+
-
语速仅用于试听,下载的 WAV 仍为原速。
+
+
试听语速与保存文件一致;「原速下载」获取未变速的原始 WAV。
"""
@@ -203,8 +208,8 @@ def _short_synth_log(msg: str, ok: bool) -> str:
segs = re.search(r"共\s*(\d+)\s*段", msg)
if chars:
seg_note = f",{segs.group(1)} 段拼接" if segs else ""
- return f"✅ 配音完成({chars.group(1)} 字{seg_note})。请用下方播放器试听、调节语速或下载。"
- return "✅ 配音完成。请用下方播放器试听、调节语速或下载。"
+ return f"✅ 配音完成({chars.group(1)} 字{seg_note})。请用下方播放器试听,调节语速后点「保存」下载。"
+ return "✅ 配音完成。请用下方播放器试听,调节语速后点「保存」下载。"
def ui_synth_pending(polished_text: str) -> str:
@@ -423,6 +428,126 @@ PWA_HEAD = """
});
})();
+
"""
MIC_HINT_HTML = """
@@ -1042,6 +1167,29 @@ gradio-app,
font-weight: 600 !important;
min-width: 48px !important;
}
+.tts-action-row {
+ display: flex !important;
+ flex-wrap: wrap !important;
+ align-items: center !important;
+ gap: 10px 12px !important;
+ margin-top: 10px !important;
+}
+.tts-save-btn {
+ color: #ffffff !important;
+ background: #2563eb !important;
+ border: none !important;
+ padding: 8px 14px !important;
+ border-radius: 6px !important;
+ font-size: 0.88rem !important;
+ cursor: pointer !important;
+}
+.tts-save-btn:hover { background: #1d4ed8 !important; }
+.tts-save-btn:disabled { opacity: 0.6 !important; cursor: wait !important; }
+.tts-save-status {
+ color: #86efac !important;
+ font-size: 0.82rem !important;
+ min-width: 80px;
+}
.tts-dl-btn {
color: #ffffff !important;
background: #374151 !important;