《昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐》

news2024/9/19 12:32:41

学习内容:基于MindSpore的GPT2文本摘要

1.模型简介

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

2.实践案例

环境准备

%%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
# 查看当前 mindspore 版本
!pip show mindspore

在这里插入图片描述

下载模型

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

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leecode C语言题解之第229题多数元素II

题目: 题解: /*** Note: The returned array must be malloced, assume caller calls free().*//*假定 num1,num2 为出现次数大于 nums.length / 3 的两个数。(最多出现两个)遍历 nums, 若出现 num1、num2…

论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer

目录 摘要 介绍 方法 VIT-V-Net体系结构 损失函数 图像相似性度量 变形场正则化 结果与讨论 摘要 在过去的十年里,卷积神经网络(ConvNets)在各种医学成像应用中占据了主导地位并取得了最先进的性能。然而,由于缺乏对图像中远程空间关系的理解&a…

代码报错:There‘s no Qt version assigned to project Project.vcxproj

错误 Theres no Qt version assigned to project Project.vcxproj for configuration Release/Win32. Please assign a Qt installation in Qt Project Settings. Project C:\Users\FA-02405\AppData\Local\QtMsBuild\qt_vars.targets 68 1.设置qt Versions 选择…

2017-2023年全国土地利用分类(新增2023年,空间分辨率10米)

2017-2023年全国土地利用分类数据 数据介绍 本文分享一份全国范围的土地利用分类数据。 该数据来源于Esri,以Sentinel-2卫星的遥感图作为数据源,并结合人工智能土地分类模型制作而成。 该数据的时间范围是2017年-2023年,空间分辨率是10米&…

OSU!题解(概率dp)

题目:OSU! - 洛谷 思路: 设E()表示截止到i所获得的分数; 对于到i点的每一个l,如果第i1点为1,那么会新增分数3*l^23*l1; 就有递推公式方程: E()E()p[i1]p*(3*l^23*l1);(p代表截止到i获得长度l的概率)&a…

角点检测及MATLAB实现

一、角点简介 角点通常指的是两条直线构成角时的交点。‌在更广泛的应用中,‌角点这一概念也被扩展到数字图像处理领域,‌其中角点被定义为图像中物体轮廓线的连接点,‌这些点在某方面属性特别突出,‌即在某些属性上强度最大或者最…

如何通过SSH协议使用WinSCP实现Windows与Linux之间的远程公网文件传输

目录 ⛳️推荐 前言 1. Windows传输文件至Linux 2. WinSCP使用公网TCP地址连接 3. WinSCP使用固定公网TCP地址访问服务器 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 前…

QT通用配置文件库(QPreferences)

QT通用配置文件库(QPreferences) QPreferences项目是基于nlohmann/json的qt可视化配置文件库,将配置保存成json格式,并提供UI查看与修改,可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体&#…

C#知识|账号管理系统:添加账号的功能笔记

哈喽,你好啊,我是雷工! 本节记录账号管理系统中添加账号的逻辑过程,以下为学习笔记。 01 实现内容 ①:实现当点击【保存到数据库】按钮时,将账号名称、原创篇数、账号简介、账号类型显示的内容存储到LGAccountManagerDB数据库的Account表中; ②:实现点击【保存到数据库…

手势控制机械手

机械手的手势控制 思路: 1 通过摄像头实现手势识别 2 将识别后的手势数据通过计算拇指与中指指尖的距离计算出舵机需要旋转的角度 3 将数据通过mqtt发送给mqtt服务器 4 硬件通过mqtt获取需要旋转的角度控制舵机旋转 开发环境: 硬件: ESP8266、舵机 硬件代码: 软件环…

颗粒饲料机器,打造成套饲料生产线

无论您是大型养殖场还是小型养殖户,我们的颗粒饲料机器能满足您的需求。我们致力于为客户打造成套饲料生产线,让您在养殖业中脱颖而出。 🚀 开启养殖新时代,您的饲料生产线升级设备! 还在为饲料生产烦恼吗&#xff1f…

【笔记-MyBatis】StatementHandler

Author:赵志乾 Date:2024-07-15 Declaration:All Right Reserved!!! 1. 简介 StatementHandler封装了对JDBC各类Statement的操作,如设置fetchSize属性、设置查询超时时间、与数据库进行交互等&…

第一节Linux常见指令

目录 1.Linux下基本指令 ls指令 pwd 命令 cd 指令 知识点:理解树形结构 touch 指令 mkdir指令(重要) rmdir指令 && rm指令(重要) 知识点:ls file* 可以找到当前目录下任何以file开头的文件​编辑 知识点:热键 man指令()重要 补充知识点:nano cp…

解锁Mac与Windows无缝协作新纪元:Tuxera NTFS for Mac 2022 —— 高效读写,畅享双系统自由

Tuxera NTFS for Mac 2022,作为一款专为Mac用户设计的文件系统驱动插件,它彻底打破了Mac与Windows之间在文件读写上的界限,为用户带来了前所未有的跨平台体验。 这款插件让Mac用户能够轻松访问、读取并写入NTFS格式的硬盘或U盘,无…

C++第七弹 -- C/C++内存管理

目录 前言一. C/C内存分布二. C语言中动态内存管理方式三. C中动态内存管理四. operator new与operator delete函数五. new和delete的实现原理1.内置类型2. 自定义类型 六. 定位new表达式(placement-new)七. 常见面试题总结 前言 在C/C编程中,内存管理是至关重要的…

jwt复习及ctfshow做题

Jwt复习总结 JWT简介 JWT即Json Web Token的缩写,顾名思义,是Token的一种。它常被用来在向服务器发起请求时用作身份认证。使用JWT作为身份认证的优势在于:它不需要在服务端去保留用户的认证信息。仅需要对该Token正确性进行校验即可,这就意…

张量分解(4)——SVD奇异值分解

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

那一单,教会我的不只是后悔

在销售行业中,每一笔成交都是一场精心策划的战役。每一个细节、每一次沟通都需要谨慎处理,以防辛苦建立的信任大厦瞬间崩塌。然而,即便是最小心谨慎的人也难免会犯错。我的一位好友,我们姑且称他为杰克,在一次不经意间…

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题,现总结一下 在开发过程中,发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查,怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…