SESA_Fast_Separation / models_config.py
ASesYusuf1's picture
Create models_config.py
bcc6e08 verified
"""
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}")