Arquitectura Soberana — ACE-Step / DiffRhythm / SongGen híbridos¶
Esta arquitectura implementa los tres paradigmas líderes del estado del arte open-source (ACE-Step 1.5, DiffRhythm, SongGen) en una sola plataforma orquestada, evitando dependencias de SaaS como Suno AI o Udio.
1. Topología de componentes¶
┌────────────────────────────────────────────────────────────────────────┐
│ CLIENT (web / SDK / curl) │
└──────────────────────────────┬─────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────────┐
│ FastAPI Gateway (uvicorn, async, no toca GPU) │
│ POST /api/v1/generate → encola task │
│ POST /api/v1/inpaint → encola task de repintado │
│ GET /api/v1/status/:id → polling Celery AsyncResult │
│ GET /api/v1/voices → VAEs + LoRAs + rutas disponibles │
└──────────────────────────────┬─────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────────┐
│ Redis broker (cola + resultado) │
└──────────────────────────────┬─────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────────┐
│ Celery Worker (1 por GPU) │
│ │ │
│ ▼ │
│ SmartRouter.dispatch(payload) │
│ ├── mode="ace" / "fast" → ACEPipeline (Planner + DiT + DCW + VAE) │
│ ├── mode="dual_stem" → DualTrackSynthesizer (SongGen) │
│ └── mode="stereo_mix" → SongGenerator (existente) │
│ │
│ ModelSingleton mantiene los modelos en VRAM entre tareas │
└──────────────────────────────┬─────────────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────────┐
│ Master & Watermark │
│ master_chain → -14 LUFS / -1 dBTP │
│ AudioSeal embed_watermark (EU AI Act art. 50) │
└────────────────────────────────────────────────────────────────────────┘
2. Las tres arquitecturas y cuándo usar cada una¶
| Arquitectura | Paradigma | Ventaja | Cuándo elegirla |
|---|---|---|---|
| ACE-Step (src/ace) | Planner LM + DiT + Oobleck VAE | Coherencia >2 min, REPA multilingüe, edición latente | Default para canciones largas y producción profesional |
DiffRhythm-mode (ACE con n_steps bajo) |
Difusión latente pura paralela | Inferencia rápida (~10 s para 4 min en RTX 3090) | "fast" preset, demos rápidas |
| SongGen Dual-Track (src/songgen) | AR Transformer con interleaving A-V | Stems vocal/instrumental separados sincronizados | Cuando el ingeniero de mezcla necesita stems para postproducción |
| SongGenerator clásico (src/pipeline) | Codec RVQ + SVS + DSP mix | MVP rápido sin DiT pesado | Demo, M4 Pro, sin GPU CUDA |
El SmartRouter escoge automáticamente según mode y heurísticas del prompt.
3. ACE-Step: anatomía detallada¶
┌──────────────────────────┐
│ Planner LM @ 5 Hz │
│ Chain-of-Thought infer │
│ • BPM, key, structure │
│ • instruments, tags │
│ • expanded_description │
└────────────┬─────────────┘
│ MusicPlan
▼
┌──────────────────────┐ ┌─────────────────────────────────┐
│ Lyrics (estructured) │ ────► Sentence-Level Encoder (BiLSTM) │
└──────────────────────┘ └────────────┬────────────────────┘
│ cond_seq (B,S,D)
▼
┌───────────────┐ cond_global (B,D)
│ cond_global │ ─────────────────────────────┐
│ + cond_seq │ │
└──────┬────────┘ │
│ │
▼ ▼
┌─────────────────────────────────────────────────────┐
│ DiT (Diffusion Transformer) │
│ AdaLN-Zero + RoPE-less self-attn + cross-attn │
│ Pred: v-target (Salimans & Ho 2022) │
└────────────────────────┬────────────────────────────┘
│ predict v
▼
┌─────────────────────────────────────────────────────┐
│ DDIM Sampler con DCW │
│ - 50 steps default │
│ - cfg_scale 4.0 │
│ - DCW double-pass (Haar DWT 4 levels) │
│ → corrige SNR-t bias en latente │
└────────────────────────┬────────────────────────────┘
│ z_0 (B, latent_dim, T_lat)
▼
┌─────────────────────────────────────────────────────┐
│ AutoencoderOobleck.decode │
│ 2048× upsample → 44.1 kHz estéreo │
└────────────────────────┬────────────────────────────┘
▼
wav (B, 2, T)
Variantes del DiT (configurable en configs/ace_xl.yaml):¶
| Variante | dim | layers | heads | params | VRAM training |
|---|---|---|---|---|---|
| small | 768 | 24 | 12 | ~250M | A100-40 GB bs=8 + grad-ckpt |
| base | 1024 | 32 | 16 | ~1B | A100-40 GB bs=4 + grad-accum 4 |
| XL | 1536 | 48 | 24 | ~4B | 2×A100-80 GB con ZeRO-2 |
4. SongGen Dual-Track¶
- AR transformer (~1.3 B params estilo MusicGen) con DOS conjuntos de cabezas: K_vocal + K_acc.
- Delay pattern aplicado independientemente a cada track.
- Predicción intercalada con cross-attention al prompt + letras.
- Decodifica con el codec RVQ propio (compartido con la línea MVP) o X-Codec.
- Salida:
vocals_stem.wav+instrumental_stem.wav+master_preview.wav.
5. DCW — el secreto para canciones largas¶
Las DiTs sobre audio sufren acumulación de ruido HF más allá de ~2 min de generación. DCW corrige iterativamente en el dominio wavelet sin re-entrenar:
Para cada paso t del DDIM:
1. x0_pred = reconstruir x0 desde la predicción del DiT
2. dwt(x_t), dwt(x0_pred) # 4 niveles, Haar
3. cA_new = cA_0 + 0.05 * (cA_t - cA_0)
4. cD_k_new = cD_k_0 + (0.05 + 0.02*k) * (cD_k_t - cD_k_0)
5. x0_corregido = idwt({cA_new, cD_new})
6. (opcional double-mode) repetir con factor 0.5
Detalle en src/ace/dcw.py.
6. REPA — alineación con encoders preentrenados¶
Acelera convergencia y mejora calidad semántica:
- MERT (m-a-p/MERT-v1-95M) para audio musical.
- m-hubert (utter-project/mHuBERT-147) para voz multilingüe (>50 idiomas).
Durante training del DiT añade un término loss + λ * (1 - cosine_sim(proj(h_dit), enc(audio))).
Si transformers no está disponible, el módulo cae a embeddings aleatorios reproducibles (placeholder).
7. LoRA — fine-tune ligero por artista / estilo¶
python -m src.lora.train_lora \
--config configs/ace_xl.yaml \
--base-ckpt checkpoints/dit_base/LATEST \
--manifest data/manifests/my_artist.jsonl \
--output checkpoints/lora/my_artist \
--rank 8 --alpha 16 --steps 2000
Cada adapter pesa ~10 MB y se carga en runtime sin tocar pesos base. Multi-adapter con conmutación instantánea por petición.
8. Hardware recomendado (producción)¶
| Componente | Mínimo | Óptimo |
|---|---|---|
| GPU | 1× RTX 3090/4090 24 GB | 2× A100 80 GB o RTX 6000 Ada |
| Banda VRAM | 1008 GB/s GDDR6X | 2039 GB/s HBM2e |
| CPU | i9 / Ryzen 9 16C | EPYC / Threadripper Pro 32-64 C |
| RAM | 64 GB DDR4 | 256 GB DDR5 ECC |
| Disco | 2 TB NVMe PCIe Gen4 | 8 TB NVMe U.2 RAID 0 |
Inferencia ACE base @ 4 min de audio: - RTX 3090: ~10 s (n_steps=50, cfg=4, DCW double) - A100-40: ~2 s - M4 Pro 24 GB MPS: NO recomendado para producción (ratio ~30s para 30s de audio).