diff --git a/README.md b/README.md index d7ae106..e1035a4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ComfyUI-Demucs-Pro +# ComfyUI-Demucs-AudioSeparator Nodo personalizado para ComfyUI que permite la separación de fuentes de audio utilizando la tecnología **Meta Demucs (v4)**. Ideal para extraer voces, baterías, bajos y otros instrumentos con alta fidelidad. @@ -6,16 +6,14 @@ Nodo personalizado para ComfyUI que permite la separación de fuentes de audio u - **Soporte Demucs v4**: Incluye modelos Hybrid Transformer (HTDemucs). - **Separación de hasta 6 pistas**: Voces, Batería, Bajo, Otros, y soporte para Guitarra y Piano (en modelos compatibles). -- **Optimizado para NVIDIA RTX 3090**: Aprovecha la aceleración CUDA y soporte para precisiones optimizadas (**bfloat16/float16**). -- **Caché Global de Modelos**: Los modelos se mantienen en memoria para un intercambio ultrarrápido. -- **Barra de Progreso Nativa**: Integración completa con la barra de progreso de ComfyUI. +- **Aceleración CUDA**: Aprovecha la potencia de la GPU para procesos ultrarrápidos. - **Descarga Automática**: Los modelos se descargan automáticamente a `ComfyUI/models/demucs`. - **Estabilidad Mejorada**: Opción `split` para evitar errores de memoria (OOM) en audios largos. ## Instalación ### Vía ComfyUI Manager (Recomendado) -1. Busca `ComfyUI-Demucs-Pro` en el Manager. +1. Busca `ComfyUI-Demucs-AudioSeparator` en el Manager. 2. Haz clic en Install. 3. Reinicia ComfyUI. @@ -23,7 +21,7 @@ Nodo personalizado para ComfyUI que permite la separación de fuentes de audio u 1. Clona este repositorio en tu carpeta `custom_nodes`: ```bash cd ComfyUI/custom_nodes - git clone https://github.com/usuario/ComfyUI-Demucs-Pro + git clone https://github.com/usuario/ComfyUI-Demucs-AudioSeparator ``` 2. Instala las dependencias: ```bash @@ -49,9 +47,8 @@ Nodo personalizado para ComfyUI que permite la separación de fuentes de audio u ## Recomendaciones de Hardware -Para un rendimiento óptimo, se recomienda el uso de GPUs de gama alta: -- **NVIDIA RTX 3090 / 4090**: Rendimiento excepcional, permitiendo procesar canciones completas en segundos con altos valores de `shifts`. -- **VRAM**: Se recomienda al menos 8GB para modelos `htdemucs`. Si encuentras errores de memoria, asegúrate de tener activada la opción `split` y usar `bfloat16`. +Para un rendimiento óptimo, se recomienda el uso de GPUs con aceleración CUDA: +- **VRAM**: Se recomienda al menos 8GB para modelos `htdemucs`. Si encuentras errores de memoria, asegúrate de tener activada la opción `split`. ## Reporte de Errores Si encuentras algún problema, por favor abre un *Issue* en el repositorio de GitHub detallando tu sistema operativo, modelo de GPU y el error obtenido. diff --git a/__init__.py b/__init__.py index 5e6650e..ee7fbdd 100644 --- a/__init__.py +++ b/__init__.py @@ -1,11 +1,13 @@ -from .demucs_nodes import DemucsProNode +from .demucs_nodes import DemucsAudioSeparator NODE_CLASS_MAPPINGS = { - "DemucsProNode": DemucsProNode + "DemucsAudioSeparator": DemucsAudioSeparator, + "DemucsProNode": DemucsAudioSeparator # Legacy support } NODE_DISPLAY_NAME_MAPPINGS = { - "DemucsProNode": "⚡ Demucs Pro (Audio Separation) 🎵" + "DemucsAudioSeparator": "🎵 Demucs Audio Separator ⚡", + "DemucsProNode": "🎵 Demucs Audio Separator (Legacy) ⚡" } __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] diff --git a/demucs_nodes.py b/demucs_nodes.py index e32cd18..c1d82bd 100644 --- a/demucs_nodes.py +++ b/demucs_nodes.py @@ -26,10 +26,7 @@ except ImportError: from demucs.pretrained import get_model from demucs.apply import apply_model -# Global cache for models to support fast swapping and high RAM utilization -_MODEL_CACHE = {} - -class DemucsProNode: +class DemucsAudioSeparator: @classmethod def INPUT_TYPES(cls): return { @@ -55,18 +52,6 @@ class DemucsProNode: FUNCTION = "separate" CATEGORY = "🎵 Audio/Separation" - def separate(self, audio, model, device, precision, shifts, overlap, split, vocals, drums, bass, other, guitar, piano): - global _MODEL_CACHE - - # Handle model name mapping for compatibility with older workflows - model_map = { - "mdxc": "mdx_extra", - "mdxc_fb_ft": "mdx_extra_q" - } - model_name = model_map.get(model, model) - - print(f"⚡ [Demucs Pro] Starting separation process with model: {model_name}") - # Configure model path demucs_models_path = os.path.join(folder_paths.models_dir, "demucs") if not os.path.exists(demucs_models_path): @@ -76,38 +61,19 @@ class DemucsProNode: # Determine device if device == "cuda" and not torch.cuda.is_available(): - print("⚡ [Demucs Pro] CUDA not available, falling back to CPU") + print("⚡ CUDA not available, falling back to CPU") device = "cpu" device_obj = torch.device(device) - # Precision mapping - dtype = torch.float32 - if precision == "float16": - dtype = torch.float16 - elif precision == "bfloat16": - dtype = torch.bfloat16 + # Load model + print(f"⚡ Loading Demucs model: {model}...") + try: + model_inst = get_model(model) + except Exception as e: + raise RuntimeError(f"Failed to load Demucs model {model}: {str(e)}") - # Load or retrieve model from cache - if model_name in _MODEL_CACHE: - print(f"⚡ [Demucs Pro] Retrieving model '{model_name}' from cache...") - model_inst = _MODEL_CACHE[model_name] - else: - print(f"⚡ [Demucs Pro] Loading model '{model_name}'...") - try: - # Cache management: keep only 2 models to avoid excessive memory usage - if len(_MODEL_CACHE) >= 2: - evict_key = next(iter(_MODEL_CACHE)) - print(f"⚡ [Demucs Pro] Evicting model '{evict_key}' from cache.") - del _MODEL_CACHE[evict_key] - - model_inst = get_model(model_name) - _MODEL_CACHE[model_name] = model_inst - except Exception as e: - raise RuntimeError(f"⚡ [Demucs Pro] Failed to load Demucs model {model_name}: {str(e)}") - - # Move model to device and precision - model_inst.to(device_obj).to(dtype) + model_inst.to(device_obj) model_inst.eval() # Prepare audio @@ -123,7 +89,7 @@ class DemucsProNode: # Resample if necessary if sr != model_inst.samplerate: - print(f"⚡ [Demucs Pro] Resampling audio from {sr} to {model_inst.samplerate}...") + print(f"⚡ Resampling audio from {sr} to {model_inst.samplerate}...") resampler = torchaudio.transforms.Resample(sr, model_inst.samplerate).to(device_obj) waveform = resampler(waveform) @@ -147,7 +113,7 @@ class DemucsProNode: pbar.update_absolute(p_val) # Apply model - print(f"⚡ [Demucs Pro] Separating audio (shifts={shifts}, overlap={overlap}, split={split}, precision={precision})...") + print(f"⚡ Separating audio with {model} (shifts={shifts}, overlap={overlap}, split={split})...") try: with torch.no_grad(): # Check if the installed version of apply_model supports a callback