Implementação Pytorch do MusicLM, um modelo SOTA de texto para música publicado pelo Google, com algumas modificações. Usamos CLAP como substituto do MuLan, Encodec como substituto do SoundStream e MERT como substituto do w2v-BERT.
CLAP é um modelo conjunto de áudio-texto treinado em LAION-Audio-630K. Semelhante ao MuLan, consiste em uma torre de áudio e uma torre de texto que projetam suas respectivas mídias em um espaço latente compartilhado (512 dimensões no CLAP vs 128 dimensões no MuLan).
MuLan foi treinado em 50 milhões de pares texto-música. Infelizmente não tenho os dados para replicar isso, então estou contando com os pontos de verificação pré-treinados do CLAP para chegar perto. O CLAP foi treinado em 2,6 milhões de pares de texto-áudio no total de LAION-630k (~633 mil pares de texto-áudio) e AudioSet (2 milhões de amostras com legendas geradas por um modelo de palavra-chave para legenda). Embora esta seja uma fração dos dados usados para treinar MuLan, usamos com sucesso o CLAP para gerar diversas amostras de música, que você pode ouvir aqui (tenha em mente que estes são resultados muito iniciais). Caso o espaço latente do CLAP não seja expressivo o suficiente para a geração de música, podemos treinar o CLAP em música ou substituir o modelo pela implementação MuLan do @lucidrain uma vez treinado.
SoundStream e Encodec são codecs de áudio neurais que codificam qualquer forma de onda em uma sequência de tokens acústicos, que podem então ser decodificados em uma forma de onda semelhante à original. Esses tokens intermediários podem então ser modelados como uma tarefa seq2seq. O Encodec é lançado pelo Facebook e os pontos de verificação pré-treinados estão disponíveis publicamente, enquanto este não é o caso do SoundStream.
O objetivo deste projeto é replicar os resultados do MusicLM o mais rápido possível, sem necessariamente se ater à arquitetura do papel. Para aqueles que procuram uma implementação mais fiel à forma, dê uma olhada no musiclm-pytorch.
Procuramos também compreender melhor o espaço latente do CLAP.
Junte-se a nós no discord se quiser se envolver!
conda env create -f environment.yaml
conda activate open-musiclm
Uma "configuração do modelo" contém informações sobre a arquitetura do modelo, como número de camadas, número de quantizadores, comprimentos de áudio alvo para cada estágio, etc. Ela é usada para instanciar o modelo durante o treinamento e inferência.
Uma "configuração de treinamento" contém hiperparâmetros para treinar o modelo. É usado para instanciar as classes do treinador durante o treinamento.
Veja o diretório ./configs
para ver configurações de exemplo.
A primeira etapa é treinar o quantizador vetorial residual que mapeia incorporações CLAP contínuas em uma sequência de token discreta.
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
A seguir, aprendemos uma camada K-means que usamos para quantizar nossos embeddings MERT em tokens semânticos.
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
Assim que tivermos K-means e RVQ funcionando, agora podemos treinar os estágios semântico, grosso e fino. Esses estágios podem ser treinados simultaneamente.
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
No caso acima, estamos usando CLAP, Hubert e Encodec para gerar clap, tokens semânticos e acústicos ao vivo durante o treinamento. No entanto, esses modelos ocupam espaço na GPU e é ineficiente recalcular esses tokens se fizermos várias execuções nos mesmos dados. Em vez disso, podemos calcular esses tokens antecipadamente e iterá-los durante o treinamento.
Para fazer isso, preencha o campo data_preprocessor_cfg
na configuração e defina use_preprocessed_data
como True nas configurações do treinador (veja train_fma_preprocess.json para inspiração). Em seguida, execute o seguinte para pré-processar o conjunto de dados, seguido pelo seu script de treinamento.
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
Gere múltiplas amostras e use o CLAP para selecionar as melhores:
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
Gere amostras para vários prompts de teste:
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
Você pode usar o sinalizador --return_coarse_wave
para pular o estágio fino e reconstruir o áudio apenas a partir de tokens grosseiros.
Você pode baixar pontos de verificação experimentais para o modelo musiclm_large_small_context aqui. Para ajustar o modelo, chame os scripts de trem com o sinalizador --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 }
}