การใช้งาน Pytorch ของ MusicLM ซึ่งเป็นโมเดลข้อความ SOTA เป็นเพลงที่เผยแพร่โดย Google พร้อมการแก้ไขเล็กน้อย เราใช้ CLAP แทน MuLan, Encodec แทน SoundStream และ MERT แทน w2v-BERT
CLAP เป็นโมเดลข้อความเสียงร่วมที่ได้รับการฝึกอบรมเกี่ยวกับ LAION-Audio-630K เช่นเดียวกับ MuLan ประกอบด้วยหอเสียงและหอข้อความที่ฉายสื่อที่เกี่ยวข้องไปยังพื้นที่แฝงที่ใช้ร่วมกัน (512 มิติใน CLAP เทียบกับ 128 มิติใน MuLan)
MuLan ได้รับการฝึกฝนเกี่ยวกับคู่ข้อความและเพลง 50 ล้านคู่ น่าเสียดายที่ฉันไม่มีข้อมูลที่จะทำซ้ำได้ ดังนั้นฉันจึงอาศัยจุดตรวจที่ได้รับการฝึกล่วงหน้าของ CLAP เพื่อเข้าใกล้ CLAP ได้รับการฝึกอบรมเกี่ยวกับคู่ข้อความ-เสียงรวม 2.6 ล้านคู่จาก LAION-630k (~633k คู่ข้อความ-เสียง) และ AudioSet (2 ล้านตัวอย่างพร้อมคำบรรยายที่สร้างโดยโมเดลคำหลักต่อคำบรรยาย) แม้ว่านี่จะเป็นเพียงเศษเสี้ยวของข้อมูลที่ใช้ในการฝึก MuLan แต่เราก็ได้ใช้ CLAP เพื่อสร้างตัวอย่างเพลงที่หลากหลาย ซึ่งคุณสามารถฟังได้ที่นี่ (โปรดจำไว้ว่านี่เป็นผลลัพธ์ที่เร็วมาก) ในกรณีที่พื้นที่แฝงของ CLAP ไม่แสดงออกเพียงพอสำหรับการสร้างดนตรี เราสามารถฝึก CLAP เกี่ยวกับดนตรีหรือทดแทนโมเดลสำหรับการใช้งาน MuLan ของ @lucidrain เมื่อได้รับการฝึกฝนแล้ว
SoundStream และ Encodec เป็นทั้งตัวแปลงสัญญาณเสียงแบบนิวรอลที่เข้ารหัสรูปคลื่นใดๆ ให้เป็นลำดับของโทเค็นเสียง ซึ่งสามารถถอดรหัสเป็นรูปแบบคลื่นที่คล้ายกับต้นฉบับได้ โทเค็นระดับกลางเหล่านี้สามารถสร้างแบบจำลองเป็นงาน seq2seq ได้ Facebook เปิดตัว Encodec และจุดตรวจที่ได้รับการฝึกไว้ล่วงหน้านั้นเปิดเผยต่อสาธารณะ แต่กรณีนี้ไม่ได้เกิดขึ้นกับ SoundStream
เป้าหมายของโปรเจ็กต์นี้คือการจำลองผลลัพธ์ของ MusicLM โดยเร็วที่สุดโดยไม่ต้องยึดติดกับสถาปัตยกรรมในรายงาน สำหรับผู้ที่มองหาการใช้งานในรูปแบบที่เป็นจริงมากขึ้น ลองดู musiclm-pytorch
นอกจากนี้เรายังพยายามทำความเข้าใจพื้นที่แฝงของ CLAP ให้ดียิ่งขึ้น
เข้าร่วมกับเราบน Discord หากคุณต้องการมีส่วนร่วม!
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-mean ที่เราใช้วัดปริมาณการฝัง 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-means และ 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 เพื่อสร้างโทเค็นการตบมือ ความหมาย และเสียงแบบสดระหว่างการฝึก อย่างไรก็ตาม โมเดลเหล่านี้ใช้พื้นที่บน GPU และการคำนวณโทเค็นเหล่านี้ใหม่จะไม่มีประสิทธิภาพหากเราดำเนินการหลายครั้งบนข้อมูลเดียวกัน เราสามารถคำนวณโทเค็นเหล่านี้ล่วงหน้าและทำซ้ำในระหว่างการฝึกอบรมแทน
หากต้องการทำสิ่งนี้ ให้กรอกข้อมูลในช่อง 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 }
}