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

news2024/11/17 12:34:11

 推荐阅读列表:

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

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

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

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

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

扩散模型实战(六):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生成的内容有什么相同之处?

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

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

相关文章

微软发布Orca2,“调教式”教会小规模大语言模型如何推理!

我们都知道在大多数情况下&#xff0c;语言模型的体量和其推理能力之间存在着正相关的关系&#xff1a;模型越大&#xff0c;其处理复杂任务的能力往往越强。 然而&#xff0c;这并不意味着小型模型就永远无法展现出色的推理性能。最近&#xff0c;奶茶发现了微软的Orca2公开了…

【工作生活】汽车电子嵌入式开发简介

目录 1. 目标 2. 要分享什么 3.1 行业知识 3.1.1车载行业知识&#xff1a; 3.1.2项目&#xff1a; 3.1.3开发测试工具&#xff1a; 3.2 硬件平台 3.3 基础知识 3.4 工作生活 3. 我们是谁 1. 目标 随着新能源汽车的快速崛起&#xff0c;汽车电子行业开始快速发展&…

记一次xss通杀挖掘历程

前言 前端时间&#xff0c;要开放一个端口&#xff0c;让我进行一次安全检测&#xff0c;发现的一个漏洞。 经过 访问之后发现是类似一个目录索引的端口。(这里上厚码了哈) 错误案例测试 乱输内容asdasffda之后看了一眼Burp的抓包&#xff0c;抓到的内容是可以发现这是一个…

GRE与顺丰圆通快递盒子

1. DNS污染 随想&#xff1a; 在输入一串网址后&#xff0c;会发生如下变化如果你在系统中配置了 Hosts 文件&#xff0c;那么电脑会先查询 Hosts 文件如果 Hosts 里面没有这个别名&#xff0c;就通过域名服务器查询域名服务器回应了&#xff0c;那么你的电脑就可以根据域名服…

15.Eclipse常用基本配置设置

在使用Eclipse进行Java开发之前&#xff0c;经常需要进行一些配置&#xff0c;其中有些配置甚至是必须的&#xff0c;即使开始不编辑之后开发过程中也会出一些因配置导致的小问题。本文梳理了一下Eclipse使用中常用的配置 1 编码配置 1.1 设置工作空间编码格式 打开Eclipse&…

第 7 部分 — 增强 LLM 安全性的策略:数学和伦理框架

一、说明 增强大型语言模型 (LLM) 安全性的追求是技术创新、道德考虑和实际应用的复杂相互作用。这项努力需要一种深入而富有洞察力的方法&#xff0c;将先进的数学模型与道德原则和谐地融合在一起&#xff0c;以确保LLM的发展不仅在技术上稳健&#xff0c;而且在道德上合理且对…

来自Sui的温馨建议:保护您的Web3私钥

当您安装一个钱包并创建Sui账户时&#xff0c;钱包包含一个公钥和一个私钥。保护好私钥的安全非常重要&#xff0c;从而可以保护您的Sui资产&#xff0c;包括钱包中的任何tokens。 公钥加密技术是几十年前开发的&#xff0c;是当今互联网上大多数安全交易的基础&#xff0c;包…

Python----多态

1、什么是多态 多态指的是一类事物有多种形态。 定义&#xff1a;多态是一种使用对象的方式&#xff0c;子类重写父类方法&#xff0c;调用不同子类对象的相同父类方法&#xff0c;可以产生不同的执行结果。 ① 多态依赖继承 ② 子类方法必须要重写父类方法 首先定义一个父类…

配电室无人值守改造

配电室无人值守改造是通过运用先进的技术和设备&#xff0c;将传统的需要人工值守的配电室改造成可以远程监控和管理的智能化配电室&#xff0c;从而实现无人值守。这种改造可以提高配电室的安全性、可靠性和效率&#xff0c;降低运维成本。 建立智能监控系统&#xff1a;通过安…

十二、MapReduce概述

1、MapReduce &#xff08;1&#xff09;采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架&#xff0c;可供开发人员进行相应计算 &#xff08;2&#xff09;编程接口&#xff1a; ~Map ~Reduce 其中&#xff0c;Map功能接口提供了“分散”的功能&#xff…

spring boot 3.2 整合 keycloak

背景 项目中用到 keycloak&#xff0c;因此其他所有管理页面要集成 keycloak 做统一登录认证。 Keycloak 侧配置 容器方式启动 keycloak 服务端 docker run -d --name mykeycloak -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin ke…

Python ItsDangerous库:构建安全可靠的数据传输

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com ItsDangerous是Python中一个轻量级的库&#xff0c;旨在提供安全且简单的数据传输和签名功能。本文将深入介绍ItsDangerous的核心特性、基本用法以及在实际应用中的一些示例&#xff0c;通过丰富的示例代码&…

【思路代码详解】2023mathorcup大数据复赛B题妈妈杯高校数学建模挑战赛电商零售商家需求预测及库存优化问题

2023 年 MathorCup 高校数学建模挑战赛——大数据竞赛 赛道 B复赛&#xff1a;电商零售商家需求预测及库存优化问题 问题一 目标&#xff1a;制定补货计划&#xff0c;基于预测销量。 背景&#xff1a;固定库存盘点周期NRT1, 提前期LT3天。 初始条件&#xff1a;所有商品…

Qt12.8

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

线程池的使用及实现

使用多进程进行并发编程&#xff0c;会频繁的创建销毁进程&#xff0c;效率比较慢&#xff0c;所以引入了线程&#xff0c;线程使用复用资源的方式提高了创建销毁的效率&#xff0c;但是随着创建线程的频率进一步提高&#xff0c;开销仍然无法忽略不计了。 要想办法优化此处线…

防火墙是什么?聊聊部署Web应用防火墙的作用

数字经济时代&#xff0c;也是一个应用爆炸的时代。在享受应用带来的便利同时&#xff0c;当前却出现许多热点威胁&#xff0c;如供应链安全、零日漏洞、数据泄露等&#xff0c;都给现代化应用带来严峻挑战。有了WAF防火墙的帮助&#xff0c;就可以拦截一系列企图通过入侵系统来…

区块链如何影响数字营销的各个方面?

在过去的几年里&#xff0c;由于区块链等新技术和趋势的进步&#xff0c;数字营销领域发生了各种变化和发展。区块链是加密货币爱好者和投资者当前的流行语。然而&#xff0c;它的可能性已经超出了加密货币的世界&#xff0c;今天&#xff0c;来自不同行业的组织正在获得他们的…

目标检测器技术演进简史

引言 目标检测算法的发展已经取得了长足的进步&#xff0c;从早期的计算机视觉方法开始&#xff0c;通过深度学习达到了很高的准确度。在这篇博文中&#xff0c;我们将一起回顾一下这些算法的发展阶段以及现代目标检测系统中使用的主要方法。 我们首先回顾早期传统的目标检测…

服务器端模板注入 (SSTI) 漏洞实战与技巧,网络高级工具透明代理的几种实现方式

服务器端模板注入 (SSTI) 漏洞实战与技巧,网络高级工具透明代理的几种实现方式。 SSTI(Server-Side Template Injection)从名字可以看出即是服务器端模板注入。比如python的flask、php的thinkphp、java的spring等框架一般都采用MVC的模式,用户的输入先进入Controller控制器,…

内网渗透基础

内网 内网指的是内部局域网&#xff0c;常说的LAN&#xff08;local area network&#xff09;。常见家庭wifi网络和小型的企业网络&#xff0c;通常内部计算机直接访问路由器设备&#xff0c;路由器设备接入移动电信的光纤实现上网。 内部局域网可以通过交换机/防火墙组成多个…