您的位置:首页 > 教育 > 锐评 > 昇思25天学习打卡营第25天|LLM应用-基于MindNLP+MusicGen生成自己的个性化音乐

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

2025/8/22 10:24:42 来源:https://blog.csdn.net/wwt72/article/details/140533275  浏览:    关键词:昇思25天学习打卡营第25天|LLM应用-基于MindNLP+MusicGen生成自己的个性化音乐

打卡

目录

打卡

应用任务简介

生成音乐

预训练权重模型下载

无提示生成

文本提示生成

音频提示生成

生成配置


应用任务简介

MusicGen 来自 Meta AI 的 Jade Copet 等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《Simple and Controllable Music Generation》。

MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:

  1. 用户输入的文本描述作为输入传递给一个固定的文本编码器模型 谷歌的t5-base及其权重,以获得一系列隐形状态表示。
  2. 训练 MusicGen 解码器语言模型架构来预测离散的隐形状态音频token。
  3. 对这些音频token使用音频压缩模型( 用EnCodec 32kHz及其权重)进行解码,以恢复音频波形。

MusicGen 提供了small、medium和big三种规格的预训练权重文件,本次指南默认使用small规格的权重,生成的音频质量较低,但是生成的速度是最快的。

MusicGen 模型的新颖之处在于音频代码的预测方式。

传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。

与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的 token 交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。

MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构

环境准备

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

生成音乐

MusicGen支持两种生成模式:贪心(greedy)采样(sampling)

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

加载预训练权重模型

from mindnlp.transformers import MusicgenForConditionalGenerationmodel = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

无提示生成

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

 
import scipy
from IPython.display import Audiounconditional_inputs = model.get_unconditional_inputs(num_samples=1)audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)audio_length_in_s = 256 / model.config.audio_encoder.frame_rateaudio_length_in_s

文本提示生成

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

音频提示生成

#  
from datasets import load_datasetprocessor = 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)###
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)

生成配置

model.generation_config# increase the guidance scale to 4.0
model.generation_config.guidance_scale = 4.0# set the max new tokens to 256
model.generation_config.max_new_tokens = 256# set the softmax sampling temperature to 1.5
model.generation_config.temperature = 1.5audio_values = model.generate(**inputs)

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com