Implementación en Pytorch de MusicLM, un modelo SOTA de texto a música publicado por Google, con algunas modificaciones. Usamos CLAP como reemplazo de MuLan, Encodec como reemplazo de SoundStream y MERT como reemplazo de w2v-BERT.
CLAP es un modelo conjunto de audio-texto entrenado en LAION-Audio-630K. Al igual que MuLan, consta de una torre de audio y una torre de texto que proyectan sus respectivos medios en un espacio latente compartido (512 dimensiones en CLAP frente a 128 dimensiones en MuLan).
MuLan fue entrenado con 50 millones de pares de texto y música. Desafortunadamente, no tengo los datos para replicar esto, así que confío en los puntos de control previamente entrenados del CLAP para acercarme. CLAP se entrenó en un total de 2,6 millones de pares texto-audio de LAION-630k (~633.000 pares texto-audio) y AudioSet (2 millones de muestras con subtítulos generados mediante un modelo de palabra clave a subtítulos). Aunque esto es una fracción de los datos utilizados para entrenar a MuLan, hemos utilizado CLAP con éxito para generar diversas muestras de música, que puedes escuchar aquí (ten en cuenta que estos son resultados muy iniciales). En el caso de que el espacio latente de CLAP no sea lo suficientemente expresivo para la generación de música, podemos entrenar CLAP en música o sustituir el modelo por la implementación MuLan de @lucidrain una vez que esté entrenado.
SoundStream y Encodec son códecs de audio neuronales que codifican cualquier forma de onda en una secuencia de tokens acústicos, que luego se pueden decodificar en una forma de onda similar a la original. Estos tokens intermedios se pueden modelar como una tarea seq2seq. Encodec es lanzado por Facebook y los puntos de control previamente entrenados están disponibles públicamente, mientras que este no es el caso con SoundStream.
El objetivo de este proyecto es replicar los resultados de MusicLM lo más rápido posible sin necesariamente ceñirse a la arquitectura del documento. Para aquellos que buscan una implementación más fiel, consulte musiclm-pytorch.
También buscamos comprender mejor el espacio latente del CLAP.
¡Únase a nosotros en Discord si desea participar!
conda env create -f environment.yaml
conda activate open-musiclm
Una "configuración del modelo" contiene información sobre la arquitectura del modelo, como la cantidad de capas, la cantidad de cuantificadores, las longitudes de audio objetivo para cada etapa, etc. Se utiliza para crear una instancia del modelo durante el entrenamiento y la inferencia.
Una "configuración de entrenamiento" contiene hiperparámetros para entrenar el modelo. Se utiliza para crear instancias de las clases del entrenador durante el entrenamiento.
Consulte el directorio ./configs
para ver ejemplos de configuraciones.
El primer paso es entrenar el cuantificador de vector residual que asigna incrustaciones CLAP continuas a una secuencia 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 continuación, aprendemos una capa K-means que usamos para cuantificar nuestras incorporaciones MERT en 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
Una vez que tengamos K-means y RVQ en funcionamiento, ahora podemos entrenar las etapas semántica, gruesa y fina. Estas etapas se pueden entrenar simultáneamente.
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
En el caso anterior, utilizamos CLAP, Hubert y Encodec para generar tokens de aplausos, semánticos y acústicos en vivo durante el entrenamiento. Sin embargo, estos modelos ocupan espacio en la GPU y es ineficaz volver a calcular estos tokens si realizamos varias ejecuciones con los mismos datos. En su lugar, podemos calcular estos tokens con anticipación e iterarlos durante el entrenamiento.
Para hacer esto, complete el campo data_preprocessor_cfg
en la configuración y establezca use_preprocessed_data
en True en las configuraciones del entrenador (consulte train_fma_preprocess.json para inspirarse). Luego ejecute lo siguiente para preprocesar el conjunto de datos, seguido de su script de entrenamiento.
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
Genere múltiples muestras y use CLAP para seleccionar las mejores:
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
Genere muestras para varias indicaciones de prueba:
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
Puedes usar el indicador --return_coarse_wave
para omitir la etapa fina y reconstruir el audio solo a partir de tokens gruesos.
Puede descargar puntos de control experimentales para el modelo musiclm_large_small_context aquí. Para ajustar el modelo, llame a los scripts del tren con el indicador --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 }
}