昇思Mindspore学习25天打卡Day16:热门LLM及其他AI应用|基于MindeNLP+MusicGen生成自己的个性化音乐
- 1 下载模型
- 2 生成音乐
- 2.1 无提示生成
- 2.2 文本提示生成
- 2.3 音频提示生成
- 3 生成配置 &训练结束打上标签和时间
MusicGen是来自Meta Al的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研密成果参考论文《Simple:Music Generation》
MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:
- 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。
- 训练MusicGen解码器来预测离散的隐形状态音频token。
- 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。
MusicGen直接使用谷歌的t5-base及其权重作为文本编阳器模型,并使用Encodec 32KH2及其汉重作为音频压缩模型,MuscGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。
MusicGen模型的新颖之处在于音顿代码的预测方式。传统上,每个玛本都必须由一个单独的模型(即分层或道过不断优化 Iensfomer模型的输出(围上采样)进行预测,与传统方法不同,MugicGen采用单个sta0e的Ieansfome LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。
Image
Figure 1: MusicGen使用的码本延迟模式,来源于 MusicGen paper.
1 下载模型
MusicGen提供了smal、medium和big三种规格的预训练权重文件,本次指南默认使用small规格的权重,生成的音频质量较低,但是生成的速度是最快的:
2 生成音乐
MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。因此我们默认启用采样模式,并且可以在调用MusicgenForConditionalGeneration.generate 时设置 do_sample=True 来显式指定使用采样模式。
2.1 无提示生成
我们可以通过方法:MusicgenForConditionalGeneration.get_unconditional_inputs 获得网络的随机输入,然后使用,generate 方法进行自回归生成,指定do_sample=True来启用采样模式:
音频输出是格式是: a Torch tensor ofshape(batch_size,num channels,sequence_length).
使用第三方库 scipy 将输出的音频保存为 musicgen_out.wav 文件。
【13】无提示生成的声音
参数 max_new_tokens 指定要生成 token 数。根据经验,可以使用 Encodec 模型的帧速率计算出生成的音频样本的长度(以秒为单位):
2.2 文本提示生成
首先基于文本提示,通过 AutoProcessor 对输入进行预处理。然后将预处理后的输入传递给.generate方法以生成文本条件音频样本。同样,我们通过设置"do_sample=True”来启用采样模式。
其中,guidance_scale 用于无分类器指导(CFG),设置条件对数之间的权重(从文本提示中预测)和无条件对数(从无条件或空文本中预测)。 guidancea_scale 越高表示生成的模型与输入的文本更加紧密。通过设置 guidance_scale >1 来启用 CFG。为获得最佳效果使用 guidance_scale=3(默认值)生成文本提示音频。
2.3 音频提示生成
AutoProcesor 同样可以对用于音频预测的音颂提示进行预处理。在以下示例中,我们首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,我们将生成出来的音频文件保存为musicgen_out_audio.wav
【20】音频提示生成
为了演示批量音频提示生成,我们将按两个不同的比例对样本音频进行切片,以提供两个不同长度的音频样本。由于输入音频提示的长度各不相同,因此在传递到模型之前,它们将被填充到批处理中最长的音频样本的长度。
要恢复最终音频样本可以对生成的audio_values进行后处理以再次使用处理器类删除填充:
【22】切片填充
3 生成配置 &训练结束打上标签和时间
控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。首先,我们检査默认的生成配置:
现在重新运行生成将使用生成配置中新定义的值
请注意,传递给 generate 方法的任何参数都将取代生成配置中的参数,因此在调用 generate 中设置 do_sample=False 将取代生成配置中 model.generation_config.do_sample 的设置.。