|
# 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/ |
|
|