Pop2Piano项目介绍
Pop2Piano是一个Transformer网络,旨在通过流行音乐的波形生成钢琴伴奏。这项创新的技术由Jongho Choi和Kyogu Lee在论文《Pop2Piano : Pop Audio-based Piano Cover Generation》中提出。人们普遍喜欢流行音乐的钢琴演奏版本,但要直接从音频生成这样的伴奏并非易事,通常需要对钢琴和音乐特性有深入的了解。然而,Pop2Piano通过其独特的方法,能够直接从歌曲音频中生成钢琴伴奏。
模型细节
Pop2Piano是首个可以直接从流行音乐音频生成钢琴伴奏的模型,它不需要传统的旋律与和弦提取模块。该模型基于T5的编码器-解码器Transformer架构。输入音频会被转换为波形,然后传入编码器进行隐藏表示的转换。解码器则利用这些隐藏表示以自回归的方式生成token id。每个token id对应四种不同的token类型:时间、力度、音符和“特殊”。这些token id最终会被解码为对应的MIDI文件。
模型资源
使用方法
为使用Pop2Piano,需要安装🤗 Transformers库及以下第三方模块:
pip install git+https://github.com/huggingface/transformers.git
pip install pretty-midi==0.2.9 essentia==2.1b6.dev1034 librosa scipy
注意,安装后可能需要重启运行环境。
将流行音乐转换为钢琴伴奏
代码示例
- 使用自定义音频
import librosa
from transformers import Pop2PianoForConditionalGeneration, Pop2PianoProcessor
audio, sr = librosa.load("<your_audio_file_here>", sr=44100) # 可根据需要改变采样率
model = Pop2PianoForConditionalGeneration.from_pretrained("sweetcocoa/pop2piano")
processor = Pop2PianoProcessor.from_pretrained("sweetcocoa/pop2piano")
inputs = processor(audio=audio, sampling_rate=sr, return_tensors="pt")
model_output = model.generate(input_features=inputs["input_features"], composer="composer1")
tokenizer_output = processor.batch_decode(
token_ids=model_output, feature_extractor_output=inputs
)["pretty_midi_objects"][0]
tokenizer_output.write("./Outputs/midi_output.mid")
- 从Hugging Face Hub获取音频
from datasets import load_dataset
from transformers import Pop2PianoForConditionalGeneration, Pop2PianoProcessor
model = Pop2PianoForConditionalGeneration.from_pretrained("sweetcocoa/pop2piano")
processor = Pop2PianoProcessor.from_pretrained("sweetcocoa/pop2piano")
ds = load_dataset("sweetcocoa/pop2piano_ci", split="test")
inputs = processor(
audio=ds["audio"][0]["array"], sampling_rate=ds["audio"][0]["sampling_rate"], return_tensors="pt"
)
model_output = model.generate(input_features=inputs["input_features"], composer="composer1")
tokenizer_output = processor.batch_decode(
token_ids=model_output, feature_extractor_output=inputs
)["pretty_midi_objects"][0]
tokenizer_output.write("./Outputs/midi_output.mid")
示例
以下为生成的MIDI实例:
- 实际流行音乐
- 生成的MIDI
小贴士
- Pop2Piano是基于T5的编码器-解码器模型。
- Pop2Piano可用于为给定的音频序列生成MIDI文件。
- 在
Pop2PianoForConditionalGeneration.generate()
中选择不同的作曲者可能会导致多样化的结果。 - 加载音频文件时将采样率设为44.1 kHz可获得良好性能。
- 虽然Pop2Piano主要通过韩国流行音乐进行训练,但在其他西方流行音乐或嘻哈歌曲上也表现良好。
引用
BibTeX:
@misc{choi2023pop2piano,
title={Pop2Piano : Pop Audio-based Piano Cover Generation},
author={Jongho Choi and Kyogu Lee},
year={2023},
eprint={2211.00895},
archivePrefix={arXiv},
primaryClass={cs.SD}
}