Saltar a contenido

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).