Spaces:
Running
Running
| # 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://ai.honu.io/red/musicgen-colab"> | |
| <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://ai.honu.io/red/musicgen-colab) | |
| 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 MusicGenSolver | |
| solver = MusicGenSolver.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 | |
| ``` | |
| @inproceedings{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}, | |
| booktitle={Thirty-seventh Conference on Neural Information Processing Systems}, | |
| year={2023}, | |
| } | |
| ``` | |
| ## 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/ | |