4.2 KiB
SongMASS
SongMASS: Automatic Song Writing with Pre-training and Alignment Constraint, by Zhonghao Sheng, Kaitao Song, Xu Tan, Yi Ren, Wei Ye, Shikun Zhang, Tao Qin, AAAI 2021, is a song writing system that leverages masked sequence to sequence (MASS) pre-training and attention-based alignment modeling for lyric-to-melody and melody-to-lyric generation.
The overall architecture of our SongMASS framework
The song-level MASS pre-training
1. Data
We obtain LMD dataset from here. We privode a script to parse LMD data in our experiments. We provide a example to instruct how to parse LMD data in our paper.
git clone https://github.com/yy1lab/Lyrics-Conditioned-Neural-Melody-Generation
DATADIR=Lyrics-Conditioned-Neural-Melody-Generation/lmd-full_MIDI_dataset/Sentence_and_Word_Parsing
OUTPUTDIR=data_org
python data/generate_lmd_dataset.py --lmd-data-dir $DATADIR --output-dir $OUTPUTDIR
bash generate_data.sh $OUTPUTDIR
Based on the above scripts, data samples will be generated under the data_org
directory. We consider para data as mono data and convert lyric file into bpecode to handle dictionary. The processed bpecode and dictionaries have been uploaded under data. We move dictionary files to mono
and para
directory. The format is as:
├── data_org
│ └── mono
│ ├── train.melody
│ ├── train.lyric
│ ├── valid.melody
│ ├── valid.lyric
│ ├── dict.lyric.txt
│ └── dict.melody.txt
│ └── para
│ ├── train.melody
│ ├── train.lyric
│ ├── valid.melody
│ ├── valid.lyric
│ ├── test.melody
│ ├── test.lyric
│ ├── dict.lyric.txt
│ ├── dict.melody.txt
│ ├── song_id_valid.txt
│ └── song_id_test.txt
We have provide the script to generate binarized data. The format is as:
# Ensure the output directory exists
data_dir=data_org/
# set this relative path of MASS in your server
user_dir=mass
bash preprocess.sh $data_dir $user_dir
2. Training
We provide an example script for running.
data_dir=data_org/processed # The path of binarized data
user_dir=mass
bash train.sh $data_dir $user_dir
3. Inference
For lyric inference, the running script is as below:
data_dir=data_org/processed
user_dir=mass
model=checkpoint_best.pt # your model path
bash infer_lyric.sh $data_dir $user_dir $model
For melody generation, the running script is as below:
data_dir=data_org/processed
user_dir=mass
model=checkpoint_best.pt # your model path
bash infer_melody.sh $data_dir $user_dir $model
A pre-trained model can be downloaded from here
4. Evaluation
We provide scripts under the evaluation folder to test the pitch/duration similarity and melody distance. The examples are as:
LYRIC=lyric.gt # The lyric file of ground truth
MELODY=melody.gt # The melody file of ground truth
HYPOS=hypo.txt # The generated result in fairseq format
SONG_ID=song_id_test.txt # The song id file
cd evaluate/
# pitch distribution similarity
python evaluate_histo.py \
--lyric-file $LYRIC \
--melody-file $MELODY \
--song-id-file $SONG_ID \
--generated-melody-file $HYPOS \
--metric pitch
# duration distribution similarity
python evaluate_histo.py \
--lyric-file $LYRIC \
--melody-file $MELODY \
--song-id-file $SONG_ID \
--generated-melody-file $HYPOS \
--metric duration
# melody distance
python evaluate_timeseries.py \
--lyric-file $LYRIC \
--melody-file $MELODY \
--song-id-file $SONG_ID \
--generated-melody-file $HYPOS
For more generated samples, please visit https://ai-muzic.github.io/songmass/.