Views
No views yet
TL;DR: Run your generated audio through this VAE's encode→decode round-trip to get spectral cleanup, reduced artifacts, and improved tonal coherence — like a neural audio polish pass.
Generated WAV → PP-VAE Encoder → Latent Space → PP-VAE Decoder → Cleaned WAV| File | Format | Precision | Size | Use With |
|---|---|---|---|---|
pp-vae-F32.gguf | GGUF | F32 (full) | 644 MB | Best quality — recommended for post-processing |
pp-vae-BF16.gguf | GGUF | BF16 | 322 MB | Good balance of quality and size |
pp-vae-F16.gguf | GGUF | F16 | 322 MB | Alternative half-precision |
pp-vae-F32.gguf for post-processing. Since PP-VAE runs once per song (not iteratively like DiT), the extra precision is worth the memory cost.models/
├── acestep-v15-turbo-BF16.gguf # DiT
├── acestep-5Hz-lm-BF16.gguf # LM
├── Qwen3-Embedding-BF16.gguf # Text encoder
├── vae-BF16.gguf # Primary VAE (for generation)
└── pp-vae-F32.gguf # ← PP-VAE (for post-processing)pp-vae). In HOT-Step CPP, enable PP-VAE Re-encode in the Post-Processing panel and adjust the blend slider.1# Full PP-VAE processing
2curl -X POST http://localhost:8085/pp-vae-reencode \
3 --data-binary @input.wav \
4 -H "Content-Type: audio/wav" \
5 -o output.wav
6
7# With 30% original blend
8curl -X POST "http://localhost:8085/pp-vae-reencode?blend=0.3" \
9 --data-binary @input.wav \
10 -H "Content-Type: audio/wav" \
11 -o output.wav0.0 = fully PP-VAE processed, 1.0 = fully original audio.1import torch
2from reencode import OobleckEncoder, OobleckDecoder, load_wav, save_wav
3
4# Download original checkpoint from:
5# https://huggingface.co/tencent/SongGeneration/resolve/main/ckpt/vae/autoencoder_music_1320k.ckpt
6
7ckpt = torch.load("autoencoder_music_1320k.ckpt", map_location="cpu", weights_only=False)
8sd = ckpt["state_dict"]
9
10# Build encoder (input: 2ch audio → 128-dim latent, split to 64-dim mean)
11encoder = OobleckEncoder(in_channels=2, channels=128, latent_dim=128,
12 c_mults=[1,2,4,8,16], strides=[2,4,4,6,10])
13enc_sd = {k.replace("encoder.", ""): v for k, v in sd.items() if k.startswith("encoder.")}
14encoder.load_state_dict(enc_sd)
15
16# Build decoder (input: 64-dim latent → 2ch audio)
17decoder = OobleckDecoder(out_channels=2, channels=128, latent_dim=64,
18 c_mults=[1,2,4,8,16], strides=[2,4,4,6,10])
19dec_sd = {k.replace("decoder.", ""): v for k, v in sd.items() if k.startswith("decoder.")}
20decoder.load_state_dict(dec_sd)
21
22# Re-encode
23audio = load_wav("input.wav") # [1, 2, T] @ 48kHz
24with torch.no_grad():
25 latent = encoder(audio.half().cuda())
26 mean, _ = latent.chunk(2, dim=1) # Use mean only (no sampling)
27 output = decoder(mean.half().cuda()).float().cpu()
28
29# RMS gain match and save
30input_rms = audio.pow(2).mean().sqrt()
31output_rms = output.pow(2).mean().sqrt()
32output = output * (input_rms / output_rms)
33save_wav("output.wav", output)| Parameter | Value |
|---|---|
| Architecture | AutoencoderOobleck |
| Source checkpoint | autoencoder_music_1320k.ckpt |
| Training steps | 1,320,000 |
| Audio channels | 2 (stereo) |
| Sample rate | 48,000 Hz |
| Encoder latent dim | 128 (split → 64 mean + 64 logvar) |
| Decoder latent dim | 64 |
| Base channels | 128 |
| Channel multipliers | [1, 2, 4, 8, 16] |
| Downsampling ratios | [2, 4, 4, 6, 10] |
| Total compression ratio | 1920× |
| Activation | Snake (α, β in log-space) |
| Weight normalisation | Yes (weight_v + weight_g parametrisation) |
| Parameters | ~168.7M (encoder + decoder) |
| GGUF architecture tag | pp-vae |
Encoder:
Conv1d(2→128, k=7) → 5× [3×ResUnit + Snake + StridedConv] → Snake → Conv1d(2048→128, k=3)
Strides: [2, 4, 4, 6, 10] → total 1920× downsampling
Decoder:
Conv1d(64→2048, k=7) → 5× [Snake + ConvTranspose1d + 3×ResUnit] → Snake → Conv1d(128→2, k=7)
Strides: [10, 6, 4, 4, 2] → total 1920× upsampling
ResUnit:
Snake → DilatedConv1d(k=7) → Snake → Conv1d(k=1) → + residual
Dilations per block: [1, 3, 9][!CAUTION] This model is derived from Tencent AI Lab's SongGeneration project and is subject to the SongGeneration License.The license restricts usage to academic, research, and education purposes only. Commercial or production use is explicitly prohibited.
autoencoder_music_1320k.ckpt weights — no retraining or weight modification was performed. All original license terms apply to these converted files.autoencoder_music_1320k.ckpt)encoder.layers.* / decoder.layers.* key naming to the acestep.cpp GGUF tensor naming convention[C] to [1, C, 1]pp-vae1@article{levo2025,
2 title={SongGeneration: A Song Generation System with Lyrics and Accompaniment},
3 author={Tencent AI Lab},
4 year={2025},
5 url={https://github.com/tencent-ailab/SongGeneration}
6}