首页 > 其他分享 >《昇思25天学习打卡营第17天|热门LLM及其他AI应用-基于MindNLP+MusicGen生成自己的个性化音乐》

《昇思25天学习打卡营第17天|热门LLM及其他AI应用-基于MindNLP+MusicGen生成自己的个性化音乐》

时间:2024-07-15 19:00:31浏览次数:20  
标签:25 17 音频 MusicGen 生成 sample rate 打卡 audio

基于MindNLP+MusicGen生成自己的个性化音乐

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

MusicGen是一种单个语言模型(LM),它可以在多个压缩的离散音乐表示(即,令牌)流上运行。与先前的工作不同,MusicGen由单阶段变换器LM和高效的令牌交织模式组成,无需像分层或上采样那样级联多个模型。采用这种方法,在基于文本描述或旋律特征的条件下,使用MusicGen生成高质量的单声道和立体声样本,从而更好地控制生成的输出。

MusicGen 是专门用于音乐生成的音频生成模型。音乐曲目比环境声音更为复杂,在创建新颖的音乐作品时,尤其是在长期结构上生成连贯的样本尤为重要。该建模方法可以自然地扩展到立体声音乐生成。

在《MusicGen》工作中,我们探索了控制音乐生成的其他方法,并提出了一种新颖的无监督旋律引导生成方法,基于音程图。给定一个音乐样本,我们通过音程图提取主要旋律。音程图是一种特征,可以捕捉音乐的和声和旋律特征,并且对乐器和音色具有鲁棒性。该信号用于指导生成过程跟随提取的旋律,同时忠实于提供的文本描述。

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

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

MusicGen直接使用谷歌的t5-base及其权重作为文本编码器模型,并使用EnCodec 32kHz及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。

借助最新的多带扩散编码解码器(MBD-EnCodec),MusicGen的音频质量可以进一步提升。尽管需要更多的计算,但经过MBD增强的EnCodec生成的样本具有更少的音频失真。

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
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
from IPython.display import Audio

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)

参数 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
from IPython.display import Audio

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())

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

音频提示生成

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

%%time
from datasets import load_dataset
from IPython.display import Audio

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())

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)

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

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

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

# 取音频样本的第一个四分之一
sample_1 = sample["array"][: len(sample["array"]) // 4]

# 以音频样本的前半部分为例
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)

# 从批处理音频中删除填充的后处理
audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)

Audio(audio_values[0], rate=sampling_rate)

生成配置

控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。首先,我们检查默认的生成配置:

model.generation_config

我们看到模型默认使用采样模式 (do_sample=True),指导刻度为 3,最大生成长度为 1500(相当于 30 秒的音频)。你可以更新以下任一属性以更改默认生成参数:

# 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)

请注意,传递给 generate 方法的任何参数都将取代生成配置中的参数,因此在调用 generate 中设置 do_sample=False 将取代生成配置中 model.generation_config.do_sample 的设置。
在这里插入图片描述

标签:25,17,音频,MusicGen,生成,sample,rate,打卡,audio
From: https://blog.csdn.net/qq_46672668/article/details/140433240

相关文章

  • 2025年美国新奥尔良国际雪茄及烟斗协会贸易展 PCA Trade Show
    展会时间:2025年4月11日-14日展会地点:美国新奥尔良展会周期:一年一届主办单位:高级雪茄协会PremiumCigarAssociation展品范围各种香烟类、卷烟类、雪茄类、电子烟等;烈酒类、酒精饮料等酒精类产品类;烟具类、烟缸类、火机类、火柴类,酒瓶类等;自动贩售机类、酒类储藏柜......
  • 2025年美国拉斯维加斯国际烟草展览会Tobacco Plus Expo
    展会时间:2025年1月29日-1月31日展会地点:拉斯维加斯会展中心展会周期:一年一届主办单位:TMGInc.展品范围各种香烟、卷烟、雪茄、电子烟、水烟等;烟具、烟缸、火机、火柴等;烟丝、卷烟过滤嘴、卷烟纸、烟用化学品、粘合剂、香精和香精材料等;展会介绍   TPE是最大的优......
  • 2025年美国芝加哥国际家庭用品博览会IHA The Inspired Home Show
    展会时间:2025年3月2日-4日展出地点:美国芝加哥主办单位:美国家庭用品协会展馆名称:麦考密展览馆McCormickPlace展览周期:一年一届展品范围家庭日用品、家庭五金工具、金属器皿、餐具、小家电、家庭装饰品、圣诞礼品、宠物用具、儿童用品、塑料制品、烹饪用具、美食......
  • 逆向实战 | 手撕咚咚考勤定位打卡
    逆向实战|手撕咚咚考勤定位打卡傻逼软件,不说废话直接开始。安卓定位归根道理如果要获取经纬度跑不出两个函数:我干的事情很简单,直接一手硬编码写死(自己去地图软件找要定位的经纬度,经纬度都要改掉),并且从理论上说这个方法适用于大多数软件的定位功能:正常获取:patch(double写IEE......
  • 《昇思25天学习打卡营第06天|qingyun201003》
    日期心得什么是函数式自动微分,在日常的模型训练中,涉及到复杂的数学公式如何转换为机械语言,通过本次的学习,使我了解到了如何去做梯度计算,通过梯度计算,设计损失函数,有一步步优化代码。昇思MindSpore基础入门学习函数式自动微分(AI代码解析)函数式自动微分神经网络的......
  • 【408真题】2011-25
    “接”是针对题目进行必要的分析,比较简略;“化”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。涉及到的知识全部来源于王道各科教材(2025版)(408神功练成中……)文章目录一、接:本题分析二、化:套路总结一、接:本题分析2011-25分析【答】D【解......
  • 模型评估与选择 数模打卡
    文章目录模型评估与选择(评价指标理论)1.经验误差与过拟合2.评估方法留出法hand-out交叉验证法crossvalidation自助法bootstrapping调参与最终模型3.性能度量错误率与精度查准率、查全率与F1ROC与AUC代价敏感错误率与代价曲线模型评估与选择(评价指标理论)1.经验......
  • 聚类分析 数模打卡
    聚类分析1.聚类任务无监督学习:通过对无标记训练样本的学习来揭示数据的内在性质及规律。聚类:把数据集中的样本划分为若干互斥子集,每个子集称一个簇cluster。两个基本问题:性能度量与距离计算。2.性能度量vslidityindex.作为判断和优化目标。外部指标:将聚类结果与某......
  • MySQL - [17] Oracle、SQLServer、MySQL数据类型对比
    题记部分 一、数据类型对比对应关系(1)整数类型Oracle的NUMBER(*,0)对应SQLServer的INT和MySQL的INTOracle的BIGINT可能需要映射到SQLServer的BIGINT和MySQL的BIGINT(2)浮点数类型Oracle的BINARY_FLOAT/BINARY_DOUBLE对应SQLServer的FLOAT和MySQL......
  • 运维系列:拒绝用户‘root‘@‘172.17.0.1‘访问在本地Docker容器中运行的mysql数据库
    拒绝用户'root'@'172.17.0.1‘访问在本地Docker容器中运行的mysql数据库拒绝用户'root'@'172.17.0.1‘访问在本地Docker容器中运行的mysql数据库问题:答案:拒绝用户’root’@'172.17.0.1‘访问在本地Docker容器中运行的mysql数据库问题:我正在尝试连接到在本地Dock......