| """Reusable loaders for DACVAE (target) and DramaBox/LTX audio VAE (input). |
| |
| Both codecs operate on an identical grid: 25 Hz, 128-dim latents, same length. |
| DACVAE: 48 kHz mono. DramaBox encoder: stereo, resamples 48k->16k internally. |
| """ |
| import os, sys, torch, numpy as np |
|
|
| HERE = os.path.dirname(os.path.abspath(__file__)) |
| sys.path.insert(0, os.path.join(HERE, "fast-dacvae")) |
| sys.path.insert(0, os.path.join(HERE, "DramaBox", "ltx2")) |
| sys.path.insert(0, os.path.join(HERE, "DramaBox", "src")) |
|
|
| DRAMABOX_CKPT = os.path.join(HERE, "weights", "dramabox-audio-components.safetensors") |
|
|
|
|
| def load_dacvae(device="cuda"): |
| from dacvae.model.dacvae import DACVAE |
| from huggingface_hub import hf_hub_download |
| sd = torch.load(hf_hub_download("facebook/dacvae-watermarked", "weights.pth"), |
| map_location="cpu", weights_only=True) |
| if "state_dict" in sd: |
| sd = sd["state_dict"] |
| m = DACVAE(encoder_dim=64, encoder_rates=[2, 8, 10, 12], decoder_rates=[12, 10, 8, 2], |
| latent_dim=1024, codebook_dim=128, sample_rate=48000) |
| miss, unexp = m.load_state_dict(sd, strict=False) |
| assert not miss and not unexp, (len(miss), len(unexp)) |
| return m.to(device).eval() |
|
|
|
|
| class DramaBoxEncoder: |
| """Wraps the LTX audio VAE encoder. encode(wav48k_mono) -> (T,128) latent.""" |
| def __init__(self, device="cuda", dtype=torch.bfloat16): |
| from ltx_pipelines.utils.blocks import AudioConditioner |
| from ltx_core.model.audio_vae import encode_audio |
| from ltx_core.types import Audio |
| from ltx_core.components.patchifiers import AudioPatchifier |
| self._Audio, self._encode_audio = Audio, encode_audio |
| self._patch = AudioPatchifier(patch_size=1) |
| self.device, self.dtype = device, dtype |
| self._ac = AudioConditioner(checkpoint_path=DRAMABOX_CKPT, dtype=dtype, device=device, warm=True) |
|
|
| @torch.no_grad() |
| def encode(self, wav_mono): |
| """wav_mono: 1-D float tensor on device, 48 kHz. Returns (T,128) float tensor.""" |
| wt = wav_mono.view(1, 1, -1).repeat(1, 2, 1) |
| audio = self._Audio(waveform=wt, sampling_rate=48000) |
| lat = self._ac(lambda enc: self._encode_audio(audio, enc, None)) |
| pl = self._patch.patchify(lat) |
| return pl[0].float() |
|
|