Nymbo commited on
Commit
697ef8d
·
verified ·
1 Parent(s): b9a4330

Sync with upstream r3gm/Audio_separator (ZeroGPU, Gradio 6); sdk 6.29, Python 3.12, torch 2.9.1

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. README.md +2 -1
  3. app.py +156 -145
  4. pre-requirements.txt +2 -0
  5. requirements.txt +17 -2
  6. test.mp3 +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ test.mp3 filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -4,7 +4,8 @@ emoji: 🏃
4
  colorFrom: purple
5
  colorTo: pink
6
  sdk: gradio
7
- sdk_version: 4.28.3
 
8
  app_file: app.py
9
  pinned: false
10
  license: mit
 
4
  colorFrom: purple
5
  colorTo: pink
6
  sdk: gradio
7
+ sdk_version: 6.29.0
8
+ python_version: "3.12"
9
  app_file: app.py
10
  pinned: false
11
  license: mit
app.py CHANGED
@@ -1,6 +1,5 @@
1
  import os
2
- # os.system("pip install ./ort_nightly_gpu-1.17.0.dev20240118002-cp310-cp310-manylinux_2_28_x86_64.whl")
3
- os.system("pip install ort-nightly-gpu --index-url=https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ort-cuda-12-nightly/pypi/simple/")
4
  import gc
5
  import hashlib
6
  import queue
@@ -20,24 +19,39 @@ from utils import (
20
  download_manager,
21
  )
22
  import random
23
- # import spaces
24
  from utils import logger
25
  import onnxruntime as ort
26
  import warnings
27
  import gradio as gr
28
- import logging
29
  import time
30
  import traceback
31
  from pedalboard import Pedalboard, Reverb, Delay, Chorus, Compressor, Gain, HighpassFilter, LowpassFilter
32
  from pedalboard.io import AudioFile
33
- import numpy as np
34
- import yt_dlp
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  warnings.filterwarnings("ignore")
 
 
37
 
38
- title = "<center><strong><font size='7'>Audio🔹separator</font></strong></center>"
39
- description = "This demo uses the MDX-Net models for vocal and background sound separation."
40
- theme = "NoCrypt/miku"
 
 
41
 
42
  stem_naming = {
43
  "Vocals": "Instrumental",
@@ -349,7 +363,7 @@ class MDX:
349
  return self.segment(processed_batches, True, chunk)
350
 
351
 
352
- # @spaces.GPU()
353
  def run_mdx(
354
  model_params,
355
  output_dir,
@@ -371,6 +385,9 @@ def run_mdx(
371
  device_properties = torch.cuda.get_device_properties(device)
372
  vram_gb = device_properties.total_memory / 1024**3
373
  m_threads = 1 if vram_gb < 8 else (8 if vram_gb > 32 else 2)
 
 
 
374
  logger.info(f"threads: {m_threads} vram: {vram_gb}")
375
  else:
376
  device = torch.device("cpu")
@@ -458,7 +475,9 @@ def run_mdx_beta(
458
 
459
  m_threads = 1
460
  duration = librosa.get_duration(filename=filename)
461
- if duration >= 60 and duration <= 120:
 
 
462
  m_threads = 8
463
  elif duration > 120:
464
  m_threads = 16
@@ -579,10 +598,14 @@ def get_hash(filepath):
579
 
580
  return file_hash.hexdigest()[:18]
581
 
 
582
  def random_sleep():
583
- sleep_time = round(random.uniform(5.2, 7.9), 1)
 
 
584
  time.sleep(sleep_time)
585
 
 
586
  def process_uvr_task(
587
  orig_song_path: str = "aud_test.mp3",
588
  main_vocals: bool = False,
@@ -652,16 +675,16 @@ def process_uvr_task(
652
  device_base=device_base,
653
  )
654
  except Exception as e:
655
- backup_vocals_path, main_vocals_path = run_mdx_beta(
656
- mdx_model_params,
657
- song_output_dir,
658
- os.path.join(mdxnet_models_dir, "UVR_MDXNET_KARA_2.onnx"),
659
- vocals_path,
660
- suffix="Backup",
661
- invert_suffix="Main",
662
- denoise=True,
663
- device_base=device_base,
664
- )
665
  else:
666
  backup_vocals_path, main_vocals_path = None, vocals_path
667
 
@@ -682,16 +705,16 @@ def process_uvr_task(
682
  device_base=device_base,
683
  )
684
  except Exception as e:
685
- _, vocals_dereverb_path = run_mdx_beta(
686
- mdx_model_params,
687
- song_output_dir,
688
- os.path.join(mdxnet_models_dir, "Reverb_HQ_By_FoxJoy.onnx"),
689
- main_vocals_path,
690
- invert_suffix="DeReverb",
691
- exclude_main=True,
692
- denoise=True,
693
- device_base=device_base,
694
- )
695
  else:
696
  vocals_dereverb_path = main_vocals_path
697
 
@@ -718,12 +741,12 @@ def add_vocal_effects(input_file, output_file, reverb_room_size=0.6, vocal_rever
718
 
719
  if delay_seconds > 0 or delay_mix > 0:
720
  effects.append(Delay(delay_seconds=delay_seconds, mix=delay_mix))
721
- print("delay applied")
722
  # effects.append(Chorus())
723
 
724
  if gain_db:
725
  effects.append(Gain(gain_db=gain_db))
726
- print("added gain db")
727
 
728
  board = Pedalboard(effects)
729
 
@@ -764,99 +787,77 @@ def add_instrumental_effects(input_file, output_file, highpass_freq=100, lowpass
764
  effected = board(chunk, f.samplerate, reset=False)
765
  o.write(effected)
766
 
767
-
768
- def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, background_effects=True,
769
- vocal_reverb_room_size=0.6, vocal_reverb_damping=0.6, vocal_reverb_wet_level=0.35,
770
- vocal_delay_seconds=0.4, vocal_delay_mix=0.25,
771
- vocal_compressor_threshold_db=-25, vocal_compressor_ratio=3.5, vocal_compressor_attack_ms=10, vocal_compressor_release_ms=60,
772
- vocal_gain_db=4,
773
- background_highpass_freq=120, background_lowpass_freq=11000,
774
- background_reverb_room_size=0.5, background_reverb_damping=0.5, background_reverb_wet_level=0.25,
775
- background_compressor_threshold_db=-20, background_compressor_ratio=2.5, background_compressor_attack_ms=15, background_compressor_release_ms=80,
776
- background_gain_db=3):
777
- if not media_file:
778
- raise ValueError("The audio path is missing.")
779
 
780
- if not stem:
781
- raise ValueError("Please select 'vocal' or 'background' stem.")
782
 
783
- hash_audio = str(get_hash(media_file))
784
- media_dir = os.path.dirname(media_file)
785
 
786
- outputs = []
 
 
 
 
787
 
788
- start_time = time.time()
 
 
 
 
 
 
 
 
 
 
 
 
789
 
790
- if stem == "vocal":
791
- try:
792
- _, _, _, _, vocal_audio = process_uvr_task(
793
- orig_song_path=media_file,
794
- song_id=hash_audio + "mdx",
795
- main_vocals=main,
796
- dereverb=dereverb,
797
- remove_files_output_dir=False,
798
- )
799
 
800
- if vocal_effects:
801
- suffix = '_effects'
802
- file_name, file_extension = os.path.splitext(vocal_audio)
803
- out_effects = file_name + suffix + file_extension
804
- out_effects_path = os.path.join(media_dir, out_effects)
805
- add_vocal_effects(vocal_audio, out_effects_path,
806
- reverb_room_size=vocal_reverb_room_size, reverb_damping=vocal_reverb_damping, reverb_wet_level=vocal_reverb_wet_level,
807
- delay_seconds=vocal_delay_seconds, delay_mix=vocal_delay_mix,
808
- compressor_threshold_db=vocal_compressor_threshold_db, compressor_ratio=vocal_compressor_ratio, compressor_attack_ms=vocal_compressor_attack_ms, compressor_release_ms=vocal_compressor_release_ms,
809
- gain_db=vocal_gain_db
810
- )
811
- vocal_audio = out_effects_path
812
 
813
- outputs.append(vocal_audio)
814
- except Exception as error:
815
- logger.error(str(error))
816
- traceback.print_exc()
817
 
818
- if stem == "background":
819
- background_audio, _ = process_uvr_task(
820
- orig_song_path=media_file,
821
- song_id=hash_audio + "voiceless",
822
- only_voiceless=True,
823
- remove_files_output_dir=False,
824
- )
825
 
826
- if background_effects:
827
- suffix = '_effects'
828
- file_name, file_extension = os.path.splitext(background_audio)
829
- out_effects = file_name + suffix + file_extension
830
- out_effects_path = os.path.join(media_dir, out_effects)
831
- add_instrumental_effects(background_audio, out_effects_path,
832
- highpass_freq=background_highpass_freq, lowpass_freq=background_lowpass_freq,
833
- reverb_room_size=background_reverb_room_size, reverb_damping=background_reverb_damping, reverb_wet_level=background_reverb_wet_level,
834
- compressor_threshold_db=background_compressor_threshold_db, compressor_ratio=background_compressor_ratio, compressor_attack_ms=background_compressor_attack_ms, compressor_release_ms=background_compressor_release_ms,
835
- gain_db=background_gain_db
836
- )
837
- background_audio = out_effects_path
838
 
839
- outputs.append(background_audio)
 
 
 
 
 
 
840
 
841
- end_time = time.time()
842
- execution_time = end_time - start_time
843
- logger.info(f"Execution time: {execution_time} seconds")
844
 
845
- if not outputs:
846
- raise Exception("Error in sound separation.")
 
847
 
848
- return outputs
849
 
 
850
 
851
- def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, background_effects=True,
852
- vocal_reverb_room_size=0.6, vocal_reverb_damping=0.6, vocal_reverb_dryness=0.8 ,vocal_reverb_wet_level=0.35,
853
- vocal_delay_seconds=0.4, vocal_delay_mix=0.25,
854
- vocal_compressor_threshold_db=-25, vocal_compressor_ratio=3.5, vocal_compressor_attack_ms=10, vocal_compressor_release_ms=60,
855
- vocal_gain_db=4,
856
- background_highpass_freq=120, background_lowpass_freq=11000,
857
- background_reverb_room_size=0.5, background_reverb_damping=0.5, background_reverb_wet_level=0.25,
858
- background_compressor_threshold_db=-20, background_compressor_ratio=2.5, background_compressor_attack_ms=15, background_compressor_release_ms=80,
859
- background_gain_db=3,
 
 
 
860
  ):
861
  if not media_file:
862
  raise ValueError("The audio path is missing.")
@@ -874,10 +875,10 @@ def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, backgro
874
  print("Duration audio:", duration_base_)
875
  except Exception as e:
876
  print(e)
877
-
878
  start_time = time.time()
879
 
880
- if stem == "vocal":
881
  try:
882
  _, _, _, _, vocal_audio = process_uvr_task(
883
  orig_song_path=media_file,
@@ -905,7 +906,7 @@ def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, backgro
905
  gr.Info(str(error))
906
  logger.error(str(error))
907
 
908
- if stem == "background":
909
  background_audio, _ = process_uvr_task(
910
  orig_song_path=media_file,
911
  song_id=hash_audio + "voiceless",
@@ -918,7 +919,7 @@ def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, backgro
918
  file_name, file_extension = os.path.splitext(os.path.abspath(background_audio))
919
  out_effects = file_name + suffix + file_extension
920
  out_effects_path = os.path.join(media_dir, out_effects)
921
- print(file_name, file_extension, out_effects, out_effects_path)
922
  add_instrumental_effects(background_audio, out_effects_path,
923
  highpass_freq=background_highpass_freq, lowpass_freq=background_lowpass_freq,
924
  reverb_room_size=background_reverb_room_size, reverb_damping=background_reverb_damping, reverb_wet_level=background_reverb_wet_level,
@@ -936,7 +937,7 @@ def sound_separate(media_file, stem, main, dereverb, vocal_effects=True, backgro
936
  if not outputs:
937
  raise Exception("Error in sound separation.")
938
 
939
- return outputs
940
 
941
 
942
  def audio_downloader(
@@ -948,7 +949,12 @@ def audio_downloader(
948
  if not url_media:
949
  return None
950
 
951
- print(url_media[:10])
 
 
 
 
 
952
 
953
  dir_output_downloads = "downloads"
954
  os.makedirs(dir_output_downloads, exist_ok=True)
@@ -1023,7 +1029,7 @@ def audio_conf():
1023
 
1024
 
1025
  def stem_conf():
1026
- return gr.Radio(
1027
  choices=["vocal", "background"],
1028
  value="vocal",
1029
  label="Stem",
@@ -1313,23 +1319,29 @@ def output_conf():
1313
 
1314
 
1315
  def show_vocal_components(value_name):
 
 
1316
 
1317
- if value_name == "vocal":
1318
- return gr.update(visible=True), gr.update(
1319
- visible=True
1320
- ), gr.update(visible=True), gr.update(
1321
- visible=False
1322
- )
1323
- else:
1324
- return gr.update(visible=False), gr.update(
1325
- visible=False
1326
- ), gr.update(visible=False), gr.update(
1327
- visible=True
1328
- )
 
 
 
 
1329
 
1330
 
1331
- def get_gui(theme):
1332
- with gr.Blocks(theme=theme) as app:
1333
  gr.Markdown(title)
1334
  gr.Markdown(description)
1335
 
@@ -1365,9 +1377,7 @@ def get_gui(theme):
1365
  vocal_effects_gui = vocal_effects_conf()
1366
  background_effects_gui = background_effects_conf()
1367
 
1368
- # with gr.Column():
1369
- with gr.Accordion("Vocal Effects Parameters", open=False): # with gr.Row():
1370
- # gr.Label("Vocal Effects Parameters")
1371
  with gr.Row():
1372
  vocal_reverb_room_size_gui = vocal_reverb_room_size_conf()
1373
  vocal_reverb_damping_gui = vocal_reverb_damping_conf()
@@ -1381,8 +1391,7 @@ def get_gui(theme):
1381
  vocal_compressor_release_ms_gui = vocal_compressor_release_ms_conf()
1382
  vocal_gain_db_gui = vocal_gain_db_conf()
1383
 
1384
- with gr.Accordion("Background Effects Parameters", open=False): # with gr.Row():
1385
- # gr.Label("Background Effects Parameters")
1386
  with gr.Row():
1387
  background_highpass_freq_gui = background_highpass_freq_conf()
1388
  background_lowpass_freq_gui = background_lowpass_freq_conf()
@@ -1401,6 +1410,7 @@ def get_gui(theme):
1401
  [main_gui, dereverb_gui, vocal_effects_gui, background_effects_gui],
1402
  )
1403
 
 
1404
  button_base = button_conf()
1405
  output_base = output_conf()
1406
 
@@ -1419,7 +1429,7 @@ def get_gui(theme):
1419
  background_highpass_freq_gui, background_lowpass_freq_gui, background_reverb_room_size_gui,
1420
  background_reverb_damping_gui, background_reverb_wet_level_gui, background_compressor_threshold_db_gui,
1421
  background_compressor_ratio_gui, background_compressor_attack_ms_gui, background_compressor_release_ms_gui,
1422
- background_gain_db_gui,
1423
  ],
1424
  outputs=[output_base],
1425
  )
@@ -1458,24 +1468,25 @@ def get_gui(theme):
1458
  cache_examples=False,
1459
  )
1460
 
 
 
1461
  return app
1462
 
1463
 
1464
  if __name__ == "__main__":
1465
-
1466
  for id_model in UVR_MODELS:
1467
  download_manager(
1468
  os.path.join(MDX_DOWNLOAD_LINK, id_model), mdxnet_models_dir
1469
  )
1470
 
1471
- app = get_gui(theme)
1472
-
1473
  app.queue(default_concurrency_limit=40)
1474
-
1475
  app.launch(
1476
  max_threads=40,
1477
- share=False,
1478
  show_error=True,
1479
  quiet=False,
1480
- debug=False,
 
 
1481
  )
 
1
  import os
2
+ import spaces
 
3
  import gc
4
  import hashlib
5
  import queue
 
19
  download_manager,
20
  )
21
  import random
 
22
  from utils import logger
23
  import onnxruntime as ort
24
  import warnings
25
  import gradio as gr
 
26
  import time
27
  import traceback
28
  from pedalboard import Pedalboard, Reverb, Delay, Chorus, Compressor, Gain, HighpassFilter, LowpassFilter
29
  from pedalboard.io import AudioFile
30
+ import argparse
31
+
32
+ parser = argparse.ArgumentParser(description="Run the app with optional sharing")
33
+ parser.add_argument(
34
+ '--share',
35
+ action='store_true',
36
+ help='Enable sharing mode'
37
+ )
38
+ parser.add_argument(
39
+ '--theme',
40
+ type=str,
41
+ default="NoCrypt/miku",
42
+ help='Set the theme (default: NoCrypt/miku)'
43
+ )
44
+ args = parser.parse_args()
45
 
46
  warnings.filterwarnings("ignore")
47
+ IS_COLAB = True if ('google.colab' in sys.modules or args.share) else False
48
+ IS_ZERO_GPU = os.getenv("SPACES_ZERO_GPU")
49
 
50
+ title = "<center><strong><font size='6'>Audio🔹separator</font></strong></center>"
51
+ base_demo = "This demo uses the "
52
+ description = (f"{base_demo if IS_ZERO_GPU else ''}MDX-Net models for vocal and background sound separation.")
53
+ RESOURCES = "- You can also try `Audio🔹separator` in Colab’s free tier, which provides free GPU [link](https://github.com/R3gm/Audio_separator_ui?tab=readme-ov-file#audio-separator)."
54
+ theme = args.theme
55
 
56
  stem_naming = {
57
  "Vocals": "Instrumental",
 
363
  return self.segment(processed_batches, True, chunk)
364
 
365
 
366
+ @spaces.GPU(duration=(40/1.5))
367
  def run_mdx(
368
  model_params,
369
  output_dir,
 
385
  device_properties = torch.cuda.get_device_properties(device)
386
  vram_gb = device_properties.total_memory / 1024**3
387
  m_threads = 1 if vram_gb < 8 else (8 if vram_gb > 32 else 2)
388
+ duration = librosa.get_duration(filename=filename)
389
+ if duration < 60:
390
+ m_threads = 1
391
  logger.info(f"threads: {m_threads} vram: {vram_gb}")
392
  else:
393
  device = torch.device("cpu")
 
475
 
476
  m_threads = 1
477
  duration = librosa.get_duration(filename=filename)
478
+ if IS_COLAB or duration < 60:
479
+ m_threads = 1
480
+ elif duration >= 60 and duration <= 120:
481
  m_threads = 8
482
  elif duration > 120:
483
  m_threads = 16
 
598
 
599
  return file_hash.hexdigest()[:18]
600
 
601
+
602
  def random_sleep():
603
+ sleep_time = 0.1
604
+ if IS_ZERO_GPU:
605
+ sleep_time = round(random.uniform(3.2, 5.9), 1)
606
  time.sleep(sleep_time)
607
 
608
+
609
  def process_uvr_task(
610
  orig_song_path: str = "aud_test.mp3",
611
  main_vocals: bool = False,
 
675
  device_base=device_base,
676
  )
677
  except Exception as e:
678
+ backup_vocals_path, main_vocals_path = run_mdx_beta(
679
+ mdx_model_params,
680
+ song_output_dir,
681
+ os.path.join(mdxnet_models_dir, "UVR_MDXNET_KARA_2.onnx"),
682
+ vocals_path,
683
+ suffix="Backup",
684
+ invert_suffix="Main",
685
+ denoise=True,
686
+ device_base=device_base,
687
+ )
688
  else:
689
  backup_vocals_path, main_vocals_path = None, vocals_path
690
 
 
705
  device_base=device_base,
706
  )
707
  except Exception as e:
708
+ _, vocals_dereverb_path = run_mdx_beta(
709
+ mdx_model_params,
710
+ song_output_dir,
711
+ os.path.join(mdxnet_models_dir, "Reverb_HQ_By_FoxJoy.onnx"),
712
+ main_vocals_path,
713
+ invert_suffix="DeReverb",
714
+ exclude_main=True,
715
+ denoise=True,
716
+ device_base=device_base,
717
+ )
718
  else:
719
  vocals_dereverb_path = main_vocals_path
720
 
 
741
 
742
  if delay_seconds > 0 or delay_mix > 0:
743
  effects.append(Delay(delay_seconds=delay_seconds, mix=delay_mix))
744
+ # print("delay applied")
745
  # effects.append(Chorus())
746
 
747
  if gain_db:
748
  effects.append(Gain(gain_db=gain_db))
749
+ # print("added gain db")
750
 
751
  board = Pedalboard(effects)
752
 
 
787
  effected = board(chunk, f.samplerate, reset=False)
788
  o.write(effected)
789
 
 
 
 
 
 
 
 
 
 
 
 
 
790
 
791
+ COMMON_SAMPLE_RATES = [8000, 16000, 22050, 32000, 44100, 48000, 96000]
 
792
 
 
 
793
 
794
+ def save_audio(audio_opt: np.ndarray, final_sr: int, output_audio_path: str, target_format: str) -> str:
795
+ """
796
+ Save audio with automatic handling of unsupported sample rates for non-WAV formats.
797
+ """
798
+ ext = os.path.splitext(output_audio_path)[1].lower()
799
 
800
+ try:
801
+ if ext == ".wav":
802
+ sf.write(output_audio_path, audio_opt, final_sr, format=target_format)
803
+ else:
804
+ target_sr = min(COMMON_SAMPLE_RATES, key=lambda altsr: abs(altsr - final_sr))
805
+ if target_sr != final_sr:
806
+ logger.warning(f"Resampling from {final_sr} -> {target_sr} for {ext}")
807
+ audio_opt = librosa.resample(audio_opt, orig_sr=final_sr, target_sr=target_sr)
808
+ sf.write(output_audio_path, audio_opt, target_sr, format=target_format)
809
+ except Exception as e:
810
+ logger.error(e)
811
+ logger.error(f"Error saving {output_audio_path}, performing fallback to WAV")
812
+ output_audio_path = output_audio_path.replace(f"_converted.{target_format}", ".wav")
813
 
814
+ return output_audio_path
 
 
 
 
 
 
 
 
815
 
 
 
 
 
 
 
 
 
 
 
 
 
816
 
817
+ def convert_format(file_paths, media_dir, target_format):
818
+ """
819
+ Convert a list of audio files to the target format with automatic safe sample rates.
 
820
 
821
+ WAV files are returned as-is; non-WAV files are resampled if needed to a supported rate.
822
+ """
823
+ target_format = target_format.lower()
824
+ if target_format == "wav":
825
+ return file_paths # No conversion needed for WAV
 
 
826
 
827
+ suffix = "_converted"
828
+ converted_files = []
 
 
 
 
 
 
 
 
 
 
829
 
830
+ for fp in file_paths:
831
+ # Absolute paths and base filename
832
+ abs_fp = os.path.abspath(fp)
833
+ file_name, _ = os.path.splitext(os.path.basename(abs_fp))
834
+ file_ext = f".{target_format}"
835
+ out_name = file_name + suffix + file_ext
836
+ out_path = os.path.join(media_dir, out_name)
837
 
838
+ # Load audio with librosa (handles many formats)
839
+ audio, sr = sf.read(abs_fp)
 
840
 
841
+ # Save using safe resampling
842
+ saved_path = save_audio(audio, sr, out_path, target_format)
843
+ converted_files.append(saved_path)
844
 
845
+ # print(f"Converted: {abs_fp} -> {saved_path}")
846
 
847
+ return converted_files
848
 
849
+
850
+ def sound_separate(
851
+ media_file, stem, main, dereverb, vocal_effects=True, background_effects=True,
852
+ vocal_reverb_room_size=0.6, vocal_reverb_damping=0.6, vocal_reverb_dryness=0.8, vocal_reverb_wet_level=0.35,
853
+ vocal_delay_seconds=0.4, vocal_delay_mix=0.25,
854
+ vocal_compressor_threshold_db=-25, vocal_compressor_ratio=3.5, vocal_compressor_attack_ms=10, vocal_compressor_release_ms=60,
855
+ vocal_gain_db=4,
856
+ background_highpass_freq=120, background_lowpass_freq=11000,
857
+ background_reverb_room_size=0.5, background_reverb_damping=0.5, background_reverb_wet_level=0.25,
858
+ background_compressor_threshold_db=-20, background_compressor_ratio=2.5, background_compressor_attack_ms=15, background_compressor_release_ms=80,
859
+ background_gain_db=3,
860
+ target_format="WAV",
861
  ):
862
  if not media_file:
863
  raise ValueError("The audio path is missing.")
 
875
  print("Duration audio:", duration_base_)
876
  except Exception as e:
877
  print(e)
878
+
879
  start_time = time.time()
880
 
881
+ if "vocal" in stem:
882
  try:
883
  _, _, _, _, vocal_audio = process_uvr_task(
884
  orig_song_path=media_file,
 
906
  gr.Info(str(error))
907
  logger.error(str(error))
908
 
909
+ if "background" in stem:
910
  background_audio, _ = process_uvr_task(
911
  orig_song_path=media_file,
912
  song_id=hash_audio + "voiceless",
 
919
  file_name, file_extension = os.path.splitext(os.path.abspath(background_audio))
920
  out_effects = file_name + suffix + file_extension
921
  out_effects_path = os.path.join(media_dir, out_effects)
922
+ # print(file_name, file_extension, out_effects, out_effects_path)
923
  add_instrumental_effects(background_audio, out_effects_path,
924
  highpass_freq=background_highpass_freq, lowpass_freq=background_lowpass_freq,
925
  reverb_room_size=background_reverb_room_size, reverb_damping=background_reverb_damping, reverb_wet_level=background_reverb_wet_level,
 
937
  if not outputs:
938
  raise Exception("Error in sound separation.")
939
 
940
+ return convert_format(outputs, media_dir, target_format)
941
 
942
 
943
  def audio_downloader(
 
949
  if not url_media:
950
  return None
951
 
952
+ if IS_ZERO_GPU and "youtube.com" in url_media:
953
+ gr.Info("This option isn’t available on Hugging Face.")
954
+ return None
955
+
956
+ import yt_dlp
957
+ # print(url_media[:10])
958
 
959
  dir_output_downloads = "downloads"
960
  os.makedirs(dir_output_downloads, exist_ok=True)
 
1029
 
1030
 
1031
  def stem_conf():
1032
+ return gr.CheckboxGroup(
1033
  choices=["vocal", "background"],
1034
  value="vocal",
1035
  label="Stem",
 
1319
 
1320
 
1321
  def show_vocal_components(value_name):
1322
+ v_ = "vocal" in value_name
1323
+ b_ = "background" in value_name
1324
 
1325
+ return gr.update(visible=v_), gr.update(
1326
+ visible=v_
1327
+ ), gr.update(visible=v_), gr.update(
1328
+ visible=b_
1329
+ )
1330
+
1331
+
1332
+ FORMAT_OPTIONS = ["WAV", "MP3", "FLAC"]
1333
+
1334
+
1335
+ def format_conf():
1336
+ return gr.Dropdown(
1337
+ choices=FORMAT_OPTIONS,
1338
+ value=FORMAT_OPTIONS[0],
1339
+ label="Format output:"
1340
+ )
1341
 
1342
 
1343
+ def get_gui():
1344
+ with gr.Blocks(fill_width=True, fill_height=False, delete_cache=(3200, 10800)) as app:
1345
  gr.Markdown(title)
1346
  gr.Markdown(description)
1347
 
 
1377
  vocal_effects_gui = vocal_effects_conf()
1378
  background_effects_gui = background_effects_conf()
1379
 
1380
+ with gr.Accordion("Vocal Effects Parameters", open=False):
 
 
1381
  with gr.Row():
1382
  vocal_reverb_room_size_gui = vocal_reverb_room_size_conf()
1383
  vocal_reverb_damping_gui = vocal_reverb_damping_conf()
 
1391
  vocal_compressor_release_ms_gui = vocal_compressor_release_ms_conf()
1392
  vocal_gain_db_gui = vocal_gain_db_conf()
1393
 
1394
+ with gr.Accordion("Background Effects Parameters", open=False):
 
1395
  with gr.Row():
1396
  background_highpass_freq_gui = background_highpass_freq_conf()
1397
  background_lowpass_freq_gui = background_lowpass_freq_conf()
 
1410
  [main_gui, dereverb_gui, vocal_effects_gui, background_effects_gui],
1411
  )
1412
 
1413
+ target_format_gui = format_conf()
1414
  button_base = button_conf()
1415
  output_base = output_conf()
1416
 
 
1429
  background_highpass_freq_gui, background_lowpass_freq_gui, background_reverb_room_size_gui,
1430
  background_reverb_damping_gui, background_reverb_wet_level_gui, background_compressor_threshold_db_gui,
1431
  background_compressor_ratio_gui, background_compressor_attack_ms_gui, background_compressor_release_ms_gui,
1432
+ background_gain_db_gui, target_format_gui,
1433
  ],
1434
  outputs=[output_base],
1435
  )
 
1468
  cache_examples=False,
1469
  )
1470
 
1471
+ gr.Markdown(RESOURCES)
1472
+
1473
  return app
1474
 
1475
 
1476
  if __name__ == "__main__":
 
1477
  for id_model in UVR_MODELS:
1478
  download_manager(
1479
  os.path.join(MDX_DOWNLOAD_LINK, id_model), mdxnet_models_dir
1480
  )
1481
 
1482
+ app = get_gui()
 
1483
  app.queue(default_concurrency_limit=40)
 
1484
  app.launch(
1485
  max_threads=40,
1486
+ share=IS_COLAB,
1487
  show_error=True,
1488
  quiet=False,
1489
+ debug=IS_COLAB,
1490
+ ssr_mode=False,
1491
+ theme=theme,
1492
  )
pre-requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ pip<=23.1.2
2
+ Setuptools<=80.6.0
requirements.txt CHANGED
@@ -1,5 +1,20 @@
1
  soundfile
2
  librosa
3
- torch==2.2.0
 
 
4
  pedalboard
5
- yt-dlp
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  soundfile
2
  librosa
3
+ torch==2.9.1
4
+ torchvision==0.24.1
5
+ torchaudio==2.9.1
6
  pedalboard
7
+ yt-dlp
8
+ tqdm
9
+ spaces
10
+ numpy<2
11
+ ffmpeg-python
12
+ scipy
13
+ scikit-learn
14
+ matplotlib
15
+ matplotlib-inline
16
+ seaborn
17
+ requests
18
+ urllib3
19
+ onnxruntime-gpu==1.22.0
20
+ # onnxruntime # only CPU
test.mp3 CHANGED
Binary files a/test.mp3 and b/test.mp3 differ