Merge pull request #5 from Meisoftcoltd/fix/readme-and-renaming-7638010592883663595
Rename to ComfyUI-Demucs-AudioSeparator and update documentation
This commit is contained in:
@@ -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.
|
||||
|
||||
+5
-3
@@ -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"]
|
||||
|
||||
+11
-45
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user