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

安装库

%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!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

下载模型

from mindnlp.transformers import MusicgenForConditionalGeneration

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

音乐生成

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

无提示生成

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

%%time
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)

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

音频输出是格式是: a Torch tensor of shape (batch_size, num_channels, sequence_length)

使用第三方库scipy将输出的音频保存为musicgen_out.wav 文件。

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())
from IPython.display import Audio
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

参数 max_new_tokens 指定要生成 token 数。根据经验,可以使用 EnCodec 模型的帧速率计算出生成的音频样本的长度(以秒为单位):

audio_length_in_s = 256 / model.config.audio_encoder.frame_rate

audio_length_in_s

文本提示词生成

首先基于文本提示,通过AutoProcessor对输入进行预处理。然后将预处理后的输入传递给 .generate 方法以生成文本条件音频样本。同样,我们通过设置“do_sample=True”来启用采样模式。

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

%%time
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 IPython.display import Audio
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

音频提示生成

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

%%time
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())
from IPython.display import Audio
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

为了演示批量音频提示生成,我们将按两个不同的比例对样本音频进行切片,以提供两个不同长度的音频样本。由于输入音频提示的长度各不相同,因此在传递到模型之前,它们将被填充到批处理中最长的音频样本的长度。

要恢复最终音频样本,可以对生成的audio_values进行后处理,以再次使用处理器类删除填充:

sample = next(iter(dataset))["audio"]

# take the first quater of the audio sample
sample_1 = sample["array"][: len(sample["array"]) // 4]

# take the first half of the audio sample
sample_2 = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=[sample_1, sample_2],
    sampling_rate=sample["sampling_rate"],
    text=["80s blues track with groovy saxophone", "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)

# post-process to remove padding from the batched audio
audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)
Audio(audio_values[0], rate=sampling_rate)

整体而言,通过模型库,可以实现无提示词,有文本提示词,以及音频提示的方式,生成短暂的5s的音乐。

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ModuleNotFoundError: No module named 'mindnlp'表示无法找到名为'mindnlp'的模块。出现这个错误可能有多种原因,其中一个可能是因为没有正确安装或导入'mindnlp'模块。 要解决这个问题,可以按照以下步骤进行操作: 1. 首先,确认是否已经正确安装了'mindnlp'模块。可以通过命令行或终端运行以下命令来检查是否已安装该模块: ``` pip show mindnlp ``` 如果没有显示模块信息,则说明还未安装。可以使用以下命令来安装'mindnlp'模块: ``` pip install mindnlp ``` 2. 如果已经安装了'mindnlp'模块,但仍然出现该错误,请检查是否在代码中正确导入了该模块。根据引用和引用的内容来看,你可能需要从'mindnlp.utils'模块中导入所需的函数或类。请确保你的导入语句正确,并且模块的位置和命名是准确的。 例如,在代码中导入'mindnlp'模块的语句可能如下所示: ``` from mindnlp.utils import read_video ``` 确保路径和模块名正确,没有拼写错误。 3. 如果以上步骤都没有解决问题,还可能是'mindnlp'模块没有正确添加到项目的源代码目录。根据引用的内容来看,你可以尝试将'mindnlp'所在的目录设置为源代码根目录。在你的项目中,右键单击'mindnlp'所在的目录,选择"Make Directory as Source Root"选项,这样可以确保该目录被正确识别为源代码目录。 如果'mindnlp'模块是在其他位置,你需要将其正确导入到你的项目中。可以通过设置PYTHONPATH环境变量或使用sys.path.append()方法将模块所在的目录添加到python解释器的搜索路径中来实现。 通过以上步骤,你应该能够解决ModuleNotFoundError: No module named 'mindnlp'的问题,使得'mindnlp'模块能够被正确导入和使用。如果问题仍然存在,请提供更多的信息,以便更好地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值