赞
踩
MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《Simple and Controllable Music Generation》。
MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:
MusicGen直接使用谷歌的t5-base及其权重作为文本编码器模型,并使用EnCodec 32kHz及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。
MusicGen 模型的新颖之处在于音频代码的预测方式。传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。
Figure 1: MusicGen使用的码本延迟模式,来源于 MusicGen paper.
MusicGen提供了small、medium和big三种规格的预训练权重文件,本次指南默认使用small规格的权重,生成的音频质量较低,但是生成的速度是最快的:
- %%capture captured_output
- # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行`!pip install mindnlp==0.3.1 jieba soundfile librosa`
- !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp jieba soundfile librosa
- rom 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())
- 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
同样可以对用于音频预测的音频提示进行预处理。在以下示例中,我们首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,我们将生成出来的音频文
- %%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)
件保存为musicgen_out_audio.wav
- 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)
控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。首先,我们检查默认的生成配置:
- 控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。首先,我们检查默认的生成配置:
-
- model.generation_config
- <mindnlp.transformers.generation.configuration_utils.GenerationConfig at 0xfffeb0dc0550>
-
- # 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.5
- 现在重新运行生成将使用生成配置中新定义的值
-
- audio_values = model.generate(**inputs)
心得:
(NLP)和音乐生成技术。这为我后续使用MindNLP和MusicGen打下了坚实的基础。
掌握MindNLP和MusicGen的使用方法:在学习过程中,我掌握了如何使用MindNLP进行文本处理,以及如何利用MusicGen生成个性化的音乐。这包括了解它们的API、模型结构以及训练过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。