Update app.py
Browse files
app.py
CHANGED
|
@@ -105,7 +105,7 @@ os.makedirs(SAVE_DIR, exist_ok=True)
|
|
| 105 |
# --- 結束自動儲存設定 ---
|
| 106 |
|
| 107 |
|
| 108 |
-
def generate_speech(text, language, uploaded_speaker_audio_path):
|
| 109 |
"""
|
| 110 |
根據輸入文字、語言和語音參考檔案生成語音。
|
| 111 |
如果用戶上傳了檔案,則使用上傳的檔案;否則使用預設的 speaker.wav。
|
|
@@ -165,31 +165,62 @@ def generate_speech(text, language, uploaded_speaker_audio_path): # 參數名稱
|
|
| 165 |
os.remove(output_file) # 清理臨時檔案
|
| 166 |
return None, f"生成語音失敗: {e}"
|
| 167 |
|
| 168 |
-
#
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
gr.
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
# 啟動 Gradio 應用
|
| 194 |
if __name__ == "__main__":
|
| 195 |
-
|
|
|
|
| 105 |
# --- 結束自動儲存設定 ---
|
| 106 |
|
| 107 |
|
| 108 |
+
def generate_speech(text, language, uploaded_speaker_audio_path):
|
| 109 |
"""
|
| 110 |
根據輸入文字、語言和語音參考檔案生成語音。
|
| 111 |
如果用戶上傳了檔案,則使用上傳的檔案;否則使用預設的 speaker.wav。
|
|
|
|
| 165 |
os.remove(output_file) # 清理臨時檔案
|
| 166 |
return None, f"生成語音失敗: {e}"
|
| 167 |
|
| 168 |
+
# --- 新增:查看已儲存語音的功能 ---
|
| 169 |
+
def list_saved_audio_files():
|
| 170 |
+
"""掃描儲存資料夾,返回所有 .wav 檔案的完整路徑列表。"""
|
| 171 |
+
audio_files = []
|
| 172 |
+
if os.path.exists(SAVE_DIR) and os.path.isdir(SAVE_DIR):
|
| 173 |
+
for filename in os.listdir(SAVE_DIR):
|
| 174 |
+
if filename.lower().endswith(".wav"):
|
| 175 |
+
audio_files.append(os.path.join(SAVE_DIR, filename))
|
| 176 |
+
audio_files.sort(key=os.path.getmtime, reverse=True) # 按修改時間倒序排列,最新檔案在前
|
| 177 |
+
return audio_files
|
| 178 |
+
# --- 結束新增 ---
|
| 179 |
+
|
| 180 |
+
# Gradio 介面配置 (使用 gr.Blocks 實現多 Tab 介面)
|
| 181 |
+
with gr.Blocks(title="Coqui TTS XTTS-v2 語音生成") as demo:
|
| 182 |
+
gr.Markdown("# Coqui TTS XTTS-v2 語音生成 (CPU)")
|
| 183 |
+
gr.Markdown("此演示使用 CPU 運行,請注意 XTTS-v2 在 CPU 上運行會非常慢。您可以上傳自己的語音,或使用預設語音。生成的語音將自動儲存到 Space 專案中。")
|
| 184 |
+
|
| 185 |
+
with gr.Tab("語音生成"):
|
| 186 |
+
with gr.Row():
|
| 187 |
+
with gr.Column():
|
| 188 |
+
text_input = gr.Textbox(lines=5, label="輸入文字", placeholder="請在這裡輸入你想要轉換成語音的文字...")
|
| 189 |
+
language_dropdown = gr.Dropdown(choices=SUPPORTED_LANGUAGES, label="選擇語言", value="en")
|
| 190 |
+
speaker_audio_upload = gr.Audio(
|
| 191 |
+
type="filepath",
|
| 192 |
+
label="上傳語音參考檔案 (WAV) (可選)",
|
| 193 |
+
sources=["microphone", "upload"],
|
| 194 |
+
# 移除 waveform_options 和 info 參數以避免 Gradio 版本兼容性問題
|
| 195 |
+
)
|
| 196 |
+
generate_button = gr.Button("生成語音")
|
| 197 |
+
with gr.Column():
|
| 198 |
+
output_audio = gr.Audio(label="生成的語音", type="filepath")
|
| 199 |
+
status_textbox = gr.Textbox(label="狀態")
|
| 200 |
+
|
| 201 |
+
# 將生成按鈕與 generate_speech 函數綁定
|
| 202 |
+
generate_button.click(
|
| 203 |
+
fn=generate_speech,
|
| 204 |
+
inputs=[text_input, language_dropdown, speaker_audio_upload],
|
| 205 |
+
outputs=[output_audio, status_textbox]
|
| 206 |
+
)
|
| 207 |
+
|
| 208 |
+
with gr.Tab("查看已儲存語音"):
|
| 209 |
+
gr.Markdown("### 已儲存的語音檔案")
|
| 210 |
+
gr.Markdown("請注意:每次生成語音並儲存後,Hugging Face Space 會自動重啟,因此您可能需要點擊刷新按鈕來查看最新檔案。")
|
| 211 |
+
|
| 212 |
+
saved_files_output = gr.File(
|
| 213 |
+
label="已儲存的語音檔案",
|
| 214 |
+
file_count="multiple", # 允許顯示多個檔案
|
| 215 |
+
interactive=False # 不允許用戶上傳,只用於顯示和下載
|
| 216 |
+
)
|
| 217 |
+
refresh_button = gr.Button("刷新檔案列表")
|
| 218 |
+
|
| 219 |
+
# 應用程式載入時,自動載入檔案列表
|
| 220 |
+
demo.load(list_saved_audio_files, outputs=[saved_files_output])
|
| 221 |
+
# 點擊刷新按鈕時,重新載入檔案列表
|
| 222 |
+
refresh_button.click(list_saved_audio_files, outputs=[saved_files_output])
|
| 223 |
|
| 224 |
# 啟動 Gradio 應用
|
| 225 |
if __name__ == "__main__":
|
| 226 |
+
demo.launch()
|