当前位置: 首页 > news >正文

扩散模型实战(十四):扩散模型生成音频

 推荐阅读列表:

 扩散模型实战(一):基本原理介绍

扩散模型实战(二):扩散模型的发展

扩散模型实战(三):扩散模型的应用

扩散模型实战(四):从零构建扩散模型

扩散模型实战(五):采样过程

扩散模型实战(六):Diffusers DDPM初探

扩散模型实战(七):Diffusers蝴蝶图像生成实战

扩散模型实战(八):微调扩散模型

扩散模型实战(九):使用CLIP模型引导和控制扩散模型

扩散模型实战(十):Stable Diffusion文本条件生成图像大模型

扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件

扩散模型实战(十二):使用调度器DDIM反转来优化图像编辑

扩散模型实战(十三):ControlNet结构以及训练过程

       在之前的文章中,我们主要介绍了扩展模型在文本生成和文本生成图像的应用,本文将介绍在音频领域的应用。

一、安装环境

!pip install -q datasets diffusers torchaudio accelerate
import torch, randomimport numpy as npimport torch.nn.functional as Ffrom tqdm.auto import tqdmfrom IPython.display import Audiofrom matplotlib import pyplot as pltfrom diffusers import DiffusionPipelinefrom torchaudio import transforms as ATfrom torchvision import transforms as IT

二、从预训练的音频扩散模型Pipeline中进行采样

       加载预训练好的音频扩散模型Audio Diffusion(用于生成音频的梅尔谱图)

# 加载一个预训练的音频扩散模型管线device = "cuda" if torch.cuda.is_available() else "cpu"pipe = DiffusionPipeline.from_pretrained("teticio/audio-diffusion- instrumental-hiphop- 256").to(device)Fetching 5 files:   0%|          | 0/5 [00:00<? , ?it/s]

         对pipe进行一次采样

# 在管线中采样一次并将采样结果显示出来output = pipe()display(output.images[0])display(Audio(output.audios[0], rate=pipe.mel.get_sample_rate()))

         采样结果,如下图所示:

       上述代码中,rate参数表示音频的采样率,下面我们查看一下音频序列和频谱

# 音频序列output.audios[0].shape# 输出(1, 130560)
# 输出的图像(频谱)output.images[0].size# 输出(256, 256)

       音频并非由扩散模型直接生成的,而是类似于无条件图像生成管道那样,使用一个2D UNet网络结构来生成音频的频谱,之后经过后处理转换为最终的音频。

三、从音频转换为频谱

       音频的”波形“在时间上展示了源音频,例如,音频的”波形“可能是从麦克风接收到的电信号。这种”时域“上的表示处理起来比较棘手,因此通常会转换为频谱来处理,频谱能够直接展示不同频率(y轴)和时间(x轴)的强度。

# 使用torchaudio模块计算并绘制所生成音频样本的频谱,如图8-2所示spec_transform = AT.Spectrogram(power=2)spectrogram = spec_transform(torch.tensor(output.audios[0]))print(spectrogram.min(), spectrogram.max())log_spectrogram = spectrogram.log()lt.imshow(log_spectrogram[0], cmap='gray');tensor(0.) tensor(6.0842)

       频谱图,如下所示:

   以上图刚刚生成的音频样本为例,频谱的取值范围是0.0000000000001~1,其中大部分值接近取值下限,这对于可视化和建模来说不太理想,为此,我们使用了梅尔频谱(Mel spectrogram)对不同频率进行一些变换来符合人耳感知特性,下图展示了torchaudio音频转换方法:

幸运的是,我们使用mel功能可以忽略这些细节,就能吧频谱转换成音频:

a = pipe.mel.image_to_audio(output.images[0])a.shape# 输出(130560,)

       读取源音频数据,然后调用audio_slice_to_image()函数,将源音频数据转换为频谱图像。同时较长的音频片段也会自动切片,以便可以正常输出256X256像素的频谱图像,代码如下:

pipe.mel.load_audio(raw_audio=a)im = pipe.mel.audio_slice_to_image(0)im

      音频被表示成一长串数字数组。若想播放音频,我们需要采样率这个关键信息。 

       我们查看一下单位时间音频的采样点有多少个?

sample_rate_pipeline = pipe.mel.get_sample_rate()sample_rate_pipeline# 输出22050

如果设置别的采样率,那么会得到一个加速或者减速播放的音频,比如:

display(Audio(output.audios[0], rate=44100)) # 播放速度被加倍

四、微调音频扩散模型数据准备

       在了解了音频扩散模型Pipeline使用之后,我们在新的数据集上对其进行微调,我们使用的数据集由不同类别的音频片段集合组成的,代码如下:

from datasets import load_datasetdataset = load_dataset('lewtun/music_genres', split='train')dataset

查看一下该数据集不同类别样本所占的比例:

for g in list(set(dataset['genre'])):    print(g, sum(x==g for x in dataset['genre']))

输出内容如下:

Pop 945Blues 58Punk 2582Old-Time / Historic 408Experimental 1800Folk 1214Electronic 3071Spoken 94Classical 495Country 142Instrumental 1044Chiptune / Glitch 1181International 814Ambient Electronic 796Jazz 306Soul-RnB 94Hip-Hop 1757Easy Listening 13Rock 3095

该数据集已将音频存储为数组,代码如下:

audio_array = dataset[0]['audio']['array']sample_rate_dataset = dataset[0]['audio']['sampling_rate']print('Audio array shape:', audio_array.shape)print('Sample rate:', sample_rate_dataset)# 输出Audio array shape: (1323119,)Sample rate: 44100

PS:该音频的采样率更高,要使用该Pipeline,就需要对其进行”重采样“。音频也比Pipeline预设的长度要长,在调用pipe.mel加载该音频时,会被自动切片为较短的片段。代码如下:

a = dataset[0]['audio']['array']  # 得到音频序列pipe.mel.load_audio(raw_audio=a)  # 使用pipe.mel加载音频pipe.mel.audio_slice_to_image(0)  # 输出第一幅频谱图像

sample_rate_dataset = dataset[0]['audio']['sampling_rate']sample_rate_dataset# 输出44100

       从上述代码结果可以看出,该数据集的数据在每一秒都拥有两倍的数据点,因此需要调整采样率。这里我们使用torchaudio transforms(导入为AT)进行音频重采样,并使用Pipeline的mel功能将音频转换为频谱图像,然后使用torchvision transforms(导入为IT)将频谱图像转换为频谱张量。一下代码中的to_image()函数可以将音频片段转换为频谱张量,供训练使用:

resampler = AT.Resample(sample_rate_dataset, sample_rate_pipeline,     dtype=torch.float32)to_t = IT.ToTensor() def to_image(audio_array):    audio_tensor = torch.tensor(audio_array).to(torch.float32)  audio_tensor = resampler(audio_tensor)  pipe.mel.load_audio(raw_audio=np.array(audio_tensor))  num_slices = pipe.mel.get_number_of_slices()  slice_idx = random.randint(0, num_slices-1)  # 每次随机取一张(除了 # 最后那张)  im = pipe.mel.audio_slice_to_image(slice_idx)   return im

整理微调数据

def collate_fn(examples):  # 图像→张量→缩放至(-1,1)区间→堆叠  audio_ims = [to_t(to_image(x['audio']['array']))*2-1 for x in      examples]  return torch.stack(audio_ims) # 创建一个只包含Chiptune/Glitch(芯片音乐/电子脉冲)风格的音乐batch_size=4                   # 在CoLab中设置为4,在A100上设置为12chosen_genre = 'Electronic'    # <<< 尝试在不同的风格上进行训练 <<<indexes = [i for i, g in enumerate(dataset['genre']) if g ==    chosen_genre]filtered_dataset = dataset.select(indexes)dl = torch.utils.data.DataLoader(filtered_dataset.shuffle(), batch_   size=batch_size, collate_fn=collate_fn, shuffle=True)batch = next(iter(dl))print(batch.shape)# 输出torch.Size([4, 1, 256, 256])

五、开始微调音频扩散模模型

epochs = 3lr = 1e-4 pipe.unet.train()pipe.scheduler.set_timesteps(1000)optimizer = torch.optim.AdamW(pipe.unet.parameters(), lr=lr) for epoch in range(epochs):    for step, batch in tqdm(enumerate(dl), total=len(dl)): # 准备输入图片         clean_images = batch.to(device)        bs = clean_images.shape[0]  # 为每一张图片设置一个随机的时间步         timesteps = torch.randint(            0, pipe.scheduler.num_train_timesteps, (bs,),             device=clean_images.device        ).long()        # 按照噪声调度器,在每个时间步为干净的图片加上噪声         noise = torch.randn(clean_images.shape).to(clean_images.            device)        noisy_images = pipe.scheduler.add_noise(clean_images,             noise, timesteps) # 得到模型的预测结果         noise_pred = pipe.unet(noisy_images, timesteps, return_            dict=False)[0]        # 计算损失函数        loss = F.mse_loss(noise_pred, noise)        loss.backward(loss)         # 使用优化器更新模型参数        optimizer.step()        optimizer.zero_grad()# 装载之前训练好的频谱样本,如图8-6所示pipe = DiffusionPipeline.from_pretrained("johnowhitaker/Electronic_ test").to(device)output = pipe()display(output.images[0])display(Audio(output.audios[0], rate=22050))# 输入一个不同形状的起点噪声张量,得到一个更长的频谱样本,如图8-7所示noise = torch.randn(1, 1, pipe.unet.sample_size[0],pipe.unet.sample_size[1]*4).to(device)output = pipe(noise=noise)display(output.images[0])display(Audio(output.audios[0], rate=22050))

生成的频谱,如下图所示:

生成更长的频谱样本,如下图所示:

思考:

  1. 我们使用的是256X256像素的方形频谱图像,这会限制batch size,能否从128X128像素的频谱图像中恢复出质量足够好的音频呢?

  2. 为了替代随机图像增强,我们每次都挑选了不同的音频片段,但这种方法在训练循环后期是否可以用其他增强方法进行优化呢?

  3. 是否有其他办法可以用来生成更长的音频呢?或者可以先生成开头的5s音频,之后再采用类似图像修复的思路继续生成后续的音频。

  4. 扩散模型生成的内容与Img2Img生成的内容有什么相同之处?

相关文章:

扩散模型实战(十四):扩散模型生成音频

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…...

《微信小程序开发从入门到实战》学习四十七

4.4 云函数 4.4.5 云函数的定时触发 如果云函数需要定时执行&#xff0c;可以使用云函数定时触发器。配置了定时触发器&#xff0c;云函数会在相应时间点被自动触发。函数返回结果不会返回调用方 在需要添加触发器的云函数下新建文件config.json。格式如下&#xff1a; &quo…...

LeetCode刷题笔记之数组

一、二分查找 1. 704【二分查找】 题目&#xff1a; 给定一个 n 个元素 有序的&#xff08;升序&#xff09; 整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。代码&#xff1a;…...

ViT:视觉 Transformer

ViT&#xff1a;视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势&#xff1a;注意力机制相当于一个多标签检索系统&#xff0c;位置嵌入能知道每个单词的位置&#xff0c;而且适合并行。 尝试把 Transformer 迁移到视觉领…...

Jmeter 请求签名api接口-BeanShell

Jmeter 请求签名api接口-BeanShell 项目签名说明编译扩展jar包jmeter 使用 BeanShell 调用jar包中的签名方法 项目签名说明 有签名算法的api接口本地不好测试&#xff0c;使用BeanShell 扩展jar 包对参数进行签名&#xff0c;接口签名算法使用 sha512Hex 算法。签名的说明如下…...

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况&#xff1a; 压根没安装下载了但没设为库或方法不对 大多数为第一种情况&#xff1a; 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…...

word文档中数字格式转换(排版助手)

示例&#xff1a;李老师收入了234243.33元&#xff0c;产量3000公斤&#xff1b; 张老师收入了2324324元&#xff0c;产量45555公斤&#xff1b; 孙老师收入了600000元&#xff0c;产量2342公斤 王老师收入了1234443243元&#xff0c;产量1243142公斤。 1、数字批量转换成千…...

阿里云docker加速

文章目录 一、 阿里云镜像仓库配置二、配置加速1. CentOS2. Mac3. Windows注意 一、 阿里云镜像仓库配置 1.注册阿里云账号&#xff0c;并登陆到阿里云后台&#xff0c;进入控制台面板 2.进入控制台以后&#xff0c;找到左上方的三横的功能列表按钮&#xff0c;在弹出来的功能…...

Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现

0x01 产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流量的信息进行日志留存&#xff0c;可对用户上网行为进行审计&#xff0c;逐渐形成大数据采集、 大数据分析、 大数据整合的工作模式…...

openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复

文章目录 openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复152.1 背景信息152.2 前提条件152.3 PITR恢复流程152.4 recovery.conf文件配置**152.4.1 归档恢复配置****152.4.2 恢复目标设置** openGauss学习笔记-152 openGauss 数据库运维-备份…...

PhpStorm基本配置及常用快捷键

重要Preference配置 激活服务器 http://jetbrains.tencent.click/http://owo.helphttp://idea.imsxm.com/http://www.0-php.com:10172017.3以上版本 JetBrains IDE 2017.3以上版本&#xff0c;激活检测机制变成了动态封禁域名&#xff0c;导致大部分域名激活被屏蔽了&#xff0…...

Autosar通信实战系列05-CanNM模块进阶常见问题思考

本文框架 前言1. UDS 0x28服务控制Nm报文收发后对状态机有影响?2. 节点网络启动后第一帧是否必须是网络管理报文?3. 主动唤醒后发送的第一帧报文为NM报文如何配置?4. CanNmMsgCycleOffset的使用场景?5. 什么情况下CBV中RepeatMessageRequest Bit置位?6. 主动(本地)唤醒与…...

Java中多态的一些简单理解

什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应。即同一消息可以根据发…...

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…...

案例025:基于微信小程序的移动学习平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

写实3D游戏模型纹理贴图设置

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xff1a; …...

如何基于Akamai IoT边缘平台打造一个无服务器的位置分享应用

与地理位置有关的应用相信大家都很熟悉了&#xff0c;无论是IM软件里的位置共享或是电商、外卖应用中的配送地址匹配&#xff0c;我们几乎每天都在使用类似的功能与服务。不过你有没有想过&#xff0c;如何在自己开发的应用中嵌入类似的功能&#xff1f; 本文Akamai将为大家提…...

【开源】基于JAVA的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…...

KaiOS 运营商相关文件operator_variant_manager.js代码功能和调试

gaia/apps/system/js/operator_variant_manager.js at master mozilla-b2g/gaia GitHub js文件接口功能 No 接口/常量 功能 1 OperatorVariantManager var OperatorVariantManager function(core) 2 OperatorVariantManager.IMPORTS OperatorVariantManager.I…...

【数据结构(六)】排序算法介绍和算法的复杂度计算(1)

文章目录 1. 排序算法的介绍1.1. 排序的分类 2. 算法的时间复杂度2.1. 度量一个程序(算法)执行时间的两种方法2.2. 时间频度2.2.1. 忽略常数项2.2.2. 忽略低次项2.2.2. 忽略系数 2.3. 时间复杂度2.4. 常见的时间复杂度2.5. 平均时间复杂度和最坏时间复杂度 3. 算法的空间复杂度…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...