Descript Audio Codec: 44.1 kHz Audio at 8 kbps and the RVQGAN Behind It
State-of-the-art audio codec with 90x compression factor. Supports 44.1kHz, 24kHz, and 16kHz mono/stereo audio.
At a glance
- What is it?
- The Descript Audio Codec compresses 44.1 kHz mono or stereo audio into discrete codes at roughly 8 kbps, a claimed 90x compression factor, and ships as a pip package with 16 kHz, 24 kHz and 44.1 kHz weights under MIT. The trade-off is that long files need the compress/decompress path rather than a single encode call, and the repository's last release is 1.0.0 from July 2023.
- Who is it for?
- Adopt the Descript Audio Codec if you are building an audio language model or a generative audio pipeline that needs discrete tokens at a low bitrate, and you are willing to pin a model checkpoint and verify reconstruction quality on your own material. Do not adopt it if you need a codec with a maintained release cadence, a documented codec API for real-time streaming, or one that can encode arbitrarily long files in a single call without the compress/decompress path.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 61 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The bitrate problem this codec is aimed at
Neural audio codecs exist for one reason: generative audio models do not want to predict waveforms. They want to predict tokens. The Descript Audio Codec turns a waveform into a sequence of discrete codes at a low bitrate, and the README states the headline number plainly: 44.1 kHz audio compressed into discrete codes at a low 8 kbps bitrate, which it describes as approximately 90x compression. The comparison image in the repository places that against EnCodec at 32x and SoundStream at 64x, and the caption notes the sampling rate differences: this model runs at 44.1 kHz, EnCodec at 48 kHz, SoundStream at 24 kHz. The README also claims the model is universal across domains, speech, environment and music, and says it can be used as a drop-in replacement for EnCodec in audio language modeling work such as AudioLMs, MusicLMs and MusicGen. The intended audience is therefore not people who want smaller MP3s. It is people training or serving token-based audio models, and people who need a compact discrete representation of audio for downstream generation rather than for storage.
Residual vector quantization and the adversarial training objective
The repository topics name the mechanism: residual-vector-quantization, gans, generative-adversarial-network, pytorch. The paper title given in the README is High-Fidelity Audio Compression with Improved RVQGAN. In the programmatic example, the encode call returns five values: z, codes, latents, and two ignored outputs. The codes are the discrete tokens, and z is the quantized representation that the decoder consumes. That split matters for anyone integrating the model, because the codes are what a language model would predict, while z is what the decoder needs to reconstruct audio. The README does not document the codebook sizes, the number of residual quantizer layers, or the discriminator configuration, so those details have to come from the paper rather than the repository. What the repository does show is the shape of the data flow: preprocess normalizes the audio data and sample rate, encode produces the quantized latent and codes, decode turns z back into a waveform, and the compress and decompress wrappers handle long files by chunking. The adversarial part of the training objective is what the README implies by listing GANs as a topic and by naming the improved RVQGAN architecture, and it is presumably what keeps reconstruction from sounding like a vocoder artifact, but the README itself does not describe the loss terms.
Installing the package and fetching the right weights
Installation is a single command, either from PyPI or from the repository directly. The README gives both forms: pip install descript-audio-codec, or pip install git+https://github.com/descriptinc/descript-audio-codec. Weights are not bundled with the package. They download automatically the first time you run encode or decode, and the README offers explicit caching commands: python3 -m dac download for the default 44 kHz variant, and the same command with --model_type 44khz, 24khz or 16khz for a specific one. The README states that weights are released under the MIT license along with the repository. There is also a Dockerfile that installs the encoding and decoding dependencies and caches the default model weights inside the image, which the README says allows the image to be used without an internet connection. That is the option to pick if your build environment is air-gapped or if you do not want a first-run download in production. The Docker usage is docker build -t dac . followed by docker run dac <command> on CPU or docker run --gpus=all dac <command> on GPU.
Encoding and decoding from the command line
The CLI is the shortest path to a working round trip. To compress, the README gives python3 -m dac encode /path/to/input --output /path/to/output/codes. That produces .dac files named after the input files, and the README states that the directory structure relative to the input root is preserved and recreated under the output directory. To reconstruct, python3 -m dac decode /path/to/output/codes --output /path/to/reconstructed_input produces .wav files with the same naming and directory behavior. Both commands accept more options through python -m dac encode --help and python -m dac decode --help, though the README does not enumerate them. The directory-preserving behavior is the detail worth noting for anyone scripting a batch job: you can point the encoder at a tree and get a mirror tree of .dac files, which makes the decode step a straight reversal rather than something you have to track file by file. The README does not state what happens when the output directory already contains files, or whether encode is resumable, so a batch pipeline should assume it is not.
The programmatic API and the long-file memory trap
The Python API is where the codec becomes part of a larger system. The README example downloads a model with dac.utils.download(model_type="44khz"), loads it with dac.DAC.load(model_path), moves it to CUDA, wraps a file in audiotools.AudioSignal, and then calls model.preprocess, model.encode and model.decode. The README is explicit about the constraint on that path: encoding audio as one long file may run out of GPU memory on long files. The alternative it offers is the compress and decompress pair, which the README describes as the way to compress long files. In that flow you move the signal to CPU, call model.compress(signal), save the result with x.save("compressed.dac"), reload it with dac.DACFile.load("compressed.dac"), then call model.decompress(x) and write the result. That is a real architectural boundary, not a footnote. The single-shot encode path is fine for short clips and for training-time batches, but any production job that handles minutes of audio should plan on compress and decompress, and should expect the chunking behavior to be internal and undocumented in the README.
Where the codec is the wrong tool
Two limitations stand out from the material. The first is release cadence. The releases listed are 0.0.4, 0.0.5 and 1.0.0, all from June and July 2023. There is no later tagged release in the material, so anyone adopting this should treat the API as stable but not actively versioned, and should expect to pin a specific version rather than track a moving target. The second is that the README does not document the .dac container format, the codebook dimensions, the chunk size used by compress, or the exact preprocessing applied to non-44.1 kHz input. If your pipeline needs to interoperate with another implementation of the same codec, or if you need to reason about token sequence length for a language model, you will be reading the source rather than the documentation. There is also a domain question the README does not answer: it claims the universal model works on speech, environment and music, but it gives no per-domain quality breakdown, so a team working on, say, polyphonic music should verify reconstruction on their own material before assuming the claim holds for their case. Finally, this is not an archival or delivery codec. There is no stated bit-exactness guarantee, no streaming mode described, and no error resilience story for corrupted .dac files.
How it differs from EnCodec
The README positions this codec directly against EnCodec, calling it a drop-in replacement for audio language modeling applications. The stated differences are bitrate and sampling rate: the Descript codec targets 8 kbps at 44.1 kHz, while the README says EnCodec operates at 24 kbps and 48 kHz, and SoundStream at 6 kbps and 24 kHz. The compression factor follows from those numbers, roughly 90x here against 32x for EnCodec and 64x for SoundStream according to the repository's comparison figure. The practical difference in approach is that EnCodec is a Meta research codec with its own weights and its own token layout, so switching to this one means re-training or re-tuning any model that consumes the tokens, unless the token interface happens to match. The README's drop-in claim is about the role the codec plays in a pipeline, not about token-level compatibility, and the material does not state that the codebooks or token counts are interchangeable. A team already running EnCodec should treat the migration as a model change, not a library swap.
Training, testing and what it costs to keep running
The repository is not inference-only. The README documents a training path with a baseline configuration at conf/ablations/baseline.yml, run either on a single GPU with python scripts/train.py --args.load conf/ablations/baseline.yml --save_path runs/baseline/ or on multiple GPUs with torchrun --nproc_per_node gpu scripts/train.py. Development dependencies come from pip install -e ".[dev]", and there is a docker compose setup with docker compose build followed by docker compose run -p 8888:8888 -p 6006:6006 dev, which mounts the current directory at /u/home/src and sets the Jupyter password to password. Tests run with python -m pytest tests, and the README notes the training prerequisites must be satisfied first. The maintenance cost of adopting the codec itself is low: MIT license, a pip package, and weights that download on first use. The cost of retraining or fine-tuning is a different matter, and the README gives no guidance on dataset size, GPU hours, or how far the released weights can be fine-tuned before quality degrades. On licensing, the repository and the weights are both stated as MIT, which is permissive, but the README does not address the training data provenance or any third-party audio rights, so a legal review of your own use case is still on you.
Editorial conclusion
Adopt the Descript Audio Codec if you are building an audio language model or a generative audio pipeline that needs discrete tokens at a low bitrate, and you are willing to pin a model checkpoint and verify reconstruction quality on your own material. Do not adopt it if you need a codec with a maintained release cadence, a documented codec API for real-time streaming, or one that can encode arbitrarily long files in a single call without the compress/decompress path. Before committing, verify three things: that the 44khz weights load on your target hardware, that the compress and decompress round trip preserves the audio you care about, and that the .dac file format your pipeline writes is one you can read back with dac.DACFile.load on the same library version.
Community notes