昇思25天学习打卡营第25天 | 基于MindNLP+MusicGen生成自己的个性化音乐
MusicGen模型
MusicGen是基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本。
MusicGen模型基于Transformer结构,可以分解为三个阶段:
- 用户输入的文本传入一个固定的文本编码器,获得一系列隐形状态标识;
- 训练MusicGen解码器来预测离散的隐形状态音频token;
- 对音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。
MusicGen使用谷歌的t5-base及其权重作为文本编码器模型,并使用EnCodec 32kHz及其权重作为音频压缩模型。
下载模型
MusicGen提供了small、medium和big三种规格的预训练权重文件,默认为small。
from mindnlp.transformers import MusicgenForConditionalGeneration
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
生成音乐
MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。实际运行中,采样模式的结果要显著优于贪心模式,可以在调用MusicgenForConditionalGeneration.generate
时设置do_sample=True
来显示指定采样模式。
无提示生成
可以通过MusicgenForConditionalGeneration.get_unconditional_inputs
获得网络的随机输入,然后使用generate
方法进行自回归生成。
%%time
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
音频输出格式为:(batch_size, num_channels, sequence_length)
形状的Tensor,可以通过scipy
将其保存为.wav
格式文件。
import scipy
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
from IPython.display import Audio
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
文本提示生成
首先通过AutoProcessor
对输入进行预处理,然后将预处理后的结果传递给.generate
方法生成文本条件音频。
%%time
from mindnlp.transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
inputs = processor(
text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
padding=True,
return_tensors="ms",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
音频提示生成
AutoProcessor
也可以对音频进行预处理以作为音频提示。
%%time
from datasets import load_dataset
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]
# take the first half of the audio sample
sample["array"] = sample["array"][: len(sample["array"]) // 2]
inputs = processor(
audio=sample["array"],
sampling_rate=sample["sampling_rate"],
text=["80s blues track with groovy saxophone"],
padding=True,
return_tensors="ms",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
总结
这一节介绍了在MindSpore中下载以及使用MusicGen的方法。MusicGen是一个基于Transformer的音乐生成模型,使用t5-base
及其权重作为文本编码器,EnCodec 32kHz
及其权重作为音频压缩模型。MusicGen可以通过无提示、文本提示、音频提示来生成音乐,而其提供的预训练模型规格决定了生成音频的质量。