ASesYusuf1 commited on
Commit
610ed41
·
verified ·
1 Parent(s): 865a9b2

Update processing.py

Browse files
Files changed (1) hide show
  1. processing.py +72 -10
processing.py CHANGED
@@ -53,7 +53,7 @@ def extract_model_name(full_model_string):
53
  cleaned = cleaned[len(prefix):]
54
  return cleaned.strip()
55
 
56
- def run_command_and_process_files(model_type, config_path, start_check_point, INPUT_DIR, OUTPUT_DIR, extract_instrumental, use_tta, demud_phaseremix_inst, clean_model):
57
  try:
58
  # inference.py'nin tam yolunu kullan
59
  cmd_parts = [
@@ -81,12 +81,30 @@ def run_command_and_process_files(model_type, config_path, start_check_point, IN
81
  universal_newlines=True
82
  )
83
 
 
 
 
 
84
  for line in process.stdout:
85
  print(line.strip())
 
 
 
 
 
 
 
 
 
 
 
 
86
  for line in process.stderr:
87
  print(line.strip())
88
 
89
  process.wait()
 
 
90
 
91
  filename_model = clean_model_name(clean_model)
92
 
@@ -148,10 +166,11 @@ def run_command_and_process_files(model_type, config_path, start_check_point, IN
148
  print(f"An error occurred: {e}")
149
  return (None,) * 14
150
 
 
151
  clear_directory(INPUT_DIR)
152
 
153
- def process_audio(input_audio_file, model, chunk_size, overlap, export_format, use_tta, demud_phaseremix_inst, extract_instrumental, clean_model, *args, **kwargs):
154
- """Processes audio using the specified model and returns separated stems."""
155
  if input_audio_file is not None:
156
  audio_path = input_audio_file.name
157
  else:
@@ -169,6 +188,7 @@ def process_audio(input_audio_file, model, chunk_size, overlap, export_format, u
169
  clean_model_name_full = extract_model_name(model)
170
  print(f"Processing audio from: {audio_path} using model: {clean_model_name_full}")
171
 
 
172
  model_type, config_path, start_check_point = get_model_config(clean_model_name_full, chunk_size, overlap)
173
 
174
  outputs = run_command_and_process_files(
@@ -180,12 +200,14 @@ def process_audio(input_audio_file, model, chunk_size, overlap, export_format, u
180
  extract_instrumental=extract_instrumental,
181
  use_tta=use_tta,
182
  demud_phaseremix_inst=demud_phaseremix_inst,
183
- clean_model=clean_model_name_full
 
184
  )
185
 
 
186
  return outputs
187
 
188
- def ensemble_audio_fn(files, method, weights):
189
  try:
190
  if len(files) < 2:
191
  return None, "⚠️ Minimum 2 files required"
@@ -210,20 +232,33 @@ def ensemble_audio_fn(files, method, weights):
210
  weights_list = [str(w) for w in map(float, weights.split(','))]
211
  ensemble_args += ["--weights", *weights_list]
212
 
 
213
  result = subprocess.run(
214
  ["python", "ensemble.py"] + ensemble_args,
215
  capture_output=True,
216
  text=True
217
  )
218
 
 
 
 
 
 
 
 
 
 
 
219
  log = f"✅ Success!\n{result.stdout}" if not result.stderr else f"❌ Error!\n{result.stderr}"
220
  return output_path, log
221
 
222
  except Exception as e:
223
  return None, f"⛔ Critical Error: {str(e)}"
 
 
224
 
225
- def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap, export_format, use_tta, extract_instrumental, ensemble_type, _state, *args, **kwargs):
226
- """Processes audio with multiple models and performs ensemble."""
227
  try:
228
  if not selected_models or len(selected_models) < 1:
229
  return None, "❌ No models selected"
@@ -236,18 +271,23 @@ def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap
236
  else:
237
  audio_path = input_audio_file.name
238
 
239
- # AUTO_ENSEMBLE_TEMP'i de BASE_DIR üzerinden tanımla
240
  auto_ensemble_temp = os.path.join(BASE_DIR, "auto_ensemble_temp")
241
  os.makedirs(auto_ensemble_temp, exist_ok=True)
242
  os.makedirs(AUTO_ENSEMBLE_OUTPUT, exist_ok=True)
243
  clear_directory(auto_ensemble_temp)
244
 
245
  all_outputs = []
246
- for model in selected_models:
 
 
 
 
 
247
  clean_model = extract_model_name(model)
248
  model_output_dir = os.path.join(auto_ensemble_temp, clean_model)
249
  os.makedirs(model_output_dir, exist_ok=True)
250
 
 
251
  model_type, config_path, start_check_point = get_model_config(clean_model, chunk_size, overlap)
252
 
253
  cmd = [
@@ -273,11 +313,22 @@ def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap
273
  except Exception as e:
274
  return None, f"Critical error with {model}: {str(e)}"
275
 
 
 
 
 
 
 
 
 
 
 
276
  model_outputs = glob.glob(os.path.join(model_output_dir, "*.wav"))
277
  if not model_outputs:
278
  raise FileNotFoundError(f"{model} failed to produce output")
279
  all_outputs.extend(model_outputs)
280
 
 
281
  def wait_for_files(files, timeout=300):
282
  start = time.time()
283
  while time.time() - start < timeout:
@@ -289,6 +340,7 @@ def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap
289
 
290
  wait_for_files(all_outputs)
291
 
 
292
  quoted_files = [f'"{f}"' for f in all_outputs]
293
  timestamp = str(int(time.time()))
294
  output_path = os.path.join(AUTO_ENSEMBLE_OUTPUT, f"ensemble_{timestamp}.wav")
@@ -308,12 +360,22 @@ def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap
308
  check=True
309
  )
310
 
 
 
 
 
 
 
 
 
 
311
  if not os.path.exists(output_path):
312
  raise RuntimeError("Ensemble dosyası oluşturulamadı")
313
 
 
314
  return output_path, "✅ Success!"
315
  except Exception as e:
316
  return None, f"❌ Error: {str(e)}"
317
  finally:
318
  shutil.rmtree(auto_ensemble_temp, ignore_errors=True)
319
- gc.collect()
 
53
  cleaned = cleaned[len(prefix):]
54
  return cleaned.strip()
55
 
56
+ def run_command_and_process_files(model_type, config_path, start_check_point, INPUT_DIR, OUTPUT_DIR, extract_instrumental, use_tta, demud_phaseremix_inst, clean_model, progress=gr.Progress()):
57
  try:
58
  # inference.py'nin tam yolunu kullan
59
  cmd_parts = [
 
81
  universal_newlines=True
82
  )
83
 
84
+ # Progress bar ile subprocess çıktısını izleme
85
+ progress(0, desc="Starting audio separation...", total=100)
86
+ progress_bar = tqdm(total=100, desc="Processing audio", unit="%", position=0, leave=False)
87
+
88
  for line in process.stdout:
89
  print(line.strip())
90
+ # İlerleme yüzdesini parse et (ondalık olarak)
91
+ if "Progress:" in line:
92
+ try:
93
+ percentage = float(re.search(r"Progress: (\d+\.\d+)%", line).group(1))
94
+ progress(percentage, desc=f"Separating audio... ({percentage:.1f}%)")
95
+ progress_bar.n = percentage # tqdm'i güncelle
96
+ progress_bar.refresh()
97
+ except (AttributeError, ValueError) as e:
98
+ print(f"Progress parsing error: {e}")
99
+ elif "Processing file" in line:
100
+ progress(0, desc=line.strip()) # Yeni dosya işleniyorsa sıfırla
101
+
102
  for line in process.stderr:
103
  print(line.strip())
104
 
105
  process.wait()
106
+ progress_bar.close()
107
+ progress(100, desc="Separation complete!")
108
 
109
  filename_model = clean_model_name(clean_model)
110
 
 
166
  print(f"An error occurred: {e}")
167
  return (None,) * 14
168
 
169
+ finally:
170
  clear_directory(INPUT_DIR)
171
 
172
+ def process_audio(input_audio_file, model, chunk_size, overlap, export_format, use_tta, demud_phaseremix_inst, extract_instrumental, clean_model, progress=gr.Progress(track_tqdm=True), *args, **kwargs):
173
+ """Processes audio using the specified model and returns separated stems with progress."""
174
  if input_audio_file is not None:
175
  audio_path = input_audio_file.name
176
  else:
 
188
  clean_model_name_full = extract_model_name(model)
189
  print(f"Processing audio from: {audio_path} using model: {clean_model_name_full}")
190
 
191
+ progress(0, desc="Starting audio separation...", total=100)
192
  model_type, config_path, start_check_point = get_model_config(clean_model_name_full, chunk_size, overlap)
193
 
194
  outputs = run_command_and_process_files(
 
200
  extract_instrumental=extract_instrumental,
201
  use_tta=use_tta,
202
  demud_phaseremix_inst=demud_phaseremix_inst,
203
+ clean_model=clean_model_name_full,
204
+ progress=progress
205
  )
206
 
207
+ progress(100, desc="Audio processing completed!")
208
  return outputs
209
 
210
+ def ensemble_audio_fn(files, method, weights, progress=gr.Progress()):
211
  try:
212
  if len(files) < 2:
213
  return None, "⚠️ Minimum 2 files required"
 
232
  weights_list = [str(w) for w in map(float, weights.split(','))]
233
  ensemble_args += ["--weights", *weights_list]
234
 
235
+ progress(0, desc="Starting ensemble process...", total=100)
236
  result = subprocess.run(
237
  ["python", "ensemble.py"] + ensemble_args,
238
  capture_output=True,
239
  text=True
240
  )
241
 
242
+ # Ensemble için gerçek süreye dayalı ilerleme (0.1'lik adımlarla)
243
+ start_time = time.time()
244
+ total_estimated_time = 10.0 # Tahmini toplam süre (saniye, gerçek süreye göre ayarlanabilir)
245
+ for i in np.arange(0.1, 100.1, 0.1):
246
+ elapsed_time = time.time() - start_time
247
+ progress_value = min(i, (elapsed_time / total_estimated_time) * 100)
248
+ time.sleep(0.001) # Çok küçük bir gecikme, gerçek işlem süresiyle değiştirilebilir
249
+ progress(progress_value, desc=f"Ensembling... ({progress_value:.1f}%)")
250
+
251
+ progress(100, desc="Finalizing ensemble output...")
252
  log = f"✅ Success!\n{result.stdout}" if not result.stderr else f"❌ Error!\n{result.stderr}"
253
  return output_path, log
254
 
255
  except Exception as e:
256
  return None, f"⛔ Critical Error: {str(e)}"
257
+ finally:
258
+ progress(100, desc="Ensemble process completed!")
259
 
260
+ def auto_ensemble_process(input_audio_file, selected_models, chunk_size, overlap, export_format, use_tta, extract_instrumental, ensemble_type, _state, progress=gr.Progress(track_tqdm=True), *args, **kwargs):
261
+ """Processes audio with multiple models and performs ensemble with progress."""
262
  try:
263
  if not selected_models or len(selected_models) < 1:
264
  return None, "❌ No models selected"
 
271
  else:
272
  audio_path = input_audio_file.name
273
 
 
274
  auto_ensemble_temp = os.path.join(BASE_DIR, "auto_ensemble_temp")
275
  os.makedirs(auto_ensemble_temp, exist_ok=True)
276
  os.makedirs(AUTO_ENSEMBLE_OUTPUT, exist_ok=True)
277
  clear_directory(auto_ensemble_temp)
278
 
279
  all_outputs = []
280
+ total_models = len(selected_models)
281
+ total_steps = int(total_models * 10 + 20) # Her model için 10 adım + final adımlar, ondalık için tam sayı
282
+
283
+ progress(0, desc="Starting ensemble process...", total=total_steps)
284
+
285
+ for i, model in enumerate(selected_models):
286
  clean_model = extract_model_name(model)
287
  model_output_dir = os.path.join(auto_ensemble_temp, clean_model)
288
  os.makedirs(model_output_dir, exist_ok=True)
289
 
290
+ progress(i * 10, desc=f"Loading model {i+1}/{total_models}: {model}...")
291
  model_type, config_path, start_check_point = get_model_config(clean_model, chunk_size, overlap)
292
 
293
  cmd = [
 
313
  except Exception as e:
314
  return None, f"Critical error with {model}: {str(e)}"
315
 
316
+ # Her model için gerçek süreye dayalı ilerleme (0.1'lik adımlarla)
317
+ start_time = time.time()
318
+ total_estimated_time = 1.0 # Tahmini toplam süre (saniye, gerçek süreye göre ayarlanabilir)
319
+ for j in np.arange(0.1, 10.1, 0.1):
320
+ elapsed_time = time.time() - start_time
321
+ progress_value = (i * 10) + j
322
+ progress_value = min(progress_value, (i * 10) + (elapsed_time / total_estimated_time) * 10)
323
+ time.sleep(0.001) # Çok küçük bir gecikme, gerçek işlem süresiyle değiştirilebilir
324
+ progress(progress_value, desc=f"Separating with {model} ({progress_value:.1f}%)")
325
+
326
  model_outputs = glob.glob(os.path.join(model_output_dir, "*.wav"))
327
  if not model_outputs:
328
  raise FileNotFoundError(f"{model} failed to produce output")
329
  all_outputs.extend(model_outputs)
330
 
331
+ progress(total_models * 10 + 5, desc="Waiting for all files to be ready...")
332
  def wait_for_files(files, timeout=300):
333
  start = time.time()
334
  while time.time() - start < timeout:
 
340
 
341
  wait_for_files(all_outputs)
342
 
343
+ progress(total_models * 10 + 10, desc="Performing ensemble...")
344
  quoted_files = [f'"{f}"' for f in all_outputs]
345
  timestamp = str(int(time.time()))
346
  output_path = os.path.join(AUTO_ENSEMBLE_OUTPUT, f"ensemble_{timestamp}.wav")
 
360
  check=True
361
  )
362
 
363
+ # Ensemble için gerçek süreye dayalı ilerleme (0.1'lik adımlarla)
364
+ start_time = time.time()
365
+ total_estimated_time = 10.0 # Tahmini toplam süre (saniye, gerçek süreye göre ayarlanabilir)
366
+ for i in np.arange(total_models * 10 + 11, total_steps - 0.1, 0.1):
367
+ elapsed_time = time.time() - start_time
368
+ progress_value = min(i, (elapsed_time / total_estimated_time) * (total_steps - (total_models * 10 + 10)) + (total_models * 10 + 10))
369
+ time.sleep(0.001) # Çok küçük bir gecikme, gerçek işlem süresiyle değiştirilebilir
370
+ progress(progress_value, desc=f"Ensembling... ({progress_value:.1f}%)")
371
+
372
  if not os.path.exists(output_path):
373
  raise RuntimeError("Ensemble dosyası oluşturulamadı")
374
 
375
+ progress(total_steps, desc="Ensemble completed successfully!")
376
  return output_path, "✅ Success!"
377
  except Exception as e:
378
  return None, f"❌ Error: {str(e)}"
379
  finally:
380
  shutil.rmtree(auto_ensemble_temp, ignore_errors=True)
381
+ gc.collect()