import os import datetime import shutil import gradio as gr import tempfile # 假設這是用於處理臨時檔案的庫 # --- 自動儲存設定 --- # 儲存上傳的參考語音檔案的資料夾 SAVE_UPLOADED_REFERENCES_DIR = "uploaded_references" # 確保儲存資料夾存在 os.makedirs(SAVE_UPLOADED_REFERENCES_DIR, exist_ok=True) # --- 結束自動儲存設定 --- # --- generate_speech 函數中的相關部分 --- # 假設這是 generate_speech 函數的定義 # def generate_speech(text, language, uploaded_speaker_audio_path): # # ... 其他邏輯 ... # --- 決定使用哪個語音參考檔案 --- speaker_wav_to_use = uploaded_speaker_audio_path # 如果用戶上傳了參考語音,則儲存它 if uploaded_speaker_audio_path: try: timestamp_ref = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # 獲取原始檔案的副檔名,例如 .wav original_ext = os.path.splitext(uploaded_speaker_audio_path)[1] # 構建儲存檔案的名稱,包含時間戳和原始副檔名 saved_ref_file_name = f"{timestamp_ref}_uploaded_ref{original_ext}" # 構建儲存檔案的完整路徑 saved_ref_file_path = os.path.join(SAVE_UPLOADED_REFERENCES_DIR, saved_ref_file_name) # 將上傳的臨時檔案複製到指定的儲存目錄 shutil.copy(uploaded_speaker_audio_path, saved_ref_file_path) print(f"上傳的參考語音已儲存到:{saved_ref_file_path}") except Exception as e: print(f"儲存上傳的參考語音時發生錯誤: {e}") # 即使儲存參考語音失敗,也繼續生成語音 print(f"使用上傳的語音參考檔案: {speaker_wav_to_use}") else: # 如果用戶沒有上傳檔案,則使用預設檔案 # ... 處理預設檔案的邏輯 ... pass # 這裡省略了預設檔案的處理,因為重點是上傳參考語音的儲存 # --- 結束決定 --- # ... 後續的語音生成和生成的語音儲存邏輯 ... # --- 結束 generate_speech 函數中的相關部分 --- # --- 用於查看已上傳參考語音的函數 --- def list_uploaded_reference_files(): """掃描上傳參考語音資料夾,返回所有 .wav 檔案的完整路徑列表。""" ref_files = [] if os.path.exists(SAVE_UPLOADED_REFERENCES_DIR) and os.path.isdir(SAVE_UPLOADED_REFERENCES_DIR): for filename in os.listdir(SAVE_UPLOADED_REFERENCES_DIR): if filename.lower().endswith(".wav"): # 返回完整路徑,以便 Gradio 可以正確顯示和提供下載 ref_files.append(os.path.join(SAVE_UPLOADED_REFERENCES_DIR, filename)) # 按修改時間倒序排列,最新檔案在前 ref_files.sort(key=os.path.getmtime, reverse=True) return ref_files # --- 結束查看已上傳參考語音的函數 --- # --- Gradio 介面中的相關部分 --- # 假設這是 gr.Blocks(title="...") as demo: 內部 # with gr.Blocks(title="Coqui TTS XTTS-v2 語音生成") as demo: # # ... 其他 Tab ... with gr.Tab("查看已上傳參考語音"): gr.Markdown("### 已儲存的上傳參考語音檔案") gr.Markdown("這些是您上傳的語音參考檔案。") saved_uploaded_ref_files_output = gr.File( label="上傳的參考語音檔案", file_count="multiple", # 允許顯示多個檔案 interactive=False # 不允許用戶上傳,只用於顯示和下載 ) refresh_uploaded_ref_button = gr.Button("刷新參考語音列表") # 應用程式載入時,自動載入檔案列表 # demo.load(list_uploaded_reference_files, outputs=[saved_uploaded_ref_files_output]) # 點擊刷新按鈕時,重新載入檔案列表 refresh_uploaded_ref_button.click(list_uploaded_reference_files, outputs=[saved_uploaded_ref_files_output]) # --- 結束 Gradio 介面中的相關部分 ---