一、MusicGen 模型原理
MusicGen 是由 Meta AI 的 Jade Copet 等人提出的基于单个语言模型(LM)的音乐生成模型。它能够依据文本描述或音频提示生成高质量的音乐样本,相关研究成果可参考论文《Simple and Controllable Music Generation》。
MusicGen 模型基于 Transformer 结构,可分解为以下三个阶段:
阶段 | 描述 |
---|---|
文本编码 | 用户输入的文本描述被传递给固定的文本编码器模型(如谷歌的 t5-base),以获取一系列隐性状态表示。 |
音频 token 预测 | 训练 MusicGen 解码器来预测离散的隐性状态音频 token。 |
音频解码 | 使用音频压缩模型(如 EnCodec 32kHz)对音频 token 进行解码,以恢复音频波形。 |
MusicGen 解码器是针对音乐生成任务从零开始训练的语言模型架构。其创新之处在于音频代码的预测方式,采用单个 stage 的 Transformer LM 结合高效的 token 交织模式,取消了多层级的多个模型结构,如分层或上采样,从而能够生成单声道和立体声的高质量音乐样本,并提供更好的生成输出控制。此外,MusicGen 不仅能生成符合文本描述的音乐,还能通过旋律条件控制生成的音调结构。
二、下载模型
MusicGen 提供了 small、medium 和 big 三种规格的预训练权重文件,本指南默认使用 small 规格的权重。
操作 | 代码 |
---|---|
卸载旧版本 MindSpore | !pip uninstall mindspore -y |
安装指定版本 MindSpore | !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14 |
安装其他所需库 | !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp jieba soundfile librosa |
查看 MindSpore 版本 | !pip show mindspore |
导入模型 | from mindnlp.transformers import MusicgenForConditionalGeneration model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") |
三、生成音乐
MusicGen 支持贪心(greedy)和采样(sampling)两种生成模式,采样模式的结果通常优于贪心模式,默认启用采样模式,可在调用 MusicgenForConditionalGeneration.generate
时设置 do_sample=True
来显式指定。
- 无提示生成
操作 | 代码 |
---|---|
获取随机输入 | unconditional_inputs = model.get_unconditional_inputs(num_samples=1) |
生成音频 | audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256) |
保存音频 | 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()) |
音频输出格式为 a Torch tensor of shape (batch_size, num_channels, sequence_length)
。
参数 | 计算方式 |
---|---|
生成音频长度(秒) | audio_length_in_s = 256 / model.config.audio_encoder.frame_rate |
- 文本提示生成
操作 | 代码 |
---|---|
预处理输入 | 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) |
保存音频 | scipy.io.wavfile.write("musicgen_out_text.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy()) |
- 音频提示生成
操作 | 代码 |
---|---|
数据准备和预处理 | 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) |
保存音频 | scipy.io.wavfile.write("musicgen_out_audio.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy()) |
为演示批量音频提示生成,可对样本音频进行不同比例的切片,并在传递给模型前进行填充处理。
四、生成配置
参数 | 默认值 | 可修改值 |
---|---|---|
采样模式 | do_sample=True | 可改为 do_sample=False |
指导比例 | guidance_scale=3 | 可增大,如 guidance_scale=4.0 |
最大生成 token 数 | max_new_tokens=1500 | 可修改,如 max_new_tokens=256 |
Softmax 采样温度 | temperature | 可修改,如 temperature=1.5 |
控制生成过程的默认参数(如采样、指导比例和生成的令牌数量)可在模型的生成配置中找到并按需更新。
model.generation_config
# increase the guidance scale to 4.0
model.generation_config.guidance_scale = 4.0
# set the max new tokens to 256
model.generation_config.max_new_tokens = 256
# set the softmax sampling temperature to 1.5
model.generation_config.temperature = 1.5
audio_values = model.generate(**inputs)
需注意,传递给 generate
方法的参数会取代生成配置中的参数。
综上所述,通过上述步骤和配置,我们能够基于 MindNLP 和 MusicGen 生成个性化的音乐。在实际应用中,可根据具体需求灵活调整参数和输入,以获得满意的音乐生成效果。