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

news2025/1/14 0:54:12

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.coloradmin.cn/o/1886144.html

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

相关文章

NX 二次开发-获取CAM切削层数据

int count 0;tag_t* objects;UF_UI_ONT_ask_selected_nodes(&count, &objects); //获取当前加工导航器选中的对象数量和tagif (count < 0){return 0;}UF_CUT_LEVELS_t* cut_levels_ptr_addr NULL; //读工序的切削层UF_CUT_LEVELS_load(objects[0], &…

c++习题06-ljc的储蓄计划

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 2&#xff0c;思路2 三&#xff0c;代码 1&#xff0c;思路1代码 2&#xff0c;思路2代码 四&#xff0c;用例输入输出 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 定义变量&#x…

【启明智显技术分享】SSD202D核心板方案双网口SBC2D06开发板开箱与实操全攻略上手指南

一、背景 本指南将详细介绍启明智显基于SSD202D核心板方案下的双网口-SBC2D06的开箱及实操上手应用。无论您是电子爱好者、开发者还是工程师&#xff0c;这份指南都能助您快速上手并充分利用这款双网口开发板的各项功能。 二、硬件介绍 SBC2D06双网口开发板&#xff0c;作为…

分布式链路追踪Micrometer Tracing和ZipKin基础入门与实践

【1】概述 在分布式与微服务场景下&#xff0c;我们需要解决如下问题&#xff1a; 在大规模分布式与微服务集群下&#xff0c;如何实时观测系统的整体调用链路情况。 在大规模分布式与微服务集群下&#xff0c;如何快速发现并定位到问题。 在大规模分布式与微服务集群下&…

SpringBoot 中的参数校验:构建健壮应用的基石

前言 在开发Web应用时&#xff0c;处理用户输入是不可避免的一环。然而&#xff0c;用户输入往往充满不确定性&#xff0c;可能是格式不正确、类型不匹配&#xff0c;甚至包含恶意内容。为了确保应用的稳定性和安全性&#xff0c;对输入参数进行有效校验显得尤为重要。Spring …

Vue3 特点以及优势-源码解剖

Vue3 特点以及优势-Vue3.4源码解剖 Vue3 特点以及优势 1.声明式框架 命令式和声明式区别 早在 JQ 的时代编写的代码都是命令式的&#xff0c;命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中&#xff0c;过程靠 vuejs 来实现 声明式代…

微软与OpenAI/谷歌与三星的AI交易受欧盟重点关注

近日&#xff0c;欧盟委员会主管竞争事务的副主席玛格丽特维斯塔格(Margrethe Vestager)在一次演讲中透露&#xff0c;欧盟反垄断监管机构将就微软与OpenAI的合作&#xff0c;以及谷歌与三星达成的AI协议寻求更多第三方意见。这意味着微软与 OpenAI、谷歌与三星的 AI 交易及合作…

数据库操作-DML和DQL

DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据&#xff08;INSERT&#xff09; 1.指定字段添加数据&#xff1a; insert into 表名 ( 字段名 1, 字段名 2) values ( 值 1, 值 2); 2…

守望先锋2卡顿/丢包?守望先锋2延迟高怎么降低

守望先锋2/ow2新赛季已经上线&#xff0c;想必很多玩家都已经进入游戏体验过&#xff0c;新的主题英雄和Push地图和改版后的斗兽场玻璃墙。不过虽然新赛季内容满满&#xff0c;有趣又好玩&#xff0c;但是架不住服务器拉跨&#xff0c;近期也有不少玩家吐槽新赛季问题频发&…

短信接口平台的核心功能有哪些?如何使用?

短信接口平台怎么有效集成&#xff1f;选择短信接口平台的技巧&#xff1f; 短信接口平台作为一种重要的通信工具&#xff0c;广泛应用于各种企业和组织。通过短信接口平台&#xff0c;企业能够高效、便捷地与客户进行互动和沟通。AoKSend将详细介绍短信接口平台的核心功能。 …

【博主推荐】HTML5实现简洁好看的个人简历网页模板源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c…

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

bmob Harmony鸿蒙快速开发搜索功能

搜索功能是很多应用都需要的功能。在很多平台上&#xff0c;要开发一个兼容性较好的搜索功能都还是需要添加比较多的视图代码的。 为了解决这个问题&#xff0c;鸿蒙ArkUI提供了一个快速添加搜索功能的视图组件给我们&#xff0c;结合Bmob Harmony鸿蒙SDK的搜索能力&#xff0…

Spark2.0

目录 10.3 Spark运行架构 10.3.1 基本概念 10.3.2 架构设计 ​编辑 10.3.3 Spark运行基本流程 Spark运行架构特点 10.3 Spark运行架构 10.3.1 基本概念 RDD &#xff1a;是 Resillient Distributed Dataset &#xff08;弹性分布式数据集&#xff09;的简称&#xff0c;是分…

前端开发中的常见问题及解决方法

前端开发是一个充满挑战和乐趣的领域。然而&#xff0c;在开发过程中&#xff0c;开发者常常会遇到各种各样的问题。本文将介绍一些前端开发中常用或者经常遇到的问题&#xff0c;并提供相应的解决方法&#xff0c;帮助你提高开发效率和解决问题的能力。 一. 页面布局问题 问题…

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

Audition 2024 for Mac/Win:音频处理的极致艺术

Adobe Audition 2024是一款面向Mac和Windows用户的顶级音频录制和编辑软件&#xff0c;以其卓越的性能和丰富的功能&#xff0c;满足了专业音乐制作、音频后期处理、播客录制等多个领域的需求。 Audition 2024提供了全面的音频处理功能&#xff0c;包括高效的录音、混音、编辑…

精密仪器中微型丝杆延长使用寿命的技巧!

微型丝杆是现代小型化机械中常用的传动元件&#xff0c;其具有高精度、高刚性、高效率等特点。被广泛应用在各种精密仪器当中&#xff0c;如&#xff1a;激光打印机、光学仪器、显微镜、高精度相机、医疗器械、智能家居、机器人等设备&#xff0c;可见在制造业中有无可替代的作…

CredSSP 远程执行代码漏洞(CVE-2018-0886)漏洞处理过程

Microsoft Windows CredSSP 远程执行代码漏洞(CVE-2018-0886)【原理扫描】 此漏洞被定级为高危漏洞&#xff0c;因此需要修复处理&#xff01; 【处理建议一】 凭据分配修改Oracle修正 运行 --> gpedit.msc --> 本地组策略编辑器 计算机配置 --> 管理模板 --> …

动手RAG: ocr调研

对于rag应用来说&#xff0c;文档是第一步&#xff0c;对于部分扫描件的文件来讲&#xff0c;主要就需要OCR. OCR tesseractppocrmmocr OCR包含几类&#xff0c; 自然场景中的文字识别&#xff0c;文档中的文字识别pipeline: 文本检测&#xff0c;文本识别&#xff0c;文…