Bootstrap

《昇思25天学习打卡营第24天|基于MindNLP+MusicGen生成自己的个性化音乐》

#学习打卡第24天#

1. MusicGen模型

        MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《Simple and Controllable Music Generation》。

MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:

  1. 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。
  2. 训练MusicGen解码器来预测离散的隐形状态音频token。
  3. 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。

        MusicGen直接使用谷歌的t5-base及其权重作为文本编码器模型,并使用EnCodec 32kHz及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。

MusicGen 模型的新颖之处在于音频代码的预测方式。传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。

2. 模型调用

        MusicGen提供了small、medium和big三种规格的预训练权重文件。mindspore也已经对MusicGen模型做好了封装及调用接口,下面的演示默认使用small规格的权重,生成的音频质量较低,但是生成的速度是最快的

from mindnlp.transformers import MusicgenForConditionalGeneration

model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

3. 生成音乐

        MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。这里默认启用采样模式,也可以在调用MusicgenForConditionalGeneration.generate时设置do_sample=True来显式指定使用采样模式。

3.1 无提示生成

        可以通过方法MusicgenForConditionalGeneration.get_unconditional_inputs获得网络的随机输入,然后使用 .generate 方法进行自回归生成,指定 do_sample=True 来启用采样模式。

import scipy
from IPython.display import Audio

unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)


sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

3.2 文本提示生成

        基于文本提示,通过AutoProcessor对输入进行预处理。然后将预处理后的输入传递给 .generate 方法以生成文本条件音频样本。

        其中,guidance_scale 用于无分类器指导(CFG),设置条件对数之间的权重(从文本提示中预测)和无条件对数(从无条件或空文本中预测)。guidance_scale越高表示生成的模型与输入的文本更加紧密。通过设置guidance_scale > 1来启用 CFG。为获得最佳效果,使用guidance_scale=3(默认值)生成文本提示音频。

from mindnlp.transformers import AutoProcessor
from IPython.display import Audio

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())

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

3.3 音频提示生成

        AutoProcessor同样可以对用于音频预测的音频提示进行预处理。在以下示例中,首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,将生成出来的音频文件保存为musicgen_out_audio.wav。

from datasets import load_dataset
from IPython.display import Audio

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())

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

3.4 生成配置

        控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。比如可以更新以下任一属性以更改默认生成参数:

# 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)

Audio(audio_values[0], rate=sampling_rate)

请注意,传递给 generate 方法的任何参数都将取代生成配置中的参数,因此在调用 generate 中设置 do_sample=False 将取代生成配置中 model.generation_config.do_sample 的设置。

4. 心得总结

         MusicGen是一个基于人工智能的音乐生成模型,它允许用户通过简单的操作创造出独特的音乐作品。MindSpore封装的MusicGen模型接口直观易用,通过选择不同的音乐风格、节奏和旋律,以及不同的参数设置,可以轻松地定制出符合个人喜好的音乐片段。

        不过,对于实际场景中,想用好MusicGen模型,还是有不少的挑战和问题。比如调整参数以达到理想的音乐效果需要一定的耐心和实验。此外,虽然MusicGen提供了丰富的预设选项,但要创作出真正原创且具有深度的音乐,还需要更深入地了解音乐理论和创作技巧。

;