Implémentation Pytorch de MusicLM, un modèle de conversion texte-musique SOTA publié par Google, avec quelques modifications. Nous utilisons CLAP en remplacement de MuLan, Encodec en remplacement de SoundStream et MERT en remplacement de w2v-BERT.
CLAP est un modèle audio-texte conjoint formé sur LAION-Audio-630K. Semblable à MuLan, il se compose d'une tour audio et d'une tour de texte qui projettent leurs médias respectifs sur un espace latent partagé (512 dimensions dans CLAP contre 128 dimensions dans MuLan).
MuLan a été formé sur 50 millions de paires texte-musique. Malheureusement, je n'ai pas les données nécessaires pour reproduire cela, je compte donc sur les points de contrôle pré-entraînés du CLAP pour m'en rapprocher. CLAP a été formé sur 2,6 millions de paires texte-audio au total à partir de LAION-630k (~ 633 000 paires texte-audio) et AudioSet (2 millions d'échantillons avec sous-titres générés par un modèle mot-clé à sous-titre). Bien qu'il ne s'agisse que d'une fraction des données utilisées pour entraîner MuLan, nous avons utilisé avec succès CLAP pour générer divers échantillons de musique, que vous pouvez écouter ici (gardez à l'esprit qu'il s'agit de très premiers résultats). Dans le cas où l'espace latent de CLAP n'est pas suffisamment expressif pour la génération de musique, nous pouvons entraîner CLAP sur la musique ou remplacer le modèle par l'implémentation MuLan de @lucidrain une fois qu'il est formé.
SoundStream et Encodec sont tous deux des codecs audio neuronaux qui codent n'importe quelle forme d'onde en une séquence de jetons acoustiques, qui peuvent ensuite être décodés en une forme d'onde ressemblant à l'original. Ces jetons intermédiaires peuvent ensuite être modélisés comme une tâche seq2seq. Encodec est publié par Facebook et les points de contrôle pré-entraînés sont accessibles au public, alors que ce n'est pas le cas avec SoundStream.
Le but de ce projet est de reproduire les résultats de MusicLM le plus rapidement possible sans nécessairement coller à l'architecture du papier. Pour ceux qui recherchent une implémentation plus fidèle à la forme, consultez musiclm-pytorch.
Nous cherchons également à mieux comprendre l'espace latent du CLAP.
Rejoignez-nous sur Discord si vous souhaitez vous impliquer !
conda env create -f environment.yaml
conda activate open-musiclm
Une « configuration de modèle » contient des informations sur l'architecture du modèle telles que le nombre de couches, le nombre de quantificateurs, les longueurs audio cibles pour chaque étape, etc. Elle est utilisée pour instancier le modèle pendant la formation et l'inférence.
Une « configuration de formation » contient des hyperparamètres pour entraîner le modèle. Il est utilisé pour instancier les classes du formateur lors de la formation.
Voir le répertoire ./configs
pour des exemples de configurations.
La première étape consiste à entraîner le quantificateur vectoriel résiduel qui mappe les intégrations continues de CLAP à une séquence de jetons discrète.
python ./scripts/train_clap_rvq.py
--results_folder ./results/clap_rvq # where to save results and checkpoints
--model_config ./configs/model/musiclm_small.json # path to model config
--training_config ./configs/training/train_musiclm_fma.json # path to training config
Ensuite, nous apprenons une couche K-means que nous utilisons pour quantifier nos intégrations MERT dans des jetons sémantiques.
python ./scripts/train_hubert_kmeans.py
--results_folder ./results/hubert_kmeans # where to save results and checkpoints
--model_config ./configs/model/musiclm_small.json
--training_config ./configs/training/train_musiclm_fma.json
Une fois que nous avons un K-means et un RVQ fonctionnels, nous pouvons maintenant entraîner les étapes sémantiques, grossières et fines. Ces étapes peuvent être entraînées simultanément.
python ./scripts/train_semantic_stage.py
--results_folder ./results/semantic # where to save results and checkpoints
--model_config ./configs/model/musiclm_small.json
--training_config ./configs/training/train_musiclm_fma.json
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
python ./scripts/train_coarse_stage.py
--results_folder ./results/coarse # where to save results and checkpoints
--model_config ./configs/model/musiclm_small.json
--training_config ./configs/training/train_musiclm_fma.json
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
python ./scripts/train_fine_stage.py
--results_folder ./results/fine # where to save results and checkpoints
--model_config ./configs/model/musiclm_small.json
--training_config ./configs/training/train_musiclm_fma.json
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
Dans le cas ci-dessus, nous utilisons CLAP, Hubert et Encodec pour générer des tokens clap, sémantiques et acoustiques en direct pendant la formation. Cependant, ces modèles occupent de l'espace sur le GPU et il est inefficace de recalculer ces jetons si nous effectuons plusieurs exécutions sur les mêmes données. Nous pouvons plutôt calculer ces jetons à l'avance et les parcourir pendant la formation.
Pour ce faire, remplissez le champ data_preprocessor_cfg
dans la configuration et définissez use_preprocessed_data
sur True dans les configurations du formateur (regardez train_fma_preprocess.json pour vous inspirer). Exécutez ensuite ce qui suit pour prétraiter l'ensemble de données, suivi de votre script de formation.
python ./scripts/preprocess_data.py
--model_config ./configs/model/musiclm_small.json
--training_config ./configs/training/train_fma_preprocess.json
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
Générez plusieurs échantillons et utilisez CLAP pour sélectionner les meilleurs :
python scripts/infer_top_match.py
" your text prompt "
--num_samples 4 # number of samples to generate
--num_top_matches 1 # number of top matches to return
--semantic_path PATH_TO_SEMANTIC_CHECKPOINT # path to previously trained semantic stage
--coarse_path PATH_TO_COARSE_CHECKPOINT # path to previously trained coarse stage
--fine_path PATH_TO_FINE_CHECKPOINT # path to previously trained fine stage
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
--model_config ./configs/model/musiclm_small.json
--duration 4
Générez des échantillons pour diverses invites de test :
python scripts/infer.py
--semantic_path PATH_TO_SEMANTIC_CHECKPOINT # path to previously trained semantic stage
--coarse_path PATH_TO_COARSE_CHECKPOINT # path to previously trained coarse stage
--fine_path PATH_TO_FINE_CHECKPOINT # path to previously trained fine stage
--rvq_path PATH_TO_RVQ_CHECKPOINT # path to previously trained rvq
--kmeans_path PATH_TO_KMEANS_CHECKPOINT # path to previously trained kmeans
--model_config ./configs/model/musiclm_small.json
--duration 4
Vous pouvez utiliser l'indicateur --return_coarse_wave
pour ignorer l'étape fine et reconstruire l'audio à partir de jetons grossiers uniquement.
Vous pouvez télécharger des points de contrôle expérimentaux pour le modèle musiclm_large_small_context ici. Pour affiner le modèle, appelez les scripts de train avec l'indicateur --fine_tune_from
.
@inproceedings { Agostinelli2023MusicLMGM ,
title = { MusicLM: Generating Music From Text } ,
author = { Andrea Agostinelli and Timo I. Denk and Zal{'a}n Borsos and Jesse Engel and Mauro Verzetti and Antoine Caillon and Qingqing Huang and Aren Jansen and Adam Roberts and Marco Tagliasacchi and Matthew Sharifi and Neil Zeghidour and C. Frank } ,
year = { 2023 }
}
@article { wu2022large ,
title = { Large-scale Contrastive Language-Audio Pretraining with Feature Fusion and Keyword-to-Caption Augmentation } ,
author = { Wu, Yusong and Chen, Ke and Zhang, Tianyu and Hui, Yuchen and Berg-Kirkpatrick, Taylor and Dubnov, Shlomo } ,
journal = { arXiv preprint arXiv:2211:06687 } ,
year = { 2022 } ,
}
@article { defossez2022highfi ,
title = { High Fidelity Neural Audio Compression } ,
author = { Défossez, Alexandre and Copet, Jade and Synnaeve, Gabriel and Adi, Yossi } ,
journal = { arXiv preprint arXiv:2210.13438 } ,
year = { 2022 }
}
@misc { li2023mert ,
title = { MERT: Acoustic Music Understanding Model with Large-Scale Self-supervised Training } ,
author = { Yizhi Li and Ruibin Yuan and Ge Zhang and Yinghao Ma and Xingran Chen and Hanzhi Yin and Chenghua Lin and Anton Ragni and Emmanouil Benetos and Norbert Gyenge and Roger Dannenberg and Ruibo Liu and Wenhu Chen and Gus Xia and Yemin Shi and Wenhao Huang and Yike Guo and Jie Fu } ,
year = { 2023 } ,
eprint = { 2306.00107 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.SD }
}