Spaces:
Paused
Paused
# MusicGen: Simple and Controllable Music Generation | |
AudioCraft provides the code and models for MusicGen, [a simple and controllable model for music generation][arxiv]. | |
MusicGen is a single stage auto-regressive Transformer model trained over a 32kHz | |
<a href="https://github.com/facebookresearch/encodec">EnCodec tokenizer</a> with 4 codebooks sampled at 50 Hz. | |
Unlike existing methods like [MusicLM](https://arxiv.org/abs/2301.11325), MusicGen doesn't require | |
a self-supervised semantic representation, and it generates all 4 codebooks in one pass. By introducing | |
a small delay between the codebooks, we show we can predict them in parallel, thus having only 50 auto-regressive | |
steps per second of audio. | |
Check out our [sample page][musicgen_samples] or test the available demo! | |
<a target="_blank" href="https://colab.research.google.com/drive/1JlTOjB-G0A2Hz3h8PK63vLZk4xdCI5QB?usp=sharing"> | |
<img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/> | |
</a> | |
<a target="_blank" href="https://huggingface.co/spaces/facebook/MusicGen"> | |
<img src="https://huggingface.co/datasets/huggingface/badges/raw/main/open-in-hf-spaces-sm.svg" alt="Open in HugginFace"/> | |
</a> | |
<br> | |
We use 20K hours of licensed music to train MusicGen. Specifically, we rely on an internal dataset | |
of 10K high-quality music tracks, and on the ShutterStock and Pond5 music data. | |
## Model Card | |
See [the model card](../model_cards/MUSICGEN_MODEL_CARD.md). | |
## Installation | |
Please follow the AudioCraft installation instructions from the [README](../README.md). | |
AudioCraft requires a GPU with at least 16 GB of memory for running inference with the medium-sized models (~1.5B parameters). | |
## Usage | |
We offer a number of way to interact with MusicGen: | |
1. A demo is also available on the [`facebook/MusicGen` Hugging Face Space](https://huggingface.co/spaces/facebook/MusicGen) | |
(huge thanks to all the HF team for their support). | |
2. You can run the extended demo on a Colab: | |
[colab notebook](https://colab.research.google.com/drive/1JlTOjB-G0A2Hz3h8PK63vLZk4xdCI5QB?usp=sharing) | |
3. You can use the gradio demo locally by running [`python -m demos.musicgen_app --share`](../demos/musicgen_app.py). | |
4. You can play with MusicGen by running the jupyter notebook at [`demos/musicgen_demo.ipynb`](../demos/musicgen_demo.ipynb) locally (if you have a GPU). | |
5. Finally, checkout [@camenduru Colab page](https://github.com/camenduru/MusicGen-colab) | |
which is regularly updated with contributions from @camenduru and the community. | |
## API | |
We provide a simple API and 10 pre-trained models. The pre trained models are: | |
- `facebook/musicgen-small`: 300M model, text to music only - [🤗 Hub](https://huggingface.co/facebook/musicgen-small) | |
- `facebook/musicgen-medium`: 1.5B model, text to music only - [🤗 Hub](https://huggingface.co/facebook/musicgen-medium) | |
- `facebook/musicgen-melody`: 1.5B model, text to music and text+melody to music - [🤗 Hub](https://huggingface.co/facebook/musicgen-melody) | |
- `facebook/musicgen-large`: 3.3B model, text to music only - [🤗 Hub](https://huggingface.co/facebook/musicgen-large) | |
- `facebook/musicgen-melody-large`: 3.3B model, text to music and text+melody to music - [🤗 Hub](https://huggingface.co/facebook/musicgen-melody-large) | |
- `facebook/musicgen-stereo-*`: All the previous models fine tuned for stereo generation - | |
[small](https://huggingface.co/facebook/musicgen-stereo-small), | |
[medium](https://huggingface.co/facebook/musicgen-stereo-medium), | |
[large](https://huggingface.co/facebook/musicgen-stereo-large), | |
[melody](https://huggingface.co/facebook/musicgen-stereo-melody), | |
[melody large](https://huggingface.co/facebook/musicgen-stereo-melody-large). | |
We observe the best trade-off between quality and compute with the `facebook/musicgen-medium` or `facebook/musicgen-melody` model. | |
In order to use MusicGen locally **you must have a GPU**. We recommend 16GB of memory, but smaller | |
GPUs will be able to generate short sequences, or longer sequences with the `facebook/musicgen-small` model. | |
See after a quick example for using the API. | |
```python | |
import torchaudio | |
from audiocraft.models import MusicGen | |
from audiocraft.data.audio import audio_write | |
model = MusicGen.get_pretrained('facebook/musicgen-melody') | |
model.set_generation_params(duration=8) # generate 8 seconds. | |
wav = model.generate_unconditional(4) # generates 4 unconditional audio samples | |
descriptions = ['happy rock', 'energetic EDM', 'sad jazz'] | |
wav = model.generate(descriptions) # generates 3 samples. | |
melody, sr = torchaudio.load('./assets/bach.mp3') | |
# generates using the melody from the given audio and the provided descriptions. | |
wav = model.generate_with_chroma(descriptions, melody[None].expand(3, -1, -1), sr) | |
for idx, one_wav in enumerate(wav): | |
# Will save under {idx}.wav, with loudness normalization at -14 db LUFS. | |
audio_write(f'{idx}', one_wav.cpu(), model.sample_rate, strategy="loudness", loudness_compressor=True) | |
``` | |
## 🤗 Transformers Usage | |
MusicGen is available in the 🤗 Transformers library from version 4.31.0 onwards, requiring minimal dependencies | |
and additional packages. Steps to get started: | |
1. First install the 🤗 [Transformers library](https://github.com/huggingface/transformers) from main: | |
```shell | |
pip install git+https://github.com/huggingface/transformers.git | |
``` | |
2. Run the following Python code to generate text-conditional audio samples: | |
```py | |
from transformers import AutoProcessor, MusicgenForConditionalGeneration | |
processor = AutoProcessor.from_pretrained("facebook/musicgen-small") | |
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") | |
inputs = processor( | |
text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"], | |
padding=True, | |
return_tensors="pt", | |
) | |
audio_values = model.generate(**inputs, max_new_tokens=256) | |
``` | |
3. Listen to the audio samples either in an ipynb notebook: | |
```py | |
from IPython.display import Audio | |
sampling_rate = model.config.audio_encoder.sampling_rate | |
Audio(audio_values[0].numpy(), rate=sampling_rate) | |
``` | |
Or save them as a `.wav` file using a third-party library, e.g. `scipy`: | |
```py | |
import scipy | |
sampling_rate = model.config.audio_encoder.sampling_rate | |
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].numpy()) | |
``` | |
For more details on using the MusicGen model for inference using the 🤗 Transformers library, refer to the | |
[MusicGen docs](https://huggingface.co/docs/transformers/main/en/model_doc/musicgen) or the hands-on | |
[Google Colab](https://colab.research.google.com/github/sanchit-gandhi/notebooks/blob/main/MusicGen.ipynb). | |
## Training | |
The [MusicGenSolver](../audiocraft/solvers/musicgen.py) implements MusicGen's training pipeline. | |
It defines an autoregressive language modeling task over multiple streams of discrete tokens | |
extracted from a pre-trained EnCodec model (see [EnCodec documentation](./ENCODEC.md) | |
for more details on how to train such model). | |
Note that **we do NOT provide any of the datasets** used for training MusicGen. | |
We provide a dummy dataset containing just a few examples for illustrative purposes. | |
Please read first the [TRAINING documentation](./TRAINING.md), in particular the Environment Setup section. | |
**Warning:** As of version 1.1.0, a few breaking changes were introduced. Check the [CHANGELOG.md](../CHANGELOG.md) | |
file for more information. You might need to retrain some of your models. | |
### Example configurations and grids | |
We provide configurations to reproduce the released models and our research. | |
MusicGen solvers configuration are available in [config/solver/musicgen](../config/solver/musicgen), | |
in particular: | |
* MusicGen base model for text-to-music: | |
[`solver=musicgen/musicgen_base_32khz`](../config/solver/musicgen/musicgen_base_32khz.yaml) | |
* MusicGen model with chromagram-conditioning support: | |
[`solver=musicgen/musicgen_melody_32khz`](../config/solver/musicgen/musicgen_melody_32khz.yaml) | |
We provide 3 different scales, e.g. `model/lm/model_scale=small` (300M), or `medium` (1.5B), and `large` (3.3B). | |
Please find some example grids to train MusicGen at | |
[audiocraft/grids/musicgen](../audiocraft/grids/musicgen/). | |
```shell | |
# text-to-music | |
dora grid musicgen.musicgen_base_32khz --dry_run --init | |
# melody-guided music generation | |
dora grid musicgen.musicgen_melody_base_32khz --dry_run --init | |
# Remove the `--dry_run --init` flags to actually schedule the jobs once everything is setup. | |
``` | |
### Music dataset and metadata | |
MusicGen's underlying dataset is an AudioDataset augmented with music-specific metadata. | |
The MusicGen dataset implementation expects the metadata to be available as `.json` files | |
at the same location as the audio files. Learn more in the [datasets section](./DATASETS.md). | |
### Audio tokenizers | |
We support a number of audio tokenizers: either pretrained EnCodec models, [DAC](https://github.com/descriptinc/descript-audio-codec), or your own models. | |
The tokenizer is controlled with the setting `compression_model_checkpoint`. | |
For instance, | |
```bash | |
# Using the 32kHz EnCodec trained on music | |
dora run solver=musicgen/debug \ | |
compression_model_checkpoint=//pretrained/facebook/encodec_32khz \ | |
transformer_lm.n_q=4 transformer_lm.card=2048 | |
# Using DAC | |
dora run solver=musicgen/debug \ | |
compression_model_checkpoint=//pretrained/dac_44khz \ | |
transformer_lm.n_q=9 transformer_lm.card=1024 \ | |
'codebooks_pattern.delay.delays=[0,1,2,3,4,5,6,7,8]' | |
# Using your own model after export (see ENCODEC.md) | |
dora run solver=musicgen/debug \ | |
compression_model_checkpoint=//pretrained//checkpoints/my_audio_lm/compression_state_dict.bin \ | |
transformer_lm.n_q=... transformer_lm.card=... | |
# Using your own model from its training checkpoint. | |
dora run solver=musicgen/debug \ | |
compression_model_checkpoint=//sig/SIG \ # where SIG is the Dora signature of the EnCodec XP. | |
transformer_lm.n_q=... transformer_lm.card=... | |
``` | |
**Warning:** you are responsible for setting the proper value for `transformer_lm.n_q` and `transformer_lm.card` (cardinality of the codebooks). You also have to update the codebook_pattern to match `n_q` as shown in the example for using DAC. . | |
### Training stereo models | |
Use the option `interleave_stereo_codebooks.use` set to `True` to activate stereo training along with `channels=2`. Left and right channels will be | |
encoded separately by the compression model, then their codebook will be interleaved, e.g. order of codebook is | |
`[1_L, 1_R, 2_L, 2_R, ...]`. You will also need to update the delays for the codebook patterns to match the number of codebooks, and the `n_q` value passed to the transformer LM: | |
``` | |
dora run solver=musicgen/debug \ | |
compression_model_checkpoint=//pretrained/facebook/encodec_32khz \ | |
channels=2 interleave_stereo_codebooks.use=True \ | |
transformer_lm.n_q=8 transformer_lm.card=2048 \ | |
codebooks_pattern.delay.delays='[0, 0, 1, 1, 2, 2, 3, 3]' | |
``` | |
### Fine tuning existing models | |
You can initialize your model to one of the pretrained models by using the `continue_from` argument, in particular | |
```bash | |
# Using pretrained MusicGen model. | |
dora run solver=musicgen/musicgen_base_32khz model/lm/model_scale=medium continue_from=//pretrained/facebook/musicgen-medium conditioner=text2music | |
# Using another model you already trained with a Dora signature SIG. | |
dora run solver=musicgen/musicgen_base_32khz model/lm/model_scale=medium continue_from=//sig/SIG conditioner=text2music | |
# Or providing manually a path | |
dora run solver=musicgen/musicgen_base_32khz model/lm/model_scale=medium continue_from=/checkpoints/my_other_xp/checkpoint.th | |
``` | |
**Warning:** You are responsible for selecting the other parameters accordingly, in a way that make it compatible | |
with the model you are fine tuning. Configuration is NOT automatically inherited from the model you continue from. In particular make sure to select the proper `conditioner` and `model/lm/model_scale`. | |
**Warning:** We currently do not support fine tuning a model with slightly different layers. If you decide | |
to change some parts, like the conditioning or some other parts of the model, you are responsible for manually crafting a checkpoint file from which we can safely run `load_state_dict`. | |
If you decide to do so, make sure your checkpoint is saved with `torch.save` and contains a dict | |
`{'best_state': {'model': model_state_dict_here}}`. Directly give the path to `continue_from` without a `//pretrained/` prefix. | |
#### Fine tuning mono model to stereo | |
You will not be able to `continue_from` a mono model with stereo training, as the shape of the embeddings and output linears | |
would not match. You can use the following snippet to prepare a proper finetuning checkpoint. | |
```python | |
from pathlib import Path | |
import torch | |
# Download the pretrained model, e.g. from | |
# https://huggingface.co/facebook/musicgen-melody/blob/main/state_dict.bin | |
model_name = 'musicgen-melody' | |
root = Path.home() / 'checkpoints' | |
# You are responsible for downloading the following checkpoint in the proper location | |
input_state_dict_path = root / model_name / 'state_dict.bin' | |
state = torch.load(input_state_dict_path, 'cpu') | |
bs = state['best_state'] | |
# there is a slight different in format between training checkpoints and exported public checkpoints. | |
# If you want to use your own mono models from one of your training checkpont, following the instructions | |
# for exporting a model explained later on this page. | |
assert 'model' not in bs, 'The following code is for using an exported pretrained model' | |
nbs = dict(bs) | |
for k in range(8): | |
# We will just copy mono embeddings and linears twice, once for left and right channels. | |
nbs[f'linears.{k}.weight'] = bs[f'linears.{k//2}.weight'] | |
nbs[f'emb.{k}.weight'] = bs[f'emb.{k//2}.weight'] | |
torch.save({'best_state': {'model': nbs}}, root / f'stereo_finetune_{model_name}.th') | |
``` | |
Now, you can use `$HOME/checkpoints/stereo_finetune_musicgen-melody.th` as a `continue_from` target (without a `//pretrained` prefix!). | |
### Caching of EnCodec tokens | |
It is possible to precompute the EnCodec tokens and other metadata. | |
An example of generating and using this cache provided in the [musicgen.musicgen_base_cached_32khz grid](../audiocraft/grids/musicgen/musicgen_base_cached_32khz.py). | |
### Evaluation stage | |
By default, evaluation stage is also computing the cross-entropy and the perplexity over the | |
evaluation dataset. Indeed the objective metrics used for evaluation can be costly to run | |
or require some extra dependencies. Please refer to the [metrics documentation](./METRICS.md) | |
for more details on the requirements for each metric. | |
We provide an off-the-shelf configuration to enable running the objective metrics | |
for audio generation in | |
[config/solver/musicgen/evaluation/objective_eval](../config/solver/musicgen/evaluation/objective_eval.yaml). | |
One can then activate evaluation the following way: | |
```shell | |
# using the configuration | |
dora run solver=musicgen/debug solver/musicgen/evaluation=objective_eval | |
# specifying each of the fields, e.g. to activate KL computation | |
dora run solver=musicgen/debug evaluate.metrics.kld=true | |
``` | |
See [an example evaluation grid](../audiocraft/grids/musicgen/musicgen_pretrained_32khz_eval.py). | |
### Generation stage | |
The generation stage allows to generate samples conditionally and/or unconditionally and to perform | |
audio continuation (from a prompt). We currently support greedy sampling (argmax), sampling | |
from softmax with a given temperature, top-K and top-P (nucleus) sampling. The number of samples | |
generated and the batch size used are controlled by the `dataset.generate` configuration | |
while the other generation parameters are defined in `generate.lm`. | |
```shell | |
# control sampling parameters | |
dora run solver=musicgen/debug generate.lm.gen_duration=10 generate.lm.use_sampling=true generate.lm.top_k=15 | |
``` | |
#### Listening to samples | |
Note that generation happens automatically every 25 epochs. You can easily access and | |
compare samples between models (as long as they are trained) on the same dataset using the | |
MOS tool. For that first `pip install Flask gunicorn`. Then | |
``` | |
gunicorn -w 4 -b 127.0.0.1:8895 -t 120 'scripts.mos:app' --access-logfile - | |
``` | |
And access the tool at [https://127.0.0.1:8895](https://127.0.0.1:8895). | |
### Playing with the model | |
Once you have launched some experiments, you can easily get access | |
to the Solver with the latest trained model using the following snippet. | |
```python | |
from audiocraft.solvers.musicgen import MusicGen | |
solver = MusicGen.get_eval_solver_from_sig('SIG', device='cpu', batch_size=8) | |
solver.model | |
solver.dataloaders | |
``` | |
### Importing / Exporting models | |
We do not support currently loading a model from the Hugging Face implementation or exporting to it. | |
If you want to export your model in a way that is compatible with `audiocraft.models.MusicGen` | |
API, you can run: | |
```python | |
from audiocraft.utils import export | |
from audiocraft import train | |
xp = train.main.get_xp_from_sig('SIG_OF_LM') | |
export.export_lm(xp.folder / 'checkpoint.th', '/checkpoints/my_audio_lm/state_dict.bin') | |
# You also need to bundle the EnCodec model you used !! | |
## Case 1) you trained your own | |
xp_encodec = train.main.get_xp_from_sig('SIG_OF_ENCODEC') | |
export.export_encodec(xp_encodec.folder / 'checkpoint.th', '/checkpoints/my_audio_lm/compression_state_dict.bin') | |
## Case 2) you used a pretrained model. Give the name you used without the //pretrained/ prefix. | |
## This will actually not dump the actual model, simply a pointer to the right model to download. | |
export.export_pretrained_compression_model('facebook/encodec_32khz', '/checkpoints/my_audio_lm/compression_state_dict.bin') | |
``` | |
Now you can load your custom model with: | |
```python | |
import audiocraft.models | |
musicgen = audiocraft.models.MusicGen.get_pretrained('/checkpoints/my_audio_lm/') | |
``` | |
### Learn more | |
Learn more about AudioCraft training pipelines in the [dedicated section](./TRAINING.md). | |
## FAQ | |
#### I need help on Windows | |
@FurkanGozukara made a complete tutorial for [AudioCraft/MusicGen on Windows](https://youtu.be/v-YpvPkhdO4) | |
#### I need help for running the demo on Colab | |
Check [@camenduru tutorial on YouTube](https://www.youtube.com/watch?v=EGfxuTy9Eeo). | |
#### What are top-k, top-p, temperature and classifier-free guidance? | |
Check out [@FurkanGozukara tutorial](https://github.com/FurkanGozukara/Stable-Diffusion/blob/main/Tutorials/AI-Music-Generation-Audiocraft-Tutorial.md#more-info-about-top-k-top-p-temperature-and-classifier-free-guidance-from-chatgpt). | |
#### Should I use FSDP or autocast ? | |
The two are mutually exclusive (because FSDP does autocast on its own). | |
You can use autocast up to 1.5B (medium), if you have enough RAM on your GPU. | |
FSDP makes everything more complex but will free up some memory for the actual | |
activations by sharding the optimizer state. | |
## Citation | |
``` | |
@article{copet2023simple, | |
title={Simple and Controllable Music Generation}, | |
author={Jade Copet and Felix Kreuk and Itai Gat and Tal Remez and David Kant and Gabriel Synnaeve and Yossi Adi and Alexandre Défossez}, | |
year={2023}, | |
journal={arXiv preprint arXiv:2306.05284}, | |
} | |
``` | |
## License | |
See license information in the [model card](../model_cards/MUSICGEN_MODEL_CARD.md). | |
[arxiv]: https://arxiv.org/abs/2306.05284 | |
[musicgen_samples]: https://ai.honu.io/papers/musicgen/ | |