Implementasi Pytorch dari MusicLM, model teks ke musik SOTA yang diterbitkan oleh Google, dengan beberapa modifikasi. Kami menggunakan CLAP sebagai pengganti MuLan, Encodec sebagai pengganti SoundStream, dan MERT sebagai pengganti w2v-BERT.
CLAP adalah model audio-teks gabungan yang dilatih pada LAION-Audio-630K. Mirip dengan MuLan, ini terdiri dari menara audio dan menara teks yang memproyeksikan media masing-masing ke ruang laten bersama (512 dimensi di CLAP vs 128 dimensi di MuLan).
MuLan dilatih pada 50 juta pasangan musik teks. Sayangnya saya tidak memiliki data untuk mereplikasi hal ini, jadi saya mengandalkan pos pemeriksaan CLAP yang telah dilatih sebelumnya untuk mendekatinya. CLAP dilatih pada 2,6 juta total pasangan teks-audio dari LAION-630k (~633k pasangan teks-audio) dan AudioSet (2 juta sampel dengan teks yang dihasilkan oleh model kata kunci-ke-teks). Meskipun ini hanya sebagian kecil dari data yang digunakan untuk melatih MuLan, kami telah berhasil menggunakan CLAP untuk menghasilkan beragam sampel musik, yang dapat Anda dengarkan di sini (ingatlah bahwa ini adalah hasil yang sangat awal). Jika ruang laten CLAP tidak cukup ekspresif untuk generasi musik, kita dapat melatih CLAP tentang musik atau mengganti model implementasi MuLan @lucidrain setelah dilatih.
SoundStream dan Encodec keduanya merupakan codec audio saraf yang mengkodekan bentuk gelombang apa pun ke rangkaian token akustik, yang kemudian dapat didekodekan menjadi bentuk gelombang yang menyerupai aslinya. Token perantara ini kemudian dapat dimodelkan sebagai tugas seq2seq. Encodec dirilis oleh Facebook dan pos pemeriksaan terlatih tersedia untuk umum, sedangkan SoundStream tidak demikian.
Tujuan dari proyek ini adalah untuk mereplikasi hasil MusicLM secepat mungkin tanpa harus berpegang pada arsitektur di makalah. Bagi mereka yang mencari implementasi yang lebih nyata, lihat musiclm-pytorch.
Kami juga berupaya mendapatkan pemahaman yang lebih baik mengenai ruang laten CLAP.
Bergabunglah dengan kami dalam perselisihan jika Anda ingin terlibat!
conda env create -f environment.yaml
conda activate open-musiclm
Sebuah "konfigurasi model" berisi informasi tentang arsitektur model seperti jumlah lapisan, jumlah penghitung, panjang audio target untuk setiap tahap, dll. Ini digunakan untuk membuat instance model selama pelatihan dan inferensi.
Sebuah "konfigurasi pelatihan" berisi hyperparameter untuk melatih model. Ini digunakan untuk memberi contoh kelas pelatih selama pelatihan.
Lihat direktori ./configs
untuk contoh konfigurasi.
Langkah pertama adalah melatih kuantizer vektor sisa yang memetakan penyematan CLAP berkelanjutan ke urutan token diskrit.
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
Selanjutnya, kita mempelajari lapisan K-means yang kita gunakan untuk mengkuantisasi penyematan MERT menjadi token semantik.
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
Setelah kami memiliki K-means dan RVQ yang berfungsi, kami sekarang dapat melatih tahapan semantik, kasar, dan halus. Tahapan ini dapat dilatih secara bersamaan.
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
Dalam kasus di atas, kami menggunakan CLAP, Hubert, dan Encodec untuk menghasilkan token tepuk, semantik, dan akustik secara langsung selama pelatihan. Namun, model ini memakan ruang pada GPU, dan tidak efisien untuk menghitung ulang token ini jika kita menjalankan beberapa kali pada data yang sama. Sebagai gantinya, kita dapat menghitung token ini sebelumnya dan mengulanginya selama pelatihan.
Untuk melakukannya, isi kolom data_preprocessor_cfg
di konfigurasi dan setel use_preprocessed_data
ke True di konfigurasi pelatih (lihat train_fma_preprocess.json untuk mendapatkan inspirasi). Kemudian jalankan perintah berikut untuk melakukan praproses himpunan data, diikuti dengan skrip pelatihan Anda.
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
Hasilkan beberapa sampel dan gunakan CLAP untuk memilih yang terbaik:
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
Hasilkan sampel untuk berbagai perintah pengujian:
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
Anda dapat menggunakan tanda --return_coarse_wave
untuk melewati tahap halus dan merekonstruksi audio dari token kasar saja.
Anda dapat mengunduh pos pemeriksaan eksperimental untuk model musiclm_large_small_context di sini. Untuk menyempurnakan model, panggil skrip kereta dengan tanda --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 }
}