Реализация Pytorch MusicLM, модели преобразования текста в музыку SOTA, опубликованной Google, с некоторыми изменениями. Мы используем CLAP в качестве замены MuLan, Encodec в качестве замены SoundStream и MERT в качестве замены w2v-BERT.
CLAP — это совместная аудиотекстовая модель, обученная на LAION-Audio-630K. Подобно MuLan, он состоит из звуковой башни и текстовой башни, которые проецируют соответствующие медиафайлы в общее скрытое пространство (512 измерений в CLAP против 128 измерений в MuLan).
Мулан обучался на 50 миллионах пар текст-музыка. К сожалению, у меня нет данных, чтобы воспроизвести это, поэтому я полагаюсь на предварительно обученные контрольные точки CLAP, чтобы приблизиться к этому. CLAP был обучен на 2,6 миллионах пар текст-аудио из LAION-630k (около 633 тысяч пар текст-аудио) и AudioSet (2 миллиона сэмплов с подписями, созданными с помощью модели «ключевое слово-подпись»). Хотя это лишь часть данных, используемых для обучения MuLan, мы успешно использовали CLAP для создания разнообразных музыкальных сэмплов, которые вы можете послушать здесь (имейте в виду, что это очень ранние результаты). В случае, если скрытое пространство CLAP недостаточно выразительно для генерации музыки, мы можем обучить CLAP музыке или заменить модель реализацией MuLan @lucidrain после ее обучения.
SoundStream и Encodec — это нейронные аудиокодеки, которые кодируют любую форму сигнала в последовательность акустических токенов, которые затем можно декодировать в форму волны, напоминающую оригинал. Эти промежуточные токены затем можно смоделировать как задачу seq2seq. Encodec выпущен Facebook, и предварительно обученные контрольные точки общедоступны, в отличие от SoundStream.
Цель этого проекта — как можно быстрее воспроизвести результаты MusicLM, не обязательно придерживаясь архитектуры, описанной в статье. Если вам нужна более точная реализация, обратите внимание на musiclm-pytorch.
Мы также стремимся лучше понять скрытое пространство CLAP.
Присоединяйтесь к нам в дискорде, если хотите принять участие!
conda env create -f environment.yaml
conda activate open-musiclm
«Конфигурация модели» содержит информацию об архитектуре модели, такую как количество слоев, количество квантователей, целевая длина звука для каждого этапа и т. д. Она используется для создания экземпляра модели во время обучения и вывода.
«Конфигурация обучения» содержит гиперпараметры для обучения модели. Он используется для создания экземпляров классов тренера во время обучения.
См. каталог ./configs
для примера конфигураций.
Первым шагом является обучение квантователя вектора остатка, который отображает непрерывные внедрения CLAP в дискретную последовательность токенов.
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
Затем мы изучаем слой K-средних, который используем для квантования наших вложений MERT в семантические токены.
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
Когда у нас есть работающие K-средние и RVQ, мы можем обучать семантический, грубый и точный этапы. Эти этапы можно обучать одновременно.
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
В приведенном выше случае мы используем CLAP, Hubert и Encodec для генерации аплодисментов, семантических и акустических токенов в реальном времени во время обучения. Однако эти модели занимают место на графическом процессоре, и пересчитывать эти токены неэффективно, если мы выполняем несколько прогонов одних и тех же данных. Вместо этого мы можем заранее вычислить эти токены и перебирать их во время обучения.
Для этого заполните поле data_preprocessor_cfg
в конфигурации и установите use_preprocessed_data
значение True в конфигах трейнера (для вдохновения посмотрите train_fma_preprocess.json). Затем запустите следующую команду для предварительной обработки набора данных, а затем сценарий обучения.
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
Создайте несколько образцов и используйте CLAP, чтобы выбрать лучшие:
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
Сгенерируйте образцы для различных тестовых подсказок:
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
Вы можете использовать флаг --return_coarse_wave
, чтобы пропустить тонкую стадию и восстановить звук только из грубых токенов.
Вы можете скачать экспериментальные контрольные точки для модели musiclm_large_small_context здесь. Чтобы точно настроить модель, вызовите сценарии поезда с флагом --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 }
}