要说最近一两周AIGC领域最被关注的内容,非Suno AI莫属。
作为“音乐界的ChatGPT”,Suno AI最新推出的V3模型以其生成广播质量级别音乐的非凡能力火速引爆了音乐圈,网友们也纷开始放飞自我,在AI音乐生成的二创道路上越走越远。
B站网友Mr_Mr_han[1]和一玄青基于Suno AI的二创[2]
对AI开发者与爱好者来说,目前最大的遗憾可能就是Suno V3还没有开源,也没有任何训练的细节,但没有关系,我们现在可以通过魔乐社区玩转音乐生成—— MusicGen:https://modelers.cn/spaces/wujiacong/MusicGen
实践体验
接下来我们借音乐生成的案例来进行阐明。
音乐生成的方式有以下3种:
- 无提示生成:让模型“自力更生“,随机生成一段音乐,体验开音乐盲盒的惊喜。
- 文本提示生成:通过文本指定生成音乐的风格,如:生成一段80s的朋克风音乐,需要有很密集的鼓点。
- 音频提示生成:通过音频提示来生成音乐。
在此之前,需要完成一点点“准备工作“。
首先,我们将本次生成音乐用到的MusicGen-small模型进行实例化。
from mindnlp.transformers import MusicgenForConditionalGeneration
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
MusicGen提供了small、medium和big三种规格的预训练权重文件,本次指南默认使用small规格的权重,生成的音频质量较低,但是生成的速度是最快的。感兴趣的小伙伴也可以尝试不同其他规格的MusicGen。
接下来,就到了生成音乐的正式环节了。
MusicGen都是通过调用model.generate 接口,但可以通过变换不同的输入(即代码中的inputs)来实现不同方式的音乐生成。
补充一点,MusicGen支持贪心(greedy)和采样(sampling)两种生成模式。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。因此我们默认启用采样模式,并且可以在调用MusicgenForConditionalGeneration.generate时设置do_sample=True来显式指定使用采样模式。
在了解了音乐生成的整体思路后,我们就可以尝试上述的三种不同的音乐生成方式了。
方式1:无提示生成
我们可以通过方法 MusicgenForConditionalGeneration.get_unconditional_inputs 获得网络的随机输入,然后使用 .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=768)
接下来,我们需要使用第三方库 scipy 将输出的音频保存为musicgen_out_unconditional.wav 文件。
import scipy
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out_unconditional.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
方式2:文本提示生成
首先通过AutoProcessor对输入进行预处理,基于文本提示生成音频样本。然后,可以将预处理后的输入传递给.generate方法以生成文本条件音频样本。最后,我们将生成出来的音频文件保存为`musicgen_out_text.wav`。
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=768)
scipy.io.wavfile.write("musicgen_out_text.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
大家可以通过修改processor中的文本描述,定制自己个人风格的音乐。
方式3:音频提示生成
AutoProcessor同样可以对用于音频预测的音频提示进行预处理。在以下示例中,我们首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,我们将生成出来的音频文件保存为musicgen_out_audio.wav 。
from datasets import load_dataset
dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]
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())
大家如有其他的音频文件,也可以通过这种方式来引导模型输出。
附录:MusicGen是什么?
MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《Simple and Controllable Music Generation》[3]。
MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:
- 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。
- 训练MusicGen解码器来预测离散的隐形状态音频token。
- 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。
与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。
图表1 MusicGen使用的码本延迟模式
MusicGen直接使用谷歌的t5-base[4]及其权重作为文本编码器模型,并使用EnCodec 32kHz[5]及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。
关于魔乐
魔乐社区(Modelers.cn)是一个专为人工智能开发及爱好者打造的社区,提供工具链、数据集、模型和应用等AI领域生产要素的托管及展示服务。魔乐社区致力于汇聚AI全产业链的能力,依托理事会成员单位提供服务,吸引开发者和技术爱好者共同推动AI产业的发展,解决产业链中的难题,促进AI生态的繁荣。魔乐社区提供TDMA(Tools工具链、Datasets数据集、Models模型、Applications应用)的托管展示服务和支撑系统。为了方便模型及应用的展示,社区还提供免费算力用于体验模型和应用的效果。
欢迎大家体验,分享您的感受与建议,一起共建魔乐社区。如您在体验过程中遇到任何问题,欢迎访问魔乐社区的帮助中心(https://gitee.com/modelers/feedback)。
参考链接
[1]https://www.bilibili.com/video/BV1w1421D7tQ/?spm_id_from=333.337.search-card.all.click&vd_source=71c01b2a505751311824aae7033733ad
[2]https://www.bilibili.com/video/BV1Cx421S7fD/?spm_id_from=333.337.search-card.all.click&vd_source=71c01b2a505751311824aae7033733ad
[3]https://arxiv.org/abs/2306.05284
[4]https:///t5-base[5]https:///facebook/encodec_32khz
[5]https:///facebook/encodec_32khz