当前位置:   article > 正文

昇思25天学习打卡营第7天|应用实践之基于MindNLP+MusicGen生成自己的个性化音乐

昇思25天学习打卡营第7天|应用实践之基于MindNLP+MusicGen生成自己的个性化音乐

基本介绍

        在前几日的学习之后,对MindSpore有了基础了解,可以上手使用了。今日要学习体验的是AI模型的应用实践,体验的模型是Meta AI提出的MusicGen模型,需搭配MindNLP使用。因为只是体验模型和学习使用MindNLP的API,所以在没有NLP基础的情况下,也是勉强能够上手的,不过建议去听一下李宏毅老师的机器学习课程,有个基础可以更好上手学习。下面会对MusicGen进行简单介绍,然后配合MindNLP的API实践使用该模型,体验该模型的基础功能。

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不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。

MusicGen模型实践

        本次实践需使用到MindNLP,主要是模型加载API和一些十分简单的API,更复杂具体的自行参考官方文档MindNLP

  • 模型加载:需要从镜像参考下载好模型及预训练参数后,使用MindNLP的API加载模型,代码示例如下:
  1. from mindnlp.transformers import MusicgenForConditionalGeneration
  2. model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

        MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。因此我们默认启用采样模式,并且可以在调用MusicgenForConditionalGeneration.generate时设置do_sample=True来显式指定使用采样模式。MusicGen有3种生成音乐的方法,其区别在于提示的不同,,生成后可使用scipy将输出的音频保存为musicgen_out.wav 文件,然后使用Audio 在 notebook 进行播放。具体如下:

  • 无提示生成:不给模型任何提示,直接调用相关API接口生成,通过方法 MusicgenForConditionalGeneration.get_unconditional_inputs 获得网络的随机输入,然后使用 .generate 方法进行自回归生成,代码示例如下:
  1. %%time
  2. unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
  3. audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
  • 文本提示生成:基于文本提示,通过AutoProcessor对输入进行预处理。然后将预处理后的输入传递给 .generate 方法以生成文本条件音频样本。具体示例如下:
  1. %%time
  2. from mindnlp.transformers import AutoProcessor
  3. processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
  4. inputs = processor(
  5. text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
  6. padding=True,
  7. return_tensors="ms",
  8. )
  9. audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

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

  • 音频提示生成:AutoProcessor同样可以对用于音频预测的音频提示进行预处理。在以下示例中,我们首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,我们将生成出来的音频文件保存为musicgen_out_audio.wav。具体示例如下:
  1. %%time
  2. from datasets import load_dataset
  3. processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
  4. dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
  5. sample = next(iter(dataset))["audio"]
  6. # take the first half of the audio sample
  7. sample["array"] = sample["array"][: len(sample["array"]) // 2]
  8. inputs = processor(
  9. audio=sample["array"],
  10. sampling_rate=sample["sampling_rate"],
  11. text=["80s blues track with groovy saxophone"],
  12. padding=True,
  13. return_tensors="ms",
  14. )
  15. audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

除了上述模型功能使用外,还可以控制模型生成音乐的过程,对其进行配置,这里不进行介绍,有兴趣可以到MindSpore官方进行查阅体验。

Jupyter在线运行情况

        基于官方提供的在线运行平台,使用MindNLP提供的API接口下载MusicGen模型,实例化后对该模型进行体验,挺有趣的,就是运行的时候很慢,10分钟才能生成一小段音频(5-20s),不知道是算力原因,还是模型没有优化,又或者是生成式AI就是比较慢,还有一点就是Jupyter居然可以直接播放音乐,挺厉害的,之前没咋接触音视频这方面的算法,所以不知道。运行结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/788199
推荐阅读
相关标签
  

闽ICP备14008679号