Pytorch-Implementierung von MusicLM, einem von Google veröffentlichten SOTA-Text-zu-Musik-Modell, mit einigen Modifikationen. Wir verwenden CLAP als Ersatz für MuLan, Encodec als Ersatz für SoundStream und MERT als Ersatz für w2v-BERT.
CLAP ist ein gemeinsames Audio-Text-Modell, das auf LAION-Audio-630K trainiert wurde. Ähnlich wie MuLan besteht es aus einem Audioturm und einem Textturm, die ihre jeweiligen Medien auf einen gemeinsamen latenten Raum projizieren (512 Dimensionen in CLAP gegenüber 128 Dimensionen in MuLan).
MuLan wurde auf 50 Millionen Text-Musik-Paaren trainiert. Leider verfüge ich nicht über die Daten, um dies zu reproduzieren, daher verlasse ich mich darauf, dass die vorab trainierten Kontrollpunkte von CLAP dem nahe kommen. CLAP wurde auf insgesamt 2,6 Millionen Text-Audio-Paaren von LAION-630k (~633k Text-Audio-Paare) und AudioSet (2 Millionen Beispiele mit Untertiteln, die durch ein Schlüsselwort-zu-Untertitel-Modell generiert wurden) trainiert. Obwohl dies nur ein Bruchteil der Daten ist, die zum Trainieren von MuLan verwendet wurden, haben wir CLAP erfolgreich verwendet, um verschiedene Musikbeispiele zu generieren, die Sie hier anhören können (denken Sie daran, dass es sich hierbei um sehr frühe Ergebnisse handelt). Für den Fall, dass der latente Raum von CLAP für die Musikerzeugung nicht ausdrucksstark genug ist, können wir CLAP auf Musik trainieren oder das Modell durch die MuLan-Implementierung von @lucidrain ersetzen, sobald es trainiert ist.
SoundStream und Encodec sind beide neuronale Audio-Codecs, die jede Wellenform in eine Folge akustischer Token kodieren, die dann in eine Wellenform dekodiert werden können, die dem Original ähnelt. Diese Zwischentoken können dann als seq2seq-Aufgabe modelliert werden. Encodec wird von Facebook veröffentlicht und vorab trainierte Prüfpunkte sind öffentlich verfügbar, während dies bei SoundStream nicht der Fall ist.
Ziel dieses Projekts ist es, die Ergebnisse von MusicLM so schnell wie möglich zu reproduzieren, ohne unbedingt an der Architektur im Papier festzuhalten. Für diejenigen, die eine formgetreuere Implementierung suchen, schauen Sie sich musiclm-pytorch an.
Wir versuchen auch, den latenten Raum von CLAP besser zu verstehen.
Treten Sie uns auf Discord bei, wenn Sie mitmachen möchten!
conda env create -f environment.yaml
conda activate open-musiclm
Eine „Modellkonfiguration“ enthält Informationen über die Modellarchitektur, wie z. B. die Anzahl der Schichten, die Anzahl der Quantisierer, die Ziel-Audiolängen für jede Stufe usw. Sie wird verwendet, um das Modell während des Trainings und der Inferenz zu instanziieren.
Eine „Trainingskonfiguration“ enthält Hyperparameter zum Trainieren des Modells. Es wird verwendet, um die Trainerklassen während des Trainings zu instanziieren.
Beispielkonfigurationen finden Sie im Verzeichnis ./configs
.
Der erste Schritt besteht darin, den Restvektorquantisierer zu trainieren, der kontinuierliche CLAP-Einbettungen einer diskreten Tokensequenz zuordnet.
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
Als nächstes lernen wir eine K-Means-Schicht, die wir verwenden, um unsere MERT-Einbettungen in semantische Token zu quantisieren.
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
Sobald wir über funktionierende K-Mittel und RVQ verfügen, können wir nun die semantischen, groben und feinen Stufen trainieren. Diese Stufen können gleichzeitig trainiert werden.
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
Im obigen Fall verwenden wir CLAP, Hubert und Encodec, um während des Trainings live Klatsch-, semantische und akustische Token zu generieren. Allerdings beanspruchen diese Modelle Platz auf der GPU und es ist ineffizient, diese Token neu zu berechnen, wenn wir mehrere Läufe mit denselben Daten durchführen. Stattdessen können wir diese Token im Voraus berechnen und sie während des Trainings iterieren.
Füllen Sie dazu das Feld data_preprocessor_cfg
in der Konfiguration aus und setzen Sie use_preprocessed_data
in den Trainerkonfigurationen auf True (sehen Sie sich train_fma_preprocess.json als Inspiration an). Führen Sie dann Folgendes aus, um den Datensatz vorzuverarbeiten, gefolgt von Ihrem Trainingsskript.
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
Generieren Sie mehrere Proben und wählen Sie mit CLAP die besten aus:
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
Generieren Sie Proben für verschiedene Testaufforderungen:
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
Sie können das Flag --return_coarse_wave
verwenden, um die Feinphase zu überspringen und Audio allein aus groben Token zu rekonstruieren.
Hier können Sie experimentelle Prüfpunkte für das Modell „musiclm_large_small_context“ herunterladen. Rufen Sie zur Feinabstimmung des Modells die Zugskripte mit dem Flag --fine_tune_from
auf.
@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 }
}