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

news2024/12/23 13:28:40

文章目录

      • 昇思MindSpore应用实践
        • 1、MusicGen模型简介
          • 残差矢量量化(RVQ)
          • SoundStream
          • Encodec
        • 2、生成音乐
          • 无提示生成
          • 文本提示生成
          • 音频提示生成
      • Reference

昇思MindSpore应用实践

本系列文章主要用于记录昇思25天学习打卡营的学习心得。

1、MusicGen模型简介

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 属于后深度学习时代计算机听觉领域的一个 High-Level 阶段性成果,其多模态文本提示功能结合了 NLP 领域的工作t5-base,不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构,并用到了音视频、流媒体线上会议中语音压缩的重要技术EnCodec,而EnCodec再往下细分,还涉及到很多关于音频、语音信号处理 Low-Level的技术,如矢量量化、语音压缩与增强-SoundStream等。

残差矢量量化(RVQ)

传统的压缩算法一直集中在减少数据序列中的冗余-无论是在图像,视频还是音频中-以大量减少文件大小为代价,从原始信息中丢失一些信息。 MP3的有损压缩编码算法极大地改变了我们存储和共享音乐数据的方式,并成为一个著名的例子。

基于神经网络、深度学习的模型压缩技术作为一种新的方法,采用神经网络来表示压缩和重建数据,可能实现高压缩率,几乎零感知信息损失。无论是音频压缩还是图像超分、视频压缩,都起到了重要作用。

压缩旨在将各种数据类型,无论是像素形式(图像),波形(音频)还是帧序列(视频),转换为更紧凑的表示,如矢量。关键在于,这种压缩编码/矢量转换不仅仅是简单地减少数据大小:它产生了一种新的数据表示,更容易让模型进行模式自动识别,存储,然后用于重建。 这种表示被称为矢量量化嵌入,广泛用于深度学习,无论是从NLP语言模型还是AIGC图像生成。

在这里插入图片描述
上图介绍了矢量量化单个量化步骤的基本逻辑,该步骤将Encoder输出的具有128个维度的矢量最终减少到可以用码书中的单个数字表示(码本中的索引),从而压缩信息。

在这里插入图片描述残差矢量量化RVQ将量化过程分解为多个层,每个层处理前一层的残差,逐层寻找与前一层最相似的矢量。 这允许系统被缩放以在不同的比特率上操作(通过缩放层的数量)。这种分层的方法使得每个阶段都集中在前一阶段的残差上,因此,RVQ不是试图用单个码本直接对高维向量进行编码,而是分解了该问题,以显著降低的计算成本,并维持高精度。

SoundStream

在这里插入图片描述
在传统的音频处理PipeLine中,压缩和增强(去除背景噪声)通常由不同的模块执行。例如,音频增强算法可以应用在发送端(在压缩音频之前),或接收端(在音频解码之后)。在这样的设置中,每个处理步骤都会带来端到端的延迟。

相反,SoundStream 的设计是压缩和增强可以由同一模型联合执行,而不会增加整体延迟。

Encodec

在这里插入图片描述
整体结构与 SoundStream 相似,Encoder-Decoder 支持 streaming & non-streaming 两种推理方式,
1、Encoder 编码器用于获取未压缩的数据并将其转换为更高维度和更低帧率的表示;
2、Quantizer 量化器的 base module 替换成了 transformer,通过训练量化器保留最重要的信息来重建原始信号。
3、Decoder 解码器:将压缩信号转换回与原始信号尽可能相似的波形,有损压缩的关键是识别人类无法感知的变化,因为在低比特率下完美的重建是不可能的。为此,EnCodec 使用鉴别器来提高生成样本的感知质量,创建了一个类似GAN的机制,其中鉴别器的工作是区分真实样本和重建样本。压缩模型试图通过推动重建的样本在感知上与原始样本更加相似来生成样本来欺骗鉴别器,以此获得更好的重建质量。
4、除此之外,EnCodec 模型还计算其他类型的损失。 这些损失包括将重建的波形和梅尔频谱图与原始波形和梅尔频谱图进行比较,以及评估承诺损失以稳定编码器的输出。 最终目标是确保音频的输出与初始输入密切相关。

2、生成音乐

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)
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)
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")  # 导入musicgen预训练权重,如果small失效的话换medium试试

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")  # 同样不建议用-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)

在这里插入图片描述

Reference

[1] 昇思大模型平台
[2] 昇思官方文档-基于MindNLP+MusicGen生成自己的个性化音乐
[3] Pi酱鸭力山大-阅读笔记:MUSICGEN——Simple and Controllable Music Generation(2023.06)
[4] 深度学习在音乐信息检索(MIR)方向的应用介绍
[5] What is Residual Vector Quantization?

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

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

相关文章

Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍

文章目录 一、Qt SQL模块概述1.Qt sql 支持的数据库2.SQLite 数据库3.Qt SQL 模块的主要类 一、Qt SQL模块概述 Qt SQL 模块提供数据库编程的支持,Qt 支持多种常见的数据库,如MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块包括多个类&#xff0…

phpstorm配置xdebug3

查看php路径相关信息 php --ini安装xdebug https://www.jetbrains.com/help/phpstorm/2024.1/configuring-xdebug.html?php.debugging.xdebug.configure php.ini 配置 在最后添加,以下是我的配置 [xdebug] zend_extension/opt/homebrew/Cellar/php8.1/8.1.29/p…

安装NVIDIA驱动

一、不升级内核安装NVIDIA驱动 说明: 1、安装NVIDIA驱动,是用来提升AI、图片等算法 2、本人是在centos7.9操作系统安装英伟达T4板卡驱动 操作系统Centos 7.9驱动版本NVIDIA-Linux-x86_64-525.89.02.run操作账号root1.1 关闭nouveau 1、查看nouveau是否关闭 lsmod |grep nouv…

Android 常用调试工具/方法解析

一、内存相关 参考Android内存分析命令_dumpsys meminfo 算出rss-CSDN博客 1、基本概念 1)PSS & RSS & USS & VSS a、PSS 概念:全称Proportional Set Size,根据进程实际使用的内存量按照共享比例分配给进程的一种内存度量方…

MySql性能调优05-[sql实战演练]

sql实战演练 行列转换行列式转换第一题【列转行】第二题【列转行】 having的使用找到表中,名字重复的项有数据表employee,包含如下字段id、name、department、age,编写SQL,找到不与其他人同龄的年纪最大的员工的年龄有数据表emplo…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法,是一个类似指针功能的类对象,其目的是为了更好的管理动态分配的内存,避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类,分别是std::unique_ptr、std::shared_ptr…

vue 两个页面切换, 再回到当前页,还是离开前的数据

1、要保证页面的name 和 建路由的大小写一致 2、页面不用生命周期--activated 调接口刷新

计算机网络八股文(三)

目录 41.为什么每次建立TCP连接时,初始化的序列号都不一样? 42.初始序列号ISN如何随机产生? 43.既然IP层会分片,为什么TCP层需要根据MSS分片呢? 44.TCP第一次握手丢失,会发生什么? 45.TCP第…

一个python脚本解决新版剪映导出字幕收费问题

如果你是希望我能完全解决剪映收费问题,我无法帮你; 两个文件,可生成不带时间线的纯文案,MD 格式,也可以生成带时间线的 SRT 文件。 因为剪映国内版对 JSON 文件进行了加密,所以请选择国际版 Cutcap&#x…

《javaEE篇》--阻塞队列详解

阻塞队列 阻塞队列概述 阻塞队列也是一种队列,和普通队列一样遵循先进先出的原则,但是阻塞队列相较于普通队列多了两项功能阻塞添加和阻塞移除,使得阻塞队列成为一种线程安全的数据结构 阻塞添加:当队列满的时候继续入队就会阻…

电脑虚拟摄像头软件分享|用手机打破电脑摄像头的极限

随着手机摄像头的不断更新迭代,手机已经接近专业电脑摄像头的画质。这让我们可以花费更低的成本获取优质的电脑录像画面。今天小编给大家详细讲解电脑虚拟摄像头的在我们日常生活中的妙用,以及分享几款口碑不错的电脑虚拟摄像头软件。有需要的小伙伴可以…

从业务到数据,大模型应用成功的再思考!

自2022年底OpenAI发布ChatGPT以来,大模型在企业的应用方兴未艾。 大模型必须要结合落地应用,才算是长出手跟脚,真正应用于实际业务场景的解决方案中,配合“大脑”完成任务。从医疗诊断到自动驾驶,从个性化营销到智能客…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置,且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换,做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如,在两页PPT中,使用同一个形状对象,修改了大小和颜色。 选择切换为平滑后,可以完成如下的动画显示。 …

milvus的collection操作

milvus的collection操作 创建collection import uuidfrom pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )collection_name "hello_milvus" host "192.168.230.71" port 19530 username "" password…

JavaScript:数组排序(冒泡排序)

目录 一、数组排序 二、sort()方法 1、基本语法 2、默认排序 3、自定义排序 三、冒泡排序 1、基本概念 2、实现步骤 3、过程解析 4、代码示例 5、时间复杂度 一、数组排序 对一个给定数组进行处理,使其从无序变为有序,这个过程就是数组排序&…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来,制造图形界面的移动使用,那接下来我会与你一同使用它,并进行study,如有困惑,可随时联系。 然后,需要使用pysimplgui,如果…

Vue3+.NET6前后端分离式管理后台实战(三十一)

1,Vue3.NET6前后端分离式管理后台实战(三十一)

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作,途中曾担任过人工智能工程师和计算机视觉工程师,没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…