Library / SDK
descriptinc/descript-audio-codec avatar
descriptinc/descript-audio-codec

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.

1,871 stars193 forksPythonMIT

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 85 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 October 5, 2026, and from our analysis. They are not legal advice.

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

Frequently asked questions

How do I install Descript Audio Codec?

Two documented ways: install the package from the index, or install it directly from the repository. The install requirements name an argument binding helper, an audio utilities library, a tensor layout library, numpy, torch, torchaudio and a progress bar, and none of those seven carries a version bound.

Which sample rates does Descript Audio Codec support?

Weights are released for models that natively support 16 kHz, 24 kHz and 44.1 kHz. The default download is the 44 kHz variant, and the other two are selected with a model type flag on the download command. The 44 kHz variant is also what the runtime image caches at build time.

How do I encode and decode a file with the Descript Audio Codec?

Two commands, one for each direction. The encode command takes an input path and an output path, writes files with a .dac extension, and recreates the input directory structure under the output. The decode command takes the codes directory and writes .wav files with the same names and the same structure.

Can I use Descript Audio Codec from Python?

Yes, and the page shows a short sequence using the model load, a move to a graphics device, a preprocess call and an encode call that returns codes, then a decode call. The example is cut off partway through, and the page separately notes that encoding a whole file as one long signal may exhaust graphics memory, with a compress and decompress pair offered for long files.

What is the compression ratio of Descript Audio Codec?

The page states approximately 90 times compression at a low 8 kilobit bitrate for 44.1 kHz audio. That matches uncompressed sixteen-bit mono audio at about 705 kilobits per second; stereo audio at the same sample rate and depth starts from twice that rate, and the page does not state which channel count its figure assumes.

Does the Descript Audio Codec container image work without internet access?

Once built, yes. The runtime image installs the package and then downloads the default weights during the build, so the model is inside the image and no network is needed to encode or decode. The build itself still needs the network for the base image and the package install.

Official sources

  1. descriptinc/descript-audio-codec on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/descriptinc-descript-audio-codec.svg)](https://hysenlabs.com/projects/descriptinc-descript-audio-codec)