File size: 4,011 Bytes
774228a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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 介面中的相關部分 ---