昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐案例
目录
MindSpore 环境配置与 Musicgen 模型加载
模型加载 Musicgen 模型的无条件生成与音频保存
基于文本输入的 Musicgen 模型生成与音频保存
使用预训练模型生成特定描述的音频并保存与播放
MindSpore 环境配置与 Musicgen 模型加载
首先实验环境预装了特定版本的 mindspore ,并提供了更改版本的方法,然后查看了当前 mindspore 的版本。接着安装了 mindnlp 包和 jieba 。最后从预训练模型 facebook/musicgen-small 中加载了 MusicgenForConditionalGeneration 模型。
代码如下:
%%capture captured_output
# 实验环境已经预装了mindspore==2.3.0rc1,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
# 查看当前 mindspore 版本
!pip show mindspore
# 安装 mindnlp 包
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp==0.2.4 jieba
from mindnlp.transformers import MusicgenForConditionalGenerationmodel = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
模型加载 Musicgen 模型的无条件生成与音频保存
首先获取了无条件输入以生成样本数量为 1 的数据。然后使用模型进行生成操作,设置了采样方式和生成的最大新标记数。接着获取了模型配置中的音频采样率,并使用 scipy.io.wavfile.write 将生成的音频数据保存为 wav 文件。还注释了在 notebook 中通过 Audio 来播放生成音频的相关代码,以及计算了音频的时长。
代码如下:
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
import scipysampling_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)
# audio_length_in_s = 256 / model.config.audio_encoder.frame_rate# audio_length_in_s
基于文本输入的 Musicgen 模型生成与音频保存
首先从预训练模型 facebook/musicgen-small 加载了 AutoProcessor 。然后使用这个处理器对给定的文本描述进行处理,包括填充操作,并指定返回的数据类型为 mindspore 的张量。接着利用模型根据处理后的输入进行生成操作,设置了采样方式、指导尺度和生成的最大新标记数。最后将生成的音频数据保存为 wav 文件,并注释了在 notebook 中播放生成音频的相关代码。
代码如下:
from mindnlp.transformers import AutoProcessorprocessor = 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)
运行结果:
使用预训练模型生成特定描述的音频并保存与播放
使用了相关的库和模型来处理音频数据并生成新的音频。
首先,通过 load_dataset 函数加载了名为 gtzan 的数据集的训练集部分,并获取了其中一个音频样本。然后,取这个音频样本的前一半数据。接下来,从预训练的模型 facebook/musicgen-small 加载了处理器 AutoProcessor 。之后,使用这个处理器对音频样本进行处理,同时结合给定的文本描述 80s blues track with groovy saxophone ,设置了一些参数,如采样率、填充方式和返回的数据类型等。最后,使用模型生成新的音频数据,并将其保存为 musicgen_out_audio.wav 文件,还可以在 notebook 中通过 Audio 来播放生成的音频样本。
代码如下:
from datasets import load_datasetdataset = 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]
# 使用音视频提示生成,耗时较久
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")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)
运行结果:
打印时间: