Spaces:
Running
Running
| """ | |
| models_config.py - Extended model configuration for SESA HuggingFace Space | |
| Provides: | |
| 1. EXTENDED_MODELS: All models from the main SESA project merged with base ROFORMER_MODELS | |
| 2. Custom model management (add/delete/list from custom_models.json) | |
| 3. Audio segmentation helpers for large file handling | |
| 4. Batch processing support | |
| """ | |
| import os | |
| import json | |
| import subprocess | |
| import logging | |
| import re | |
| import shutil | |
| import requests | |
| import urllib.parse | |
| logger = logging.getLogger(__name__) | |
| # ─── Paths ─────────────────────────────────────────────────────────────────── | |
| BASE_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| CUSTOM_MODELS_FILE = os.path.join(BASE_DIR, 'custom_models.json') | |
| MODEL_CACHE_DIR = "/tmp/audio-separator-models/" | |
| # ─── Segmentation Constants ───────────────────────────────────────────────── | |
| MAX_UNSPLIT_DURATION = 1800 # 30 minutes | |
| SEGMENT_DURATION = 600 # 10 minutes per segment | |
| # ─── Extended Model Registry ──────────────────────────────────────────────── | |
| # Merged from main project model.py + existing ROFORMER_MODELS | |
| # Format: { "Category": { "Display Name": "checkpoint_filename.ckpt" } } | |
| EXTENDED_MODELS = { | |
| "Vocals": { | |
| # === From main project model.py === | |
| 'BS Roformer HyperACEv2 Voc (by unwa)': 'bs_roformer_voc_hyperacev2.ckpt', | |
| 'BS-Roformer-Resurrection (by unwa)': 'BS-Roformer-Resurrection.ckpt', | |
| 'BS Roformer Revive3e (by unwa)': 'bs_roformer_revive3e.ckpt', | |
| 'BS Roformer Revive2 (by unwa)': 'bs_roformer_revive2.ckpt', | |
| 'BS Roformer Revive (by unwa)': 'bs_roformer_revive.ckpt', | |
| 'Karaoke BS Roformer (by anvuew)': 'karaoke_bs_roformer_anvuew.ckpt', | |
| 'VOCALS big_beta6X (by Unwa)': 'big_beta6x.ckpt', | |
| 'VOCALS big_beta6 (by Unwa)': 'big_beta6.ckpt', | |
| 'VOCALS Mel-Roformer FT 3 Preview (by unwa)': 'kimmel_unwa_ft3_prev.ckpt', | |
| 'VOCALS InstVocHQ (MDX23C)': 'model_vocals_mdx23c_sdr_10.17.ckpt', | |
| 'VOCALS MelBand-Roformer (by KimberleyJSN)': 'MelBandRoformer.ckpt', | |
| 'VOCALS BS-Roformer 1297 (by viperx)': 'model_bs_roformer_ep_317_sdr_12.9755.ckpt', | |
| 'VOCALS BS-Roformer 1296 (by viperx)': 'model_bs_roformer_ep_368_sdr_12.9628.ckpt', | |
| 'VOCALS BS-RoformerLargeV1 (by unwa)': 'BS-Roformer_LargeV1.ckpt', | |
| 'VOCALS Mel-Roformer big beta 4 (by unwa)': 'melband_roformer_big_beta4.ckpt', | |
| 'VOCALS Melband-Roformer BigBeta5e (by unwa)': 'big_beta5e.ckpt', | |
| 'VOCALS VitLarge23 (by ZFTurbo)': 'model_vocals_segm_models_sdr_9.77.ckpt', | |
| 'VOCALS MelBand-Roformer Kim FT (by Unwa)': 'kimmel_unwa_ft.ckpt', | |
| 'VOCALS MelBand-Roformer Kim FT 2 (by Unwa)': 'kimmel_unwa_ft2.ckpt', | |
| 'VOCALS MelBand-Roformer Kim FT 2 Bleedless (by unwa)': 'kimmel_unwa_ft2_bleedless.ckpt', | |
| 'VOCALS MelBand-Roformer (by Becruily)': 'mel_band_roformer_vocals_becruily.ckpt', | |
| 'VOCALS Male-Female BS-RoFormer 7.2889 (by aufr33)': 'bs_roformer_male_female_by_aufr33_sdr_7.2889.ckpt', | |
| 'voc_gaboxBSroformer (by Gabox)': 'voc_gaboxBSR.ckpt', | |
| 'voc_gaboxMelReformer (by Gabox)': 'voc_gabox.ckpt', | |
| 'Voc FV3 (by Gabox)': 'voc_Fv3.ckpt', | |
| 'FullnessVocalModel (by Amane)': 'FullnessVocalModel.ckpt', | |
| 'voc_fv4 (by Gabox)': 'voc_fv4.ckpt', | |
| 'voc_fv5 (by Gabox)': 'voc_fv5.ckpt', | |
| 'voc_fv6 (by Gabox)': 'voc_fv6.ckpt', | |
| 'voc_fv7 (by Gabox)': 'voc_fv7.ckpt', | |
| 'vocfv7beta1 (by Gabox)': 'vocfv7beta1.ckpt', | |
| 'vocfv7beta2 (by Gabox)': 'vocfv7beta2.ckpt', | |
| 'vocfv7beta3 (by Gabox)': 'vocfv7beta3.ckpt', | |
| 'MelBandRoformerSYHFTV3Epsilon (by SYH99999)': 'MelBandRoformerSYHFTV3Epsilon.ckpt', | |
| 'MelBandRoformerBigSYHFTV1 (by SYH99999)': 'MelBandRoformerBigSYHFTV1.ckpt', | |
| 'model_chorus_bs_roformer_ep_146 (by Sucial)': 'model_chorus_bs_roformer_ep_146_sdr_23.8613.ckpt', | |
| 'model_chorus_bs_roformer_ep_267 (by Sucial)': 'model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt', | |
| 'BS-Rofo-SW-Fixed (by jarredou)': 'BS-Rofo-SW-Fixed.ckpt', | |
| 'BS_ResurrectioN (by Gabox)': 'BS_ResurrectioN.ckpt', | |
| # === Original ROFORMER_MODELS === | |
| 'MelBand Roformer | Big Beta 6X by unwa': 'melband_roformer_big_beta6x.ckpt', | |
| 'MelBand Roformer Kim | Big Beta 4 FT by unwa': 'melband_roformer_big_beta4.ckpt', | |
| 'MelBand Roformer | Kim FT by unwa': 'kimmel_unwa_ft.ckpt', | |
| 'MelBand Roformer | Kim FT 2 by unwa': 'kimmel_unwa_ft2.ckpt', | |
| 'MelBand Roformer | Kim FT 2 Bleedless by unwa': 'kimmel_unwa_ft2_bleedless.ckpt', | |
| 'MelBand Roformer | Kim FT 3 Preview by unwa': 'kimmel_unwa_ft3_prev.ckpt', | |
| 'MelBand Roformer | Vocals FV1 by Gabox': 'mel_band_roformer_vocals_fv1_gabox.ckpt', | |
| 'MelBand Roformer | Vocals FV2 by Gabox': 'mel_band_roformer_vocals_fv2_gabox.ckpt', | |
| 'MelBand Roformer | Vocals FV3 by Gabox': 'mel_band_roformer_vocals_fv3_gabox.ckpt', | |
| 'MelBand Roformer | Vocals FV4 by Gabox': 'mel_band_roformer_vocals_fv4_gabox.ckpt', | |
| 'BS Roformer | Chorus Male-Female by Sucial': 'model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt', | |
| 'BS Roformer | Male-Female by aufr33': 'bs_roformer_male_female_by_aufr33_sdr_7.2889.ckpt', | |
| }, | |
| "Instrumentals": { | |
| # === From main project === | |
| 'Neo_InstVFX (by natanworkspace)': 'Neo_InstVFX.ckpt', | |
| 'BS-Roformer-Resurrection-Inst (by unwa)': 'BS-Roformer-Resurrection-Inst.ckpt', | |
| 'BS Roformer HyperACEv2 Inst (by unwa)': 'bs_roformer_inst_hyperacev2.ckpt', | |
| 'BS-Roformer-Large-Inst (by unwa)': 'bs_large_v2_inst.ckpt', | |
| 'BS Roformer FNO (by unwa)': 'bs_roformer_fno.ckpt', | |
| 'Rifforge final 14.24 (by meskvlla33)': 'rifforge_full_sdr_14.2436.ckpt', | |
| 'Inst_GaboxFv8 (by Gabox)': 'Inst_GaboxFv8.ckpt', | |
| 'Inst_GaboxFv9 (by Gabox)': 'Inst_GaboxFv9.ckpt', | |
| 'inst_gaboxFlowersV10 (by Gabox)': 'inst_gaboxFlowersV10.ckpt', | |
| 'INST Mel-Roformer v1 (by unwa)': 'melband_roformer_inst_v1.ckpt', | |
| 'INST Mel-Roformer v1e+ (by unwa)': 'inst_v1e_plus.ckpt', | |
| 'INST Mel-Roformer v1+ (by unwa)': 'inst_v1_plus_test.ckpt', | |
| 'INST Mel-Roformer v2 (by unwa)': 'melband_roformer_inst_v2.ckpt', | |
| 'INST MelBand-Roformer (by Becruily)': 'mel_band_roformer_instrumental_becruily.ckpt', | |
| 'inst_v1e (by unwa)': 'inst_v1e.ckpt', | |
| 'inst_gabox (by Gabox)': 'inst_gabox.ckpt', | |
| 'inst_gaboxBV1 (by Gabox)': 'inst_gaboxBv1.ckpt', | |
| 'inst_gaboxBV2 (by Gabox)': 'inst_gaboxBv2.ckpt', | |
| 'inst_gaboxFV2 (by Gabox)': 'inst_gaboxFv2.ckpt', | |
| 'inst_Fv3 (by Gabox)': 'inst_gaboxFv3.ckpt', | |
| 'Intrumental_Gabox (by Gabox)': 'intrumental_gabox.ckpt', | |
| 'inst_Fv4Noise (by Gabox)': 'inst_Fv4Noise.ckpt', | |
| 'inst_Fv4 (by Gabox)': 'inst_Fv4.ckpt', | |
| 'INSTV5 (by Gabox)': 'INSTV5.ckpt', | |
| 'INSTV5N (by Gabox)': 'INSTV5N.ckpt', | |
| 'INSTV6N (by Gabox)': 'INSTV6N.ckpt', | |
| 'Inst_GaboxV7 (by Gabox)': 'Inst_GaboxV7.ckpt', | |
| 'INSTV7N (by Gabox)': 'INSTV7N.ckpt', | |
| 'inst_fv7b (by Gabox)': 'inst_fv7b.ckpt', | |
| 'inst_fv7z (by Gabox)': 'Inst_GaboxFv7z.ckpt', | |
| 'Inst_FV8b (by Gabox)': 'Inst_FV8b.ckpt', | |
| # === Original ROFORMER_MODELS === | |
| 'MelBand Roformer | FVX by Gabox': 'mel_band_roformer_instrumental_fvx_gabox.ckpt', | |
| 'MelBand Roformer | INSTV8N by Gabox': 'mel_band_roformer_instrumental_instv8n_gabox.ckpt', | |
| 'MelBand Roformer | Instrumental V1 by unwa': 'melband_roformer_inst_v1.ckpt', | |
| 'MelBand Roformer | Instrumental V2 by unwa': 'melband_roformer_inst_v2.ckpt', | |
| 'MelBand Roformer | Instrumental 2 by Gabox': 'mel_band_roformer_instrumental_2_gabox.ckpt', | |
| 'MelBand Roformer | Instrumental 3 by Gabox': 'mel_band_roformer_instrumental_3_gabox.ckpt', | |
| 'MelBand Roformer | Instrumental Bleedless V1 by Gabox': 'mel_band_roformer_instrumental_bleedless_v1_gabox.ckpt', | |
| 'MelBand Roformer | Instrumental Bleedless V2 by Gabox': 'mel_band_roformer_instrumental_bleedless_v2_gabox.ckpt', | |
| 'MelBand Roformer | Inst V1E by unwa': 'inst_v1e.ckpt', | |
| 'MelBand Roformer | Inst V1E+ by unwa': 'inst_v1e_plus.ckpt', | |
| 'MelBand Roformer | INSTV5N by Gabox': 'mel_band_roformer_instrumental_instv5n_gabox.ckpt', | |
| 'MelBand Roformer | INSTV6N by Gabox': 'mel_band_roformer_instrumental_instv6n_gabox.ckpt', | |
| 'MelBand Roformer | INSTV7 by Gabox': 'mel_band_roformer_instrumental_instv7_gabox.ckpt', | |
| }, | |
| "InstVoc Duality": { | |
| 'MelBand Roformer Kim | InstVoc Duality V1 by Unwa': 'melband_roformer_instvoc_duality_v1.ckpt', | |
| 'MelBand Roformer Kim | InstVoc Duality V2 by Unwa': 'melband_roformer_instvox_duality_v2.ckpt', | |
| 'INST-VOC Duality v1 (by unwa)': 'melband_roformer_instvoc_duality_v1.ckpt', | |
| 'INST-VOC Duality v2 (by unwa)': 'melband_roformer_instvox_duality_v2.ckpt', | |
| }, | |
| "De-Reverb": { | |
| 'DE-REVERB MDX23C (by aufr33 & jarredou)': 'dereverb_mdx23c_sdr_6.9096.ckpt', | |
| 'DE-REVERB MelBand-Roformer 19.1729 (by anvuew)': 'dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt', | |
| 'DE-REVERB-Echo MelBand-Roformer (by Sucial)': 'dereverb-echo_mel_band_roformer_sdr_10.0169.ckpt', | |
| 'dereverb_less_aggressive (by anvuew)': 'dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt', | |
| 'dereverb_mono (by anvuew)': 'dereverb_mel_band_roformer_mono_anvuew_sdr_20.4029.ckpt', | |
| 'dereverb-echo 128_4_4 (by Sucial)': 'dereverb-echo_128_4_4_mel_band_roformer_sdr_dry_12.4235.ckpt', | |
| 'dereverb_echo_mbr_v2 (by Sucial)': 'dereverb_echo_mbr_v2_sdr_dry_13.4843.ckpt', | |
| 'de_big_reverb_mbr_ep_362 (by Sucial)': 'de_big_reverb_mbr_ep_362.ckpt', | |
| 'de_super_big_reverb_mbr_ep_346 (by Sucial)': 'de_super_big_reverb_mbr_ep_346.ckpt', | |
| 'dereverb_room (by anvuew)': 'dereverb_room_anvuew_sdr_13.7432.ckpt', | |
| # === Original ROFORMER_MODELS === | |
| 'MelBand Roformer | De-Reverb by anvuew': 'dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt', | |
| 'MelBand Roformer | De-Reverb Less Aggressive by anvuew': 'dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt', | |
| 'MelBand Roformer | De-Reverb-Echo V2 by Sucial': 'dereverb-echo_mel_band_roformer_sdr_13.4843_v2.ckpt', | |
| 'MelBand Roformer | De-Reverb-Echo Fused by Sucial': 'dereverb_echo_mbr_fused.ckpt', | |
| }, | |
| "Denoise": { | |
| 'DENOISE MelBand-Roformer-1 (by aufr33)': 'denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt', | |
| 'DENOISE MelBand-Roformer-2 aggr (by aufr33)': 'denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt', | |
| 'denoisedebleed (by Gabox)': 'denoisedebleed.ckpt', | |
| 'bleed_suppressor_v1 (by unwa)': 'bleed_suppressor_v1.ckpt', | |
| # === Original ROFORMER_MODELS === | |
| 'Mel-Roformer-Denoise-Aufr33': 'denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt', | |
| 'Mel-Roformer-Denoise-Aufr33-Aggr': 'denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt', | |
| 'MelBand Roformer | Denoise by Gabox': 'mel_band_roformer_denoise_gabox.ckpt', | |
| 'MelBand Roformer | Karaoke by Gabox': 'mel_band_roformer_karaoke_gabox.ckpt', | |
| 'MelBand Roformer | Karaoke by becruily': 'mel_band_roformer_karaoke_becruily.ckpt', | |
| }, | |
| "Karaoke": { | |
| 'KARAOKE MelBand-Roformer (by aufr33 & viperx)': 'mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt', | |
| 'KaraokeGabox (by Gabox)': 'Karaoke_GaboxV1.ckpt', | |
| 'bs_karaoke_gabox_IS (by Gabox)': 'bs_karaoke_gabox_IS.ckpt', | |
| 'bs_roformer_karaoke_frazer_becruily': 'bs_roformer_karaoke_frazer_becruily.ckpt', | |
| 'mel_band_roformer_karaoke_becruily': 'mel_band_roformer_karaoke_becruily.ckpt', | |
| }, | |
| "4-Stem": { | |
| '4STEMS SCNet MUSDB18 (by starrytong)': 'scnet_checkpoint_musdb18.ckpt', | |
| '4STEMS SCNet XL MUSDB18 (by ZFTurbo)': 'model_scnet_ep_54_sdr_9.8051.ckpt', | |
| '4STEMS SCNet Large (by starrytong)': 'SCNet-large_starrytong_fixed.ckpt', | |
| '4STEMS BS-Roformer MUSDB18 (by ZFTurbo)': 'model_bs_roformer_ep_17_sdr_9.6568.ckpt', | |
| 'MelBandRoformer4StemFTLarge (by SYH99999)': 'MelBandRoformer4StemFTLarge.ckpt', | |
| }, | |
| "General Purpose": { | |
| # === From main project === | |
| 'OTHER BS-Roformer 1053 (by viperx)': 'model_bs_roformer_ep_937_sdr_10.5309.ckpt', | |
| 'CROWD-REMOVAL MelBand-Roformer (by aufr33)': 'mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt', | |
| 'CINEMATIC BandIt Plus (by kwatcharasupat)': 'model_bandit_plus_dnr_sdr_11.47.chpt', | |
| 'CINEMATIC BandIt v2 multi (by kwatcharasupat)': 'checkpoint-multi_state_dict.ckpt', | |
| 'DRUMSEP MDX23C 6stem (by aufr33 & jarredou)': 'aufr33-jarredou_DrumSep_model_mdx23c_ep_141_sdr_10.8059.ckpt', | |
| 'bs_hyperace (by unwa)': 'bs_hyperace.ckpt', | |
| 'becruily_deux (by becruily)': 'becruily_deux.ckpt', | |
| 'becruily_guitar (by becruily)': 'becruily_guitar.ckpt', | |
| 'aspiration MelBand-Roformer (by Sucial)': 'aspiration_mel_band_roformer_sdr_18.9845.ckpt', | |
| 'mdx23c_similarity (by ZFTurbo)': 'model_mdx23c_ep_271_l1_freq_72.2383.ckpt', | |
| 'Lead_Rhythm_Guitar (by listra92)': 'model_mel_band_roformer_ep_72_sdr_3.2232.ckpt', | |
| 'last_bs_roformer_4stem (by Amane)': 'last_bs_roformer.ckpt', | |
| 'bs_roformer_4stems_ft (by SYH99999)': 'bs_roformer_4stems_ft.pth', | |
| 'CINEMATIC BandIt v2 Eng (by kwatcharasupat)': 'checkpoint-eng_state_dict.ckpt', | |
| # === Original ROFORMER_MODELS === | |
| 'BS-Roformer-Viperx-1297': 'model_bs_roformer_ep_317_sdr_12.9755.ckpt', | |
| 'BS-Roformer-Viperx-1296': 'model_bs_roformer_ep_368_sdr_12.9628.ckpt', | |
| 'BS-Roformer-De-Reverb': 'deverb_bs_roformer_8_384dim_10depth.ckpt', | |
| 'Mel-Roformer-Denoise-Aufr33': 'denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt', | |
| 'MelBand Roformer | Crowd Removal by aufr33': 'mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt', | |
| 'MelBand Roformer | Aspiration by Sucial': 'aspiration_mel_band_roformer_sdr_18.9845.ckpt', | |
| 'MelBand Roformer | Aspiration Less Aggressive by Sucial': 'aspiration_mel_band_roformer_less_aggr_sdr_18.1201.ckpt', | |
| } | |
| } | |
| # ─── Model Download URLs ──────────────────────────────────────────────────── | |
| # Maps checkpoint filenames to their download URLs (config + checkpoint + optional .py) | |
| # Extracted from main SESA project's MODEL_CONFIGS in model.py | |
| MODEL_DOWNLOAD_URLS = { | |
| # === Vocal Models === | |
| 'big_beta6x.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta6x.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta6x.ckpt'], | |
| 'big_beta6.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta6.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta6.ckpt'], | |
| 'kimmel_unwa_ft3_prev.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft3_prev.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft3_prev.ckpt'], | |
| 'model_vocals_mdx23c_sdr_10.17.ckpt': ['https://huggingface.co/ASesYusuf1/MODELS/resolve/main/model_2_stem_full_band_8k.yaml', 'https://huggingface.co/ASesYusuf1/MODELS/resolve/main/model_vocals_mdx23c_sdr_10.17.ckpt'], | |
| 'MelBandRoformer.ckpt': ['https://huggingface.co/KimberleyJSN/melbandroformer/resolve/main/MelBandRoformer.yaml', 'https://huggingface.co/KimberleyJSN/melbandroformer/resolve/main/MelBandRoformer.ckpt'], | |
| 'model_bs_roformer_ep_317_sdr_12.9755.ckpt': ['https://raw.githubusercontent.com/TRvlvr/application_data/main/mdx_model_data/mdx_c_configs/model_bs_roformer_ep_317_sdr_12.9755.yaml', 'https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/model_bs_roformer_ep_317_sdr_12.9755.ckpt'], | |
| 'model_bs_roformer_ep_368_sdr_12.9628.ckpt': ['https://raw.githubusercontent.com/TRvlvr/application_data/main/mdx_model_data/mdx_c_configs/model_bs_roformer_ep_368_sdr_12.9628.yaml', 'https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/model_bs_roformer_ep_368_sdr_12.9628.ckpt'], | |
| 'BS-Roformer_LargeV1.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-1076/resolve/main/BS-Roformer_LargeV1.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-1076/resolve/main/BS-Roformer_LargeV1.ckpt'], | |
| 'melband_roformer_big_beta4.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/melband_roformer_big_beta4.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/melband_roformer_big_beta4.ckpt'], | |
| 'big_beta5e.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta5e.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-big/resolve/main/big_beta5e.ckpt'], | |
| 'model_vocals_segm_models_sdr_9.77.ckpt': ['https://huggingface.co/ZFTurbo/MelBandRoformerVitLarge23/resolve/main/config_vocals_segm_models.yaml', 'https://huggingface.co/ZFTurbo/MelBandRoformerVitLarge23/resolve/main/model_vocals_segm_models_sdr_9.77.ckpt'], | |
| 'kimmel_unwa_ft.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft.ckpt'], | |
| 'kimmel_unwa_ft2.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft2.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft2.ckpt'], | |
| 'kimmel_unwa_ft2_bleedless.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft2.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-kim/resolve/main/kimmel_unwa_ft2_bleedless.ckpt'], | |
| 'mel_band_roformer_vocals_becruily.ckpt': ['https://huggingface.co/becruily/mel-band-roformer-vocals/resolve/main/config_vocals_becruily.yaml', 'https://huggingface.co/becruily/mel-band-roformer-vocals/resolve/main/mel_band_roformer_vocals_becruily.ckpt'], | |
| 'bs_roformer_male_female_by_aufr33_sdr_7.2889.ckpt': ['https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/bs_roformer_male_female_by_aufr33_sdr_7.2889.yaml', 'https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/bs_roformer_male_female_by_aufr33_sdr_7.2889.ckpt'], | |
| 'voc_gaboxBSR.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/bs_roformer_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/voc_gaboxBSR.ckpt'], | |
| 'voc_gabox.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.ckpt'], | |
| 'voc_Fv3.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_Fv3.ckpt'], | |
| 'FullnessVocalModel.ckpt': ['https://huggingface.co/SYH99999/MelBandRoformerSYHFTV3Epsilon/resolve/main/config.yaml', 'https://huggingface.co/SYH99999/MelBandRoformerSYHFTV3Epsilon/resolve/main/FullnessVocalModel.ckpt'], | |
| 'voc_fv4.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_fv4.ckpt'], | |
| 'voc_fv5.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_fv5.ckpt'], | |
| 'voc_fv6.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_fv6.ckpt'], | |
| 'voc_fv7.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_fv7.ckpt'], | |
| 'vocfv7beta1.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/vocfv7beta1.ckpt'], | |
| 'vocfv7beta2.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/vocfv7beta2.ckpt'], | |
| 'vocfv7beta3.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/voc_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/vocals/vocfv7beta3.ckpt'], | |
| 'MelBandRoformerSYHFTV3Epsilon.ckpt': ['https://huggingface.co/SYH99999/MelBandRoformerSYHFTV3Epsilon/resolve/main/config.yaml', 'https://huggingface.co/SYH99999/MelBandRoformerSYHFTV3Epsilon/resolve/main/MelBandRoformerSYHFTV3Epsilon.ckpt'], | |
| 'MelBandRoformerBigSYHFTV1.ckpt': ['https://huggingface.co/SYH99999/MelBandRoformerBigSYHFTV1/resolve/main/config.yaml', 'https://huggingface.co/SYH99999/MelBandRoformerBigSYHFTV1/resolve/main/MelBandRoformerBigSYHFTV1.ckpt'], | |
| 'model_chorus_bs_roformer_ep_146_sdr_23.8613.ckpt': ['https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/model_chorus_bs_roformer.yaml', 'https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/model_chorus_bs_roformer_ep_146_sdr_23.8613.ckpt'], | |
| 'model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt': ['https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/model_chorus_bs_roformer.yaml', 'https://huggingface.co/Sucial/Chorus_Male_Female_BS_RoFormer/resolve/main/model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt'], | |
| 'BS-Rofo-SW-Fixed.ckpt': ['https://huggingface.co/jarredou/BS-Rofo-SW-Fixed/resolve/main/BS-Rofo-SW-Fixed.yaml', 'https://huggingface.co/jarredou/BS-Rofo-SW-Fixed/resolve/main/BS-Rofo-SW-Fixed.ckpt'], | |
| 'bs_roformer_voc_hyperacev2.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-HyperACEv2/resolve/main/bs_roformer_voc_hyperacev2.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-HyperACEv2/resolve/main/bs_roformer_voc_hyperacev2.ckpt'], | |
| 'BS-Roformer-Resurrection.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-Resurrection/resolve/main/BS-Roformer-Resurrection.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-Resurrection/resolve/main/BS-Roformer-Resurrection.ckpt'], | |
| 'bs_roformer_revive3e.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive3e.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive3e.ckpt'], | |
| 'bs_roformer_revive2.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive2.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive2.ckpt'], | |
| 'bs_roformer_revive.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-Revive/resolve/main/bs_roformer_revive.ckpt'], | |
| 'karaoke_bs_roformer_anvuew.ckpt': ['https://huggingface.co/anvuew/karaoke_bs_roformer/resolve/main/karaoke_bs_roformer_anvuew.yaml', 'https://huggingface.co/anvuew/karaoke_bs_roformer/resolve/main/karaoke_bs_roformer_anvuew.ckpt'], | |
| 'BS_ResurrectioN.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/BS_ResurrectioN.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/BS_ResurrectioN.ckpt'], | |
| # === Instrumental Models === | |
| 'Neo_InstVFX.ckpt': ['https://huggingface.co/naitotomato/Neo_InstVFX/resolve/main/Neo_InstVFX.yaml', 'https://huggingface.co/naitotomato/Neo_InstVFX/resolve/main/Neo_InstVFX.ckpt'], | |
| 'BS-Roformer-Resurrection-Inst.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-Resurrection/resolve/main/BS-Roformer-Resurrection-Inst.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-Resurrection/resolve/main/BS-Roformer-Resurrection-Inst.ckpt'], | |
| 'bs_roformer_inst_hyperacev2.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-HyperACEv2/resolve/main/bs_roformer_inst_hyperacev2.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-HyperACEv2/resolve/main/bs_roformer_inst_hyperacev2.ckpt'], | |
| 'bs_large_v2_inst.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-1076/resolve/main/BS-Roformer_LargeV1.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-1076/resolve/main/bs_large_v2_inst.ckpt'], | |
| 'bs_roformer_fno.ckpt': ['https://huggingface.co/pcunwa/BS-Roformer-FNO/resolve/main/bs_roformer_fno.yaml', 'https://huggingface.co/pcunwa/BS-Roformer-FNO/resolve/main/bs_roformer_fno.ckpt'], | |
| 'rifforge_full_sdr_14.2436.ckpt': ['https://huggingface.co/meskvlla33/rifforge/resolve/main/rifforge_config.yaml', 'https://huggingface.co/meskvlla33/rifforge/resolve/main/rifforge_full_sdr_14.2436.ckpt'], | |
| 'melband_roformer_inst_v1.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/config_melbandroformer_inst.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/melband_roformer_inst_v1.ckpt'], | |
| 'inst_v1e_plus.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/config_melbandroformer_inst.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/inst_v1e_plus.ckpt'], | |
| 'inst_v1_plus_test.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/config_melbandroformer_inst.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/inst_v1_plus_test.ckpt'], | |
| 'melband_roformer_inst_v2.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/config_melbandroformer_inst.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/melband_roformer_inst_v2.ckpt'], | |
| 'mel_band_roformer_instrumental_becruily.ckpt': ['https://huggingface.co/becruily/mel-band-roformer-instrumental/resolve/main/config_instrumental_becruily.yaml', 'https://huggingface.co/becruily/mel-band-roformer-instrumental/resolve/main/mel_band_roformer_instrumental_becruily.ckpt'], | |
| 'inst_v1e.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/config_melbandroformer_inst.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-Inst/resolve/main/inst_v1e.ckpt'], | |
| 'inst_gabox.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.ckpt'], | |
| 'inst_gaboxBv1.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxBv1.ckpt'], | |
| 'inst_gaboxBv2.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxBv2.ckpt'], | |
| 'inst_gaboxFv2.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxFv2.ckpt'], | |
| 'inst_gaboxFv3.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxFv3.ckpt'], | |
| 'intrumental_gabox.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/intrumental_gabox.ckpt'], | |
| 'inst_Fv4Noise.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_Fv4Noise.ckpt'], | |
| 'inst_Fv4.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_Fv4.ckpt'], | |
| 'INSTV5.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/INSTV5.ckpt'], | |
| 'INSTV5N.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/INSTV5N.ckpt'], | |
| 'INSTV6N.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/INSTV6N.ckpt'], | |
| 'Inst_GaboxV7.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/Inst_GaboxV7.ckpt'], | |
| 'INSTV7N.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/INSTV7N.ckpt'], | |
| 'inst_fv7b.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/experimental/inst_fv7b.ckpt'], | |
| 'Inst_GaboxFv7z.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/Inst_GaboxFv7z.ckpt'], | |
| 'Inst_GaboxFv9.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/Inst_GaboxFv9.ckpt'], | |
| 'inst_gaboxFlowersV10.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/v10.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxFlowersV10.ckpt'], | |
| 'Inst_FV8b.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/experimental/Inst_FV8b.ckpt'], | |
| 'Inst_Fv8.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/experimental/Inst_Fv8.ckpt'], | |
| 'Inst_GaboxFv8.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/Inst_GaboxFv8.ckpt'], | |
| 'inst_gaboxFv1.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxFv1.ckpt'], | |
| 'INSTV6.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/INSTV6.ckpt'], | |
| 'gaboxFv1.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gabox.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/inst_gaboxFv1.ckpt'], | |
| # === InstVoc Duality === | |
| 'melband_roformer_instvoc_duality_v1.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-InstVoc-Duality/resolve/main/melband_roformer_instvoc_duality_v1.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-InstVoc-Duality/resolve/main/melband_roformer_instvoc_duality_v1.ckpt'], | |
| 'melband_roformer_instvox_duality_v2.ckpt': ['https://huggingface.co/pcunwa/Mel-Band-Roformer-InstVoc-Duality/resolve/main/melband_roformer_instvox_duality_v2.yaml', 'https://huggingface.co/pcunwa/Mel-Band-Roformer-InstVoc-Duality/resolve/main/melband_roformer_instvox_duality_v2.ckpt'], | |
| # === 4-Stem Models === | |
| 'scnet_checkpoint_musdb18.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.6/config_musdb18_scnet.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.6/scnet_checkpoint_musdb18.ckpt'], | |
| 'model_scnet_ep_54_sdr_9.8051.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.13/config_musdb18_scnet_xl.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.13/model_scnet_ep_54_sdr_9.8051.ckpt'], | |
| 'SCNet-large_starrytong_fixed.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.9/config_musdb18_scnet_large_starrytong.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.9/SCNet-large_starrytong_fixed.ckpt'], | |
| 'model_bs_roformer_ep_17_sdr_9.6568.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.12/config_bs_roformer_384_8_2_485100.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.12/model_bs_roformer_ep_17_sdr_9.6568.ckpt'], | |
| 'MelBandRoformer4StemFTLarge.ckpt': ['https://huggingface.co/SYH99999/MelBandRoformer4StemFTLarge/resolve/main/config.yaml', 'https://huggingface.co/SYH99999/MelBandRoformer4StemFTLarge/resolve/main/MelBandRoformer4StemFTLarge.ckpt'], | |
| # === Denoise Models === | |
| 'denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt': ['https://huggingface.co/jarredou/aufr33_MelBand_Denoise/resolve/main/model_mel_band_roformer_denoise.yaml', 'https://huggingface.co/jarredou/aufr33_MelBand_Denoise/resolve/main/denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt'], | |
| 'denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt': ['https://huggingface.co/jarredou/aufr33_MelBand_Denoise/resolve/main/model_mel_band_roformer_denoise.yaml', 'https://huggingface.co/jarredou/aufr33_MelBand_Denoise/resolve/main/denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt'], | |
| 'denoisedebleed.ckpt': ['https://huggingface.co/poiqazwsx/melband-roformer-denoise/resolve/main/model_mel_band_roformer_denoise.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/instrumental/denoisedebleed.ckpt'], | |
| 'bleed_suppressor_v1.ckpt': ['https://huggingface.co/ASesYusuf1/MODELS/resolve/main/config_bleed_suppressor_v1.yaml', 'https://huggingface.co/ASesYusuf1/MODELS/resolve/main/bleed_suppressor_v1.ckpt'], | |
| # === Dereverb Models === | |
| 'dereverb_mdx23c_sdr_6.9096.ckpt': ['https://huggingface.co/jarredou/aufr33_jarredou_MDXv3_DeReverb/resolve/main/config_dereverb_mdx23c.yaml', 'https://huggingface.co/jarredou/aufr33_jarredou_MDXv3_DeReverb/resolve/main/dereverb_mdx23c_sdr_6.9096.ckpt'], | |
| 'dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt': ['https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_anvuew.yaml', 'https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt'], | |
| 'dereverb-echo_mel_band_roformer_sdr_10.0169.ckpt': ['https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/config_dereverb-echo_mel_band_roformer.yaml', 'https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/dereverb-echo_mel_band_roformer_sdr_10.0169.ckpt'], | |
| 'dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt': ['https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_anvuew.yaml', 'https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt'], | |
| 'dereverb_mel_band_roformer_mono_anvuew_sdr_20.4029.ckpt': ['https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_anvuew.yaml', 'https://huggingface.co/anvuew/dereverb_mel_band_roformer/resolve/main/dereverb_mel_band_roformer_mono_anvuew_sdr_20.4029.ckpt'], | |
| 'dereverb-echo_128_4_4_mel_band_roformer_sdr_dry_12.4235.ckpt': ['https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/config_dereverb-echo_128_4_4_mel_band_roformer.yaml', 'https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/dereverb-echo_128_4_4_mel_band_roformer_sdr_dry_12.4235.ckpt'], | |
| 'dereverb_echo_mbr_v2_sdr_dry_13.4843.ckpt': ['https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/config_dereverb_echo_mbr_v2.yaml', 'https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/dereverb_echo_mbr_v2_sdr_dry_13.4843.ckpt'], | |
| 'de_big_reverb_mbr_ep_362.ckpt': ['https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/config_dereverb_echo_mbr_v2.yaml', 'https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/de_big_reverb_mbr_ep_362.ckpt'], | |
| 'de_super_big_reverb_mbr_ep_346.ckpt': ['https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/config_dereverb_echo_mbr_v2.yaml', 'https://huggingface.co/Sucial/Dereverb-Echo_Mel_Band_Roformer/resolve/main/de_super_big_reverb_mbr_ep_346.ckpt'], | |
| 'dereverb_room_anvuew_sdr_13.7432.ckpt': ['https://huggingface.co/anvuew/dereverb_room/resolve/main/dereverb_room_anvuew.yaml', 'https://huggingface.co/anvuew/dereverb_room/resolve/main/dereverb_room_anvuew_sdr_13.7432.ckpt'], | |
| # === Karaoke Models === | |
| 'mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt': ['https://huggingface.co/jarredou/aufr33-viperx-karaoke-melroformer-model/resolve/main/config_mel_band_roformer_karaoke.yaml', 'https://huggingface.co/jarredou/aufr33-viperx-karaoke-melroformer-model/resolve/main/mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt'], | |
| 'Karaoke_GaboxV1.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/karaoke/karaokegabox_1750911344.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/melbandroformers/karaoke/Karaoke_GaboxV1.ckpt'], | |
| 'bs_karaoke_gabox_IS.ckpt': ['https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/karaoke_bs_roformer.yaml', 'https://huggingface.co/GaboxR67/MelBandRoformers/resolve/main/bsroformers/bs_karaoke_gabox_IS.ckpt'], | |
| 'bs_roformer_karaoke_frazer_becruily.ckpt': ['https://huggingface.co/becruily/bs-roformer-karaoke/resolve/main/config_karaoke_frazer_becruily.yaml', 'https://huggingface.co/becruily/bs-roformer-karaoke/resolve/main/bs_roformer_karaoke_frazer_becruily.ckpt'], | |
| 'mel_band_roformer_karaoke_becruily.ckpt': ['https://huggingface.co/becruily/mel-band-roformer-karaoke/resolve/main/config_karaoke_becruily.yaml', 'https://huggingface.co/becruily/mel-band-roformer-karaoke/resolve/main/mel_band_roformer_karaoke_becruily.ckpt'], | |
| # === Other / General Purpose Models === | |
| 'model_bs_roformer_ep_937_sdr_10.5309.ckpt': ['https://raw.githubusercontent.com/TRvlvr/application_data/main/mdx_model_data/mdx_c_configs/model_bs_roformer_ep_937_sdr_10.5309.yaml', 'https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/model_bs_roformer_ep_937_sdr_10.5309.ckpt'], | |
| 'mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.4/model_mel_band_roformer_crowd.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.4/mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt'], | |
| 'model_bandit_plus_dnr_sdr_11.47.chpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.3/config_dnr_bandit_bsrnn_multi_mus64.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v.1.0.3/model_bandit_plus_dnr_sdr_11.47.chpt'], | |
| 'checkpoint-multi_state_dict.ckpt': ['https://raw.githubusercontent.com/ZFTurbo/Music-Source-Separation-Training/refs/heads/main/configs/config_dnr_bandit_v2_mus64.yaml', 'https://huggingface.co/jarredou/banditv2_state_dicts_only/resolve/main/checkpoint-multi_state_dict.ckpt'], | |
| 'aufr33-jarredou_DrumSep_model_mdx23c_ep_141_sdr_10.8059.ckpt': ['https://github.com/jarredou/models/releases/download/aufr33-jarredou_MDX23C_DrumSep_model_v0.1/aufr33-jarredou_DrumSep_model_mdx23c_ep_141_sdr_10.8059.yaml', 'https://github.com/jarredou/models/releases/download/aufr33-jarredou_MDX23C_DrumSep_model_v0.1/aufr33-jarredou_DrumSep_model_mdx23c_ep_141_sdr_10.8059.ckpt'], | |
| 'bs_hyperace.ckpt': [('https://huggingface.co/pcunwa/BS-Roformer-HyperACE/resolve/main/config.yaml', 'config_hyperace.yaml'), 'https://huggingface.co/pcunwa/BS-Roformer-HyperACE/resolve/main/bs_hyperace.ckpt'], | |
| 'becruily_deux.ckpt': ['https://huggingface.co/becruily/mel-band-roformer-deux/resolve/main/config_deux_becruily.yaml', 'https://huggingface.co/becruily/mel-band-roformer-deux/resolve/main/becruily_deux.ckpt'], | |
| 'becruily_guitar.ckpt': ['https://huggingface.co/becruily/mel-band-roformer-guitar/resolve/main/config_guitar_becruily.yaml', 'https://huggingface.co/becruily/mel-band-roformer-guitar/resolve/main/becruily_guitar.ckpt'], | |
| 'aspiration_mel_band_roformer_sdr_18.9845.ckpt': ['https://huggingface.co/Sucial/Aspiration_Mel_Band_Roformer/resolve/main/config_aspiration_mel_band_roformer.yaml', 'https://huggingface.co/Sucial/Aspiration_Mel_Band_Roformer/resolve/main/aspiration_mel_band_roformer_sdr_18.9845.ckpt'], | |
| 'model_mdx23c_ep_271_l1_freq_72.2383.ckpt': ['https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.10/config_mdx23c_similarity.yaml', 'https://github.com/ZFTurbo/Music-Source-Separation-Training/releases/download/v1.0.10/model_mdx23c_ep_271_l1_freq_72.2383.ckpt'], | |
| 'model_mel_band_roformer_ep_72_sdr_3.2232.ckpt': ['https://huggingface.co/listra92/MyModels/resolve/main/misc/config_mel_band_roformer_Lead_Rhythm_Guitar.yaml', 'https://huggingface.co/listra92/MyModels/resolve/main/misc/model_mel_band_roformer_ep_72_sdr_3.2232.ckpt'], | |
| 'last_bs_roformer.ckpt': ['https://huggingface.co/listra92/MyModels/resolve/main/misc/config.yaml', 'https://huggingface.co/listra92/MyModels/resolve/main/misc/last_bs_roformer.ckpt'], | |
| 'bs_roformer_4stems_ft.pth': ['https://huggingface.co/SYH99999/bs_roformer_4stems_ft/resolve/main/config.yaml', 'https://huggingface.co/SYH99999/bs_roformer_4stems_ft/resolve/main/bs_roformer_4stems_ft.pth'], | |
| 'checkpoint-eng_state_dict.ckpt': ['https://huggingface.co/jarredou/banditv2_state_dicts_only/resolve/main/config_dnr_bandit_v2_mus64.yaml', 'https://huggingface.co/jarredou/banditv2_state_dicts_only/resolve/main/checkpoint-eng_state_dict.ckpt'], | |
| } | |
| # Custom model URLs for models needing a custom .py file | |
| MODEL_CUSTOM_PY_URLS = { | |
| 'bs_hyperace.ckpt': 'https://huggingface.co/pcunwa/BS-Roformer-HyperACE/resolve/main/bs_roformer.py', | |
| } | |
| def ensure_model_files_downloaded(checkpoint_filename, model_file_dir=None): | |
| """Pre-download all files for a model (checkpoint + config + optional .py) before loading. | |
| This must be called BEFORE separator.load_model() so the bypass in separator.py | |
| can find the model file locally and skip the registry check. | |
| Args: | |
| checkpoint_filename: The checkpoint filename (e.g. 'big_beta6x.ckpt') | |
| model_file_dir: Target directory (defaults to MODEL_CACHE_DIR) | |
| Returns: (success: bool, message: str) | |
| """ | |
| target_dir = model_file_dir or MODEL_CACHE_DIR | |
| os.makedirs(target_dir, exist_ok=True) | |
| urls = MODEL_DOWNLOAD_URLS.get(checkpoint_filename) | |
| if not urls: | |
| # Not in our URL registry — might be a base model handled by audio-separator | |
| logger.debug(f"No download URLs for {checkpoint_filename}, assuming base model") | |
| return True, "Base model (no pre-download needed)" | |
| for url_entry in urls: | |
| # Handle (url, target_filename) tuples for files that need renaming | |
| if isinstance(url_entry, tuple): | |
| url, target_name = url_entry | |
| else: | |
| url = url_entry | |
| target_name = os.path.basename(urllib.parse.urlparse(url).path.split('?')[0]) | |
| success, result = download_model_from_url(url, target_name, target_dir) | |
| if not success: | |
| return False, f"Failed to download {target_name}: {result}" | |
| # Download custom .py if needed | |
| py_url = MODEL_CUSTOM_PY_URLS.get(checkpoint_filename) | |
| if py_url: | |
| py_name = os.path.basename(urllib.parse.urlparse(py_url).path.split('?')[0]) | |
| success, result = download_model_from_url(py_url, py_name, target_dir) | |
| if not success: | |
| logger.warning(f"Failed to download custom .py: {result}") | |
| return True, f"All files downloaded for {checkpoint_filename}" | |
| # ─── URL Helpers ───────────────────────────────────────────────────────────── | |
| def fix_huggingface_url(url): | |
| """Auto-fix Hugging Face URLs to use /resolve/main/ for direct download.""" | |
| if not url: | |
| return url | |
| url = url.strip() | |
| # Convert 'blob' to 'resolve' for HF URLs | |
| if 'huggingface.co' in url and '/blob/' in url: | |
| url = url.replace('/blob/', '/resolve/') | |
| return url | |
| def download_model_from_url(url, target_filename=None, target_dir=None): | |
| """Download a model file from URL to the model cache directory. | |
| Args: | |
| url: Direct download URL | |
| target_filename: Optional filename (auto-detected from URL if not provided) | |
| target_dir: Target directory (defaults to MODEL_CACHE_DIR) | |
| Returns: (success: bool, file_path: str or error message) | |
| """ | |
| if not url or not url.strip(): | |
| return False, "URL is required" | |
| url = fix_huggingface_url(url.strip()) | |
| save_dir = target_dir or MODEL_CACHE_DIR | |
| os.makedirs(save_dir, exist_ok=True) | |
| if not target_filename: | |
| parsed = urllib.parse.urlparse(url) | |
| target_filename = os.path.basename(parsed.path.split('?')[0]) | |
| file_path = os.path.join(save_dir, target_filename) | |
| # Skip if already exists | |
| if os.path.exists(file_path) and os.path.getsize(file_path) > 0: | |
| logger.info(f"Model file already exists: {file_path}") | |
| return True, file_path | |
| try: | |
| logger.info(f"Downloading: {url} → {file_path}") | |
| response = requests.get(url, stream=True, timeout=300) | |
| response.raise_for_status() | |
| total_size = int(response.headers.get('content-length', 0)) | |
| downloaded = 0 | |
| with open(file_path, 'wb') as f: | |
| for chunk in response.iter_content(chunk_size=8192): | |
| f.write(chunk) | |
| downloaded += len(chunk) | |
| if os.path.exists(file_path) and os.path.getsize(file_path) > 0: | |
| size_mb = os.path.getsize(file_path) / (1024 * 1024) | |
| logger.info(f"✅ Downloaded: {target_filename} ({size_mb:.1f} MB)") | |
| return True, file_path | |
| else: | |
| return False, f"Download failed: file is empty" | |
| except Exception as e: | |
| # Clean up partial download | |
| if os.path.exists(file_path): | |
| try: | |
| os.remove(file_path) | |
| except: | |
| pass | |
| return False, f"Download error: {str(e)}" | |
| # ─── Custom Model Management ──────────────────────────────────────────────── | |
| def load_custom_models(): | |
| """Load custom models from JSON file. | |
| Custom models are stored as: | |
| { | |
| "Model Name": { | |
| "checkpoint_url": "https://...", | |
| "config_url": "https://...", # optional | |
| "custom_model_url": "https://...", # optional .py file | |
| "checkpoint_filename": "model.ckpt" | |
| } | |
| } | |
| """ | |
| if os.path.exists(CUSTOM_MODELS_FILE): | |
| try: | |
| with open(CUSTOM_MODELS_FILE, 'r', encoding='utf-8') as f: | |
| return json.load(f) | |
| except Exception as e: | |
| logger.error(f"Error loading custom models: {e}") | |
| return {} | |
| def save_custom_models(models): | |
| """Save custom models to JSON file.""" | |
| os.makedirs(os.path.dirname(os.path.abspath(CUSTOM_MODELS_FILE)), exist_ok=True) | |
| with open(CUSTOM_MODELS_FILE, 'w', encoding='utf-8') as f: | |
| json.dump(models, f, indent=2, ensure_ascii=False) | |
| def add_custom_model(model_name, checkpoint_url, config_url=None, custom_model_url=None): | |
| """Add a custom model with download URLs. | |
| Args: | |
| model_name: Display name for the model | |
| checkpoint_url: Direct URL to the .ckpt/.pth checkpoint file | |
| config_url: Optional URL to the config .yaml file | |
| custom_model_url: Optional URL to a custom .py model file | |
| Returns: (success: bool, message: str) | |
| """ | |
| if not model_name or not model_name.strip(): | |
| return False, "Model name is required" | |
| if not checkpoint_url or not checkpoint_url.strip(): | |
| return False, "Checkpoint URL is required" | |
| model_name = model_name.strip() | |
| checkpoint_url = fix_huggingface_url(checkpoint_url.strip()) | |
| config_url = fix_huggingface_url(config_url.strip()) if config_url and config_url.strip() else None | |
| custom_model_url = fix_huggingface_url(custom_model_url.strip()) if custom_model_url and custom_model_url.strip() else None | |
| # Extract checkpoint filename from URL | |
| parsed = urllib.parse.urlparse(checkpoint_url) | |
| checkpoint_filename = os.path.basename(parsed.path.split('?')[0]) | |
| if not checkpoint_filename: | |
| return False, "Could not extract filename from checkpoint URL" | |
| models = load_custom_models() | |
| if model_name in models: | |
| return False, f"Model '{model_name}' already exists" | |
| models[model_name] = { | |
| 'checkpoint_url': checkpoint_url, | |
| 'config_url': config_url, | |
| 'custom_model_url': custom_model_url, | |
| 'checkpoint_filename': checkpoint_filename, | |
| } | |
| save_custom_models(models) | |
| return True, f"✅ Model '{model_name}' added successfully" | |
| def delete_custom_model(model_name): | |
| """Delete a custom model and optionally its cached files. | |
| Returns: (success: bool, message: str) | |
| """ | |
| models = load_custom_models() | |
| if model_name not in models: | |
| return False, f"Model '{model_name}' not found" | |
| # Try to clean up downloaded files | |
| model_config = models[model_name] | |
| if isinstance(model_config, dict): | |
| ckpt_file = os.path.join(MODEL_CACHE_DIR, model_config.get('checkpoint_filename', '')) | |
| if os.path.exists(ckpt_file): | |
| try: | |
| os.remove(ckpt_file) | |
| logger.info(f"Deleted cached model file: {ckpt_file}") | |
| except Exception as e: | |
| logger.warning(f"Could not delete cached file: {e}") | |
| del models[model_name] | |
| save_custom_models(models) | |
| return True, f"✅ Model '{model_name}' deleted" | |
| def get_custom_models_list(): | |
| """Get list of custom models as [(name, url)] tuples.""" | |
| models = load_custom_models() | |
| result = [] | |
| for name, config in models.items(): | |
| if isinstance(config, dict): | |
| result.append((name, config.get('checkpoint_url', ''))) | |
| else: | |
| result.append((name, str(config))) | |
| return result | |
| def ensure_custom_model_downloaded(model_name): | |
| """Download custom model files if not already in cache. | |
| Returns: (success: bool, checkpoint_filename: str or error) | |
| """ | |
| models = load_custom_models() | |
| if model_name not in models: | |
| return False, f"Custom model '{model_name}' not found" | |
| config = models[model_name] | |
| if not isinstance(config, dict): | |
| # Legacy format: just a filename string | |
| return True, str(config) | |
| # Download checkpoint | |
| ckpt_url = config.get('checkpoint_url') | |
| ckpt_filename = config.get('checkpoint_filename') | |
| if ckpt_url: | |
| success, result = download_model_from_url(ckpt_url, ckpt_filename) | |
| if not success: | |
| return False, f"Failed to download checkpoint: {result}" | |
| # Download config if provided | |
| config_url = config.get('config_url') | |
| if config_url: | |
| config_filename = f"config_{model_name.replace(' ', '_').lower()}.yaml" | |
| success, result = download_model_from_url(config_url, config_filename) | |
| if not success: | |
| logger.warning(f"Failed to download config: {result}") | |
| # Download custom .py if provided | |
| py_url = config.get('custom_model_url') | |
| if py_url: | |
| py_filename = os.path.basename(urllib.parse.urlparse(py_url).path.split('?')[0]) | |
| success, result = download_model_from_url(py_url, py_filename) | |
| if not success: | |
| logger.warning(f"Failed to download custom .py: {result}") | |
| return True, ckpt_filename | |
| def get_all_models(): | |
| """Get EXTENDED_MODELS merged with custom models under 'Custom Models' category. | |
| Custom models are shown as {name: checkpoint_filename} for dropdown compatibility. | |
| """ | |
| all_models = dict(EXTENDED_MODELS) | |
| custom = load_custom_models() | |
| if custom: | |
| # Flatten custom models to {name: checkpoint_filename} for UI dropdowns | |
| custom_flat = {} | |
| for name, config in custom.items(): | |
| if isinstance(config, dict): | |
| custom_flat[name] = config.get('checkpoint_filename', '') | |
| else: | |
| custom_flat[name] = str(config) | |
| all_models["Custom Models"] = custom_flat | |
| return all_models | |
| def get_model_choices(category): | |
| """Get model choices for a given category.""" | |
| all_models = get_all_models() | |
| return list(all_models.get(category, {}).keys()) | |
| def get_categories(): | |
| """Get all available categories.""" | |
| return list(get_all_models().keys()) | |
| def find_model_filename(model_key): | |
| """Find checkpoint filename for a given model display name. | |
| For custom models, also ensures the file is downloaded to cache. | |
| """ | |
| # Check built-in models first | |
| for category, models in EXTENDED_MODELS.items(): | |
| if model_key in models: | |
| return models[model_key] | |
| # Check custom models | |
| custom = load_custom_models() | |
| if model_key in custom: | |
| config = custom[model_key] | |
| if isinstance(config, dict): | |
| # Auto-download from URL if needed | |
| success, result = ensure_custom_model_downloaded(model_key) | |
| if success: | |
| return result | |
| else: | |
| logger.error(f"Failed to download custom model '{model_key}': {result}") | |
| return None | |
| else: | |
| return str(config) | |
| return None | |
| # ─── Audio Segmentation Helpers ────────────────────────────────────────────── | |
| def get_audio_duration(file_path): | |
| """Get audio duration in seconds using ffprobe.""" | |
| try: | |
| result = subprocess.run( | |
| ['ffprobe', '-v', 'quiet', '-show_entries', 'format=duration', | |
| '-of', 'default=noprint_wrappers=1:nokey=1', file_path], | |
| capture_output=True, text=True, timeout=30 | |
| ) | |
| if result.returncode == 0 and result.stdout.strip(): | |
| return float(result.stdout.strip()) | |
| except Exception as e: | |
| logger.warning(f"Could not get duration for {file_path}: {e}") | |
| return 0 | |
| def split_audio_segments(input_path, output_dir, segment_duration=SEGMENT_DURATION): | |
| """Split audio into segments of given duration using ffmpeg. | |
| Returns list of segment file paths. | |
| """ | |
| os.makedirs(output_dir, exist_ok=True) | |
| base_name = os.path.splitext(os.path.basename(input_path))[0] | |
| total_duration = get_audio_duration(input_path) | |
| if total_duration <= 0: | |
| logger.error(f"Could not determine duration for {input_path}") | |
| return [] | |
| segments = [] | |
| seg_idx = 0 | |
| start_time = 0 | |
| while start_time < total_duration: | |
| seg_filename = f"{base_name}_seg{seg_idx:03d}.wav" | |
| seg_path = os.path.join(output_dir, seg_filename) | |
| cmd = [ | |
| 'ffmpeg', '-y', '-i', input_path, | |
| '-ss', str(start_time), | |
| '-t', str(segment_duration), | |
| '-acodec', 'pcm_s16le', | |
| '-ar', '44100', '-ac', '2', | |
| seg_path | |
| ] | |
| try: | |
| result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) | |
| if result.returncode == 0 and os.path.exists(seg_path): | |
| segments.append(seg_path) | |
| logger.info(f"✅ Segment {seg_idx}: {seg_filename}") | |
| else: | |
| logger.warning(f"⚠️ Failed to create segment {seg_idx}: {result.stderr[-200:]}") | |
| except Exception as e: | |
| logger.warning(f"⚠️ Error creating segment {seg_idx}: {e}") | |
| seg_idx += 1 | |
| start_time += segment_duration | |
| return segments | |
| def concatenate_audio_files(file_list, output_path, output_format='wav'): | |
| """Concatenate multiple audio files into one using ffmpeg concat. | |
| Returns: output file path or None on failure. | |
| """ | |
| if not file_list: | |
| return None | |
| if len(file_list) == 1: | |
| shutil.copy(file_list[0], output_path) | |
| return output_path | |
| concat_list = output_path + '.concat.txt' | |
| try: | |
| with open(concat_list, 'w') as f: | |
| for fp in file_list: | |
| f.write(f"file '{fp}'\n") | |
| cmd = [ | |
| 'ffmpeg', '-y', '-f', 'concat', '-safe', '0', | |
| '-i', concat_list, '-c', 'copy', output_path | |
| ] | |
| result = subprocess.run(cmd, capture_output=True, text=True, timeout=600) | |
| if result.returncode == 0 and os.path.exists(output_path): | |
| return output_path | |
| else: | |
| logger.error(f"Concatenation failed: {result.stderr[-300:]}") | |
| return None | |
| except Exception as e: | |
| logger.error(f"Concatenation error: {e}") | |
| return None | |
| finally: | |
| if os.path.exists(concat_list): | |
| try: | |
| os.remove(concat_list) | |
| except: | |
| pass | |
| def concatenate_segment_outputs(output_dir, output_format='wav'): | |
| """After processing segments, concatenate per-instrument outputs. | |
| Each segment produces files like: seg000_vocals.wav, seg000_instrumental.wav | |
| This function concatenates all vocal segments, all instrumental segments, etc. | |
| """ | |
| # Order matters: check longer names first to avoid substring conflicts | |
| instrument_types = ['instrumental', 'instrument', 'phaseremix', 'vocals', 'drum', | |
| 'bass', 'other', 'effects', 'speech', 'music', 'dry', | |
| 'male', 'female', 'bleed', 'karaoke'] | |
| output_files = sorted(os.listdir(output_dir)) | |
| already_processed = set() | |
| for inst_type in instrument_types: | |
| # Regex exact suffix matching: _instrument. but NOT _instrumental. | |
| pattern = re.compile(r'_' + re.escape(inst_type) + r'\.', re.IGNORECASE) | |
| inst_files = sorted([ | |
| os.path.join(output_dir, f) for f in output_files | |
| if pattern.search(f) and '_seg' in f.lower() and f not in already_processed | |
| ]) | |
| if len(inst_files) <= 1: | |
| continue | |
| for f in inst_files: | |
| already_processed.add(os.path.basename(f)) | |
| logger.info(f"🔗 Concatenating {len(inst_files)} {inst_type} segments...") | |
| # Determine output filename (remove _segXXX from first segment's name) | |
| first_name = os.path.basename(inst_files[0]) | |
| concat_output_name = re.sub(r'_seg\d+', '', first_name) | |
| concat_output = os.path.join(output_dir, concat_output_name) | |
| result = concatenate_audio_files(inst_files, concat_output, output_format) | |
| if result: | |
| # Remove segment files | |
| for seg_file in inst_files: | |
| try: | |
| os.remove(seg_file) | |
| except: | |
| pass | |
| logger.info(f"✅ Concatenated {inst_type}: {os.path.basename(concat_output)}") | |
| else: | |
| logger.warning(f"⚠️ Concatenation failed for {inst_type}") | |