Update app.py
Browse files
app.py
CHANGED
@@ -79,37 +79,53 @@ def convert_to_wav(input_path):
|
|
79 |
raise gr.Error("❌ 音訊格式轉換失敗")
|
80 |
|
81 |
def separate_audio(input_audio):
|
82 |
-
"""主處理函式"""
|
83 |
process_id = datetime.now().strftime("%Y%m%d%H%M%S%f")
|
84 |
temp_wav = None
|
85 |
|
86 |
try:
|
87 |
-
|
88 |
-
tmp_dir = "/tmp/gradio_outputs"
|
89 |
-
os.makedirs(tmp_dir, exist_ok=True)
|
90 |
|
91 |
-
#
|
92 |
-
|
93 |
-
|
94 |
-
|
|
|
|
|
|
|
|
|
95 |
|
96 |
-
#
|
|
|
|
|
97 |
outfilename = os.path.join(output_dir, "output.wav")
|
98 |
|
99 |
-
#
|
|
|
100 |
sep_files = dpt_sep_process(temp_wav, model=model, outfilename=outfilename)
|
101 |
|
102 |
-
#
|
103 |
for f in sep_files:
|
104 |
if not os.path.exists(f):
|
105 |
raise gr.Error(f"❌ 缺失輸出檔案: {f}")
|
|
|
106 |
|
|
|
107 |
return sep_files
|
108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
except Exception as e:
|
110 |
-
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
113 |
|
114 |
# 🎯 description 內容(轉為 HTML)
|
115 |
description_html = """
|
|
|
79 |
raise gr.Error("❌ 音訊格式轉換失敗")
|
80 |
|
81 |
def separate_audio(input_audio):
|
|
|
82 |
process_id = datetime.now().strftime("%Y%m%d%H%M%S%f")
|
83 |
temp_wav = None
|
84 |
|
85 |
try:
|
86 |
+
logger.info(f"[{process_id}] 🚀 收到新請求: {input_audio}")
|
|
|
|
|
87 |
|
88 |
+
# 1️⃣ 檢查檔案大小
|
89 |
+
if os.path.getsize(input_audio) > 50 * 1024 * 1024:
|
90 |
+
raise gr.Error("❌ 檔案超過 50MB 限制")
|
91 |
+
|
92 |
+
# 2️⃣ 轉換為標準格式
|
93 |
+
logger.info(f"[{process_id}] 🔁 轉換標準音檔...")
|
94 |
+
temp_wav = convert_to_wav(input_audio)
|
95 |
+
validate_audio(temp_wav)
|
96 |
|
97 |
+
# 3️⃣ 建立固定輸出目錄
|
98 |
+
output_dir = os.path.join("/tmp/gradio_outputs", process_id)
|
99 |
+
os.makedirs(output_dir)
|
100 |
outfilename = os.path.join(output_dir, "output.wav")
|
101 |
|
102 |
+
# 4️⃣ 執行語音分離
|
103 |
+
logger.info(f"[{process_id}] 🧠 開始分離...")
|
104 |
sep_files = dpt_sep_process(temp_wav, model=model, outfilename=outfilename)
|
105 |
|
106 |
+
# 5️⃣ 驗證輸出
|
107 |
for f in sep_files:
|
108 |
if not os.path.exists(f):
|
109 |
raise gr.Error(f"❌ 缺失輸出檔案: {f}")
|
110 |
+
validate_audio(f)
|
111 |
|
112 |
+
logger.info(f"[{process_id}] ✅ 處理完成")
|
113 |
return sep_files
|
114 |
|
115 |
+
except RuntimeError as e:
|
116 |
+
if "CUDA out of memory" in str(e):
|
117 |
+
logger.error(f"[{process_id}] 💥 GPU 記憶體不足")
|
118 |
+
raise gr.Error("⚠️ 請縮短音檔長度") from e
|
119 |
+
else:
|
120 |
+
raise
|
121 |
except Exception as e:
|
122 |
+
logger.error(f"[{process_id}] ❌ 處理失敗: {str(e)}\n{traceback.format_exc()}")
|
123 |
+
raise gr.Error(f"⚠️ 處理失敗: {str(e)}") from e
|
124 |
+
finally:
|
125 |
+
# 清理臨時檔案
|
126 |
+
if temp_wav and os.path.exists(temp_wav):
|
127 |
+
os.unlink(temp_wav)
|
128 |
+
logger.info(f"[{process_id}] 🧹 臨時檔案已清理")
|
129 |
|
130 |
# 🎯 description 內容(轉為 HTML)
|
131 |
description_html = """
|