240702_昇思学习打卡-Day14-基于MindNLP+MusicGen生成自己的个性化音乐

240702_昇思学习打卡-Day14-基于MindNLP+MusicGen生成自己的个性化音乐

前面一致做的都是图像的,可视化比较强,可以有比较多的图片帮助理解,但今天这个是关于音频的生成,基本只有干巴巴的代码,我尽量描述清楚些。相关研究成果参考论文《Simple and Controllable Music Generation》

首先我们来了解一下MusicGen,这个是Meta(前身是Facebook)推出的根据文字生成音乐的项目,其支持文生曲,曲生曲。用户可以通过修改描述词汇来生成不同风格的音乐。大家可以先去他的官网在线体验一下:MusicGen - a Hugging Face Space by facebook,这个网站可能需要大家自行优化一下网络,,不然不太好进。但进不了也没关系,咱们以下内容就是自己用代码实现这个东西。

MusicGen模型基于Transformer结构(上几篇有提到一点),可以分解为三个阶段:

  1. 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。

  2. 训练MusicGen解码器来预测离散的隐形状态音频token。

  3. 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。

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

MusicGen 模型的新颖之处在于音频代码的预测方式。传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。

下载模型

首先我们要开始干肯定要先把人家的模型拿到,我们为了保证下载速度,从一个镜像站下载(默认预装了mindspore环境)。

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

执行完了之后会输出如下内容,就是方便我们观察的:

'''
CPU times: user 3min 13s, sys: 12.1 s, total: 3min 26s
Wall time: 1min 32s

这段输出是执行代码单元格后,关于该单元格执行时间的报告。它分为两部分:CPU时间和Wall time。
CPU times:
user: 3分钟13秒,指的是代码在CPU上执行用户指令所花费的时间。这包括了程序的所有计算任务,但不包括等待操作系统服务的时间。
sys: 12.1秒,代表在内核模式下执行操作系统任务所花费的时间,比如系统调用。
total: 3分钟26秒,是用户时间和系统时间的总和,表明代码直接使用CPU资源的总时间。
Wall time:
1分钟32秒,这是从代码执行开始到结束的真实世界时间,也叫“墙钟时间”。它包含了CPU时间、I/O等待时间、以及其他可能的阻塞或等待事件,因此通常情况下Wall time会大于或等于CPU时间的总和。在这个例子中,Wall time显著小于CPU时间的总和,这可能表明代码执行过程中有并行处理发生,或者外部资源(如GPU计算、多线程处理)的有效利用,从而使得整体任务完成得更快。
'''

此时我们生成的音乐就是这个audio_values,但是,这个的格式还是a Torch tensor of shape (batch_size, num_channels, sequence_length),可以通过打印这个audio_values进行观察

audio_values
'''
输出为
Tensor(shape=[1, 1, 161920], dtype=Float32, value=
[[[-3.18956435e-01, -3.33604872e-01, -3.37755263e-01 ...  9.57774445e-02,  9.85850617e-02, -2.61695194e-03]]])
'''

说人话就是咱现在还听不着,所以就得进行一个转换。使用第三方库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())

此时默认保存在根目录,执行完了之后就可以去试听了,但是也可以直接载入notebook进行试听:

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

执行完了之后就会显示一个音频播放条,如下(这个放不了哦,别点,别说我忽悠你):
(但我吧wav转MP4了,正在审核,审核结束了我加进来)
image-20240702130028816

此时我们可以对生成的音频进行计数,也就是计算其长度,如下:

audio_length_in_s = 256 / model.config.audio_encoder.frame_rate

audio_length_in_s
'''
输出:5.12
'''

使用文本提示生成(文生曲)

基于文本提示,通过AutoProcessor(一个预处理器)对输入进行预处理。然后将预处理后的输入传递给 .generate 方法以生成文本条件音频样本。记得开采样模式。

其中,guidance_scale 用于无分类器指导(CFG),设置条件对数之间的权重(从文本提示中预测)和无条件对数(从无条件或空文本中预测)。guidance_scale越高表示生成的模型与输入的文本更加紧密。通过设置guidance_scale > 1来启用 CFG。为获得最佳效果,使用guidance_scale=3(默认值)生成文本提示音频。

# 使用%%time魔术命令来测量以下代码块的执行时间
%%time

# 导入AutoProcessor类,用于自动化处理文本和生成音频特征
from mindnlp.transformers import AutoProcessor

# 初始化处理器,使用预训练模型"facebook/musicgen-small"
# 这里的处理器是为特定任务(音乐生成)配置的
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")

# 处理输入文本,将其转换为模型可以接受的格式
# padding参数确保所有输入具有相同的长度
# return_tensors指定返回的张量类型为"ms"
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",
)

# 使用模型生成音频数据
# do_sample参数允许模型以随机方式生成音频
# guidance_scale参数控制创新和多样性的平衡
# max_new_tokens参数限制生成音频的最大新令牌数量
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

这里我们输入的文本是"80s pop track with bassy drums and synth", “90s rock song with loud guitars and heavy drums”

,即“80 年代流行曲目与低音鼓和合成器”、“90 年代摇滚歌曲与响亮的吉他和沉重的鼓”

正常的转换格式、保存曲目及在notebook进行试听:

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)

image-20240702141936524

音频提示生成(曲生曲)

我们刚才处理所用到的预处理器AutoProfessor同样可以对音频进行处理,要处理音频肯定就要音频文件嘛,就有个读取路径,然后进行预处理,处理完了就交给网络模型大展身手,最后保存出来。

%%time
from datasets import load_dataset

# 初始化处理器,使用预训练模型"facebook/musicgen-small"
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
# 加载数据
dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]

# 截取音频样本的前半部分
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)

image-20240702143601886

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

要恢复最终音频样本,可以对生成的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)

生成配置

首先我们对默认的生成配置进行检查:

model.generation_config.to_dict()

模型默认使用采样模式 (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)

打卡图片:

image-20240702170947420

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语言接入关键词搜索商品api疑点解析

接入关键词搜索商品API通常需要以下步骤: 了解API文档:首先,你需要阅读API的文档,了解API的基本功能、请求方式(GET、POST等)、请求参数、返回数据格式等信息。 安装必要的库:根据API的要求&am…

文件销毁是一件非常重要的事情分享一下我是如何安全、环保地处理

如何安全有效地销毁文件:一份详尽指南 在信息爆炸的时代,文件的生成、存储与处理已成为日常生活和工作中不可或缺的一部分。然而,随着数据量的激增,如何妥善管理并最终安全销毁不再需要的文件,成为了一个日益重要的议…

ListBox自动滚动并限制显示条数

1、实现功能 限制ListBox显示的最大条数; ListBox自动滚动,显示最新行; 2、C#代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using Syst…

JSP实现简单的登录和注册

JSP实现登录和注册(Map集合模拟数据库) 1、login.jsp2、 loginSelect.jsp3、register.jsp4、 RegisterSelect.jsp5、 index.jsp 1、login.jsp login.jsp中username和password在LoginSelect.jsp验证是否一致使用session.setAttribute("login_msg&quo…

职场小白必备待办工具有哪些 适合新手的待办app

初入职场的小白们,常常会遇到各种挑战。从最初的迷茫,到对工作的逐步熟悉,每一步都需要时间和精力的投入。尤其是当面对繁多的工作任务时,如何快速有效地完成它们,成为了许多职场新人需要面对的问题。 在这个快节奏的…

nginx.conf的配置文件

nginx.conf 1.全局模块 worker_processes 1 工作进程数,设置成服务器内核数的2倍(一般不超过8个,超过8个会降低性能4个 1-2个) 处理进程的过程必然涉及配置文件和展示页面,也就是涉及打开文件的数量。 linux默认打…

Ceyear®VSA 信号分析软件

CeyearVSA 信号分析软件 CeyearVSA 矢量信号分析软件 CeyearVSA 矢量信号分析软件将信号分析体验和测试应用于桌面,帮助排查问题并优化设计。 CeyearVSA 矢量信号分析软件结合仪表支持在线解调分析,也可支持信号导入离线分析;软件具有多种…

Python实现万花筒效果:创造炫目的动态图案

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制万花筒图案的函数主循环 完整代码 引言 万花筒效果通过反射和旋转图案创造出美丽的对称图案。在这篇博客中,我们将使用Python来实现一个动态的万花筒效果。通过利用Pygame库&#xf…

mac有什么解压软件 mac怎么解压7z软件 苹果电脑好用的压缩软件有哪些

众所周知,macOS集成解压缩软件归档实用工具,可直接解压zip格式的压缩包。但对于其他比较常见的格式,诸如RAR、7z、TAR等,则无能为力,不过,我们可以选择大量第三方解压缩软件,帮助我们更好地完成…

数据库取出来的日期格式是数组格式,序列化日期格式

序列化前,如图所示: 解决方式,序列化日期(localdatetime)格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…

虚拟纪念展馆建设的重大意义:重新定义纪念活动的未来

一、什么是虚拟纪念展馆? 虚拟纪念展馆是一种利用3D、VR等技术在线展示历史事件、人物或文化遗产的数字化空间。这些展馆通过虚拟现实、增强现实和3D建模等技术手段,创建出身临其境的体验,使参观者可以在互联网上以互动方式探索和学习。 二、…

最快33天录用!一投就中的医学4区SCI,几乎不退稿~

【SciencePub学术】今天小编给大家推荐2本生物医学领域的SCI,此期刊为我处目前合作的重点期刊!影响因子0-3.0之间,最重要的是审稿周期较短,对急投的学者较为友好! 医学医药类SCI 01 / 期刊概况 【期刊简介】IF&…

2025年U.S.News世界大学排名前200榜单

近日,U.S. News公布了2025全球最佳院校排名,作为公认的四大世界高校排行榜,该排名主要围绕着学术声誉、学术成果等,因此备受访问学者、联合培养博士生及博士后申请者们青睐,知识人网小编特作介绍并发布排名前200的榜单…

Springboot整合Redis以及业务工具类示例

docker安装Redis参考我另一篇博客Docker安装Redis及持久化 一、Get-Started 依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId>…

浏览器自动填充登录用户名和密码,如何清除

文章目录 刷新网页的时候浏览器会自动填充用户名和密码刷新之后效果图解决方案完整的login.vue代码核心代码原理(添加 readonly 和监听 focus 事件) 刷新网页的时候浏览器会自动填充用户名和密码 刷新之后效果图 解决方案 完整的login.vue代码 <template><div class…

MATLAB将两个折线图画在一个图里

界面如图 输入行数和列数&#xff0c;点击开始填入数据&#xff0c;其中第一列为x值&#xff0c;后面几列&#xff0c;每一列都是y坐标值&#xff0c;填好后点击画在同一张图里即可。点击置零就把所有数变成0&#xff0c;另外也可以选择节点样式。 .mlapp格式的文件如下 夸克…

助力消费品牌,打造3D立体互动购物体验!

随着3D、VR、AR等技术的飞跃发展&#xff0c;传统网络购物的界限被彻底打破&#xff0c;消费者不再局限于文字、图片或视频的二维体验&#xff0c;而是能够沉浸于3D构建的立体世界中&#xff0c;享受3D看房、虚拟逛街的全新购物模式。 51建模网作为国内3D互动展示领域的佼佼者…

如果这时你还不清理C盘,那只能眼睁睁看着电脑越来越卡 直到系统崩溃

如果这时候你还不清理C盘&#xff0c;那只能眼睁睁看着电脑越来越卡 直到系统崩溃。很多人就是想偷懒&#xff0c;当然这是人的天性&#xff0c;明明知道自己的C盘空间就那么大&#xff0c;一天天看着C盘空间越来越小&#xff0c;还不去清理C盘。 这样的人有两种&#xff0c;一…

Hadoop3:Yarn常用Shell命令

一、查看任务 1、查看所有任务 yarn application -list2、根据状态查看任务 语法 yarn application -list -appStates &#xff08;所有状态&#xff1a;ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED&#xff09;例如 yarn application…

启动react项目遇到的问题

保证node和npm已安装 遇到的问题一&#xff1a; 解决&#xff1a;npm init -f 问题二&#xff1a; 解决&#xff1a;npm install formidable --save 遇到的问题三&#xff1a;npm install卡住了 解决&#xff1a;更换镜像源