机器心脏报告
编辑:恶魔
Lucid Sonic Dreams包可以实现GAN生成图像的“音画同步”效果,并支持定制。
我们熟悉甘创造的奇异的图像。如果它们也能有音效呢?最近有人创造了一个Python包——Lucid Sonic Dreams,只用几行代码就可以实现AI生成的绘画和音乐的同步。
在本项目提供的演示视频中,伴随着Saje的歌曲《覆盆子》,GAN生成的图像不断变化,并呈现出相应的节奏。
工作原理
生成艺术品通常由GAN网络完成。Lucid Sonic Dreams包默认使用StyleGAN2-ADA架构,但GAN架构也可以定制。这些模型在特定“风格”的图像数据集上被训练,使得它们可以输出与训练图像风格一致的无限数量的图像。此外,《清醒的声波梦》使用贾斯汀·平克尼在库中创建了StyleGAN2预训练模型(地址:https://github.com/Justin·平克尼/awesome-pre-trained-stylegan2)。
那么这些图像是如何产生的呢?
输入被馈入StyleGAN2模型(输入是一个512位的向量),输入决定了模型的输出图像,所以输入向量的微小变化也会给输出图像带来微小变化。
现在,有趣的部分来了:如果我们从音乐中获得声波,从声波中提取数值(比如振幅)并将其添加到输入向量中,会发生什么?
Lucisonic dreams在视频的每一帧上执行这些操作,生成与《pulse》和《transformation》中的音乐一致的图像。
具体来说,使用清醒的声波梦包,音乐控制三个主要的视觉组件:脉冲,运动和类:
该项目作者表示,这个想法是受马特·西格尔曼(Matt Siegelman)的深度音乐可视化项目的启发。目前网上也有一些类似的项目,但是Lucid Sonic Dreams的独特之处在于它是用Python包实现的,并且允许定制。
你可以用清醒声波梦套装来做到这一点
清醒的声波梦是非常容易使用和灵活的。用户可以使用pip来安装:
然后只需输入几行Python代码:
从lucidsonicdreams导入LucidSonicDream L = LucidSonicDream(song = & # 39;chemical _ love.mp3 & # 39,style = & # 39抽象照片& # 39;) L .幻觉(file _ name = & # 39chemical _ love.mp4 & # 39)改变风格
运行下面的代码,我们可以检查默认可用的样式:
从Lucid SonicStreams导入show _ styles show _ styles(),这样您就可以获得一组样式名称,这些名称来自Justin Pinkney创建的库。也可以输入自己的风格GAN权重,或者使用其他GAN架构。
调整参数
Lucid Sonic Dreams包的默认设置非常有用,但它实际上有很多参数——超过30个,但这些参数是可以调整的(参数详见Colab教程)。
哪些参数最重要?让我们看看整个视频生成流程:
首先,对输入向量进行初始化和插值,作为视频的“基本运动”。参数speed_fpm控制运动的速度,fpm代表“每分钟帧数”,即每分钟初始化的矢量个数。对于每个后续帧,参数pulse _ react、motion _ react和class _ react控制音频操纵每个相应组件的程度。
在模型基于这些向量生成图像后,图像通过一系列特效(也对音乐做出反应)进行传输。Lucid Sonic Dreams包默认有“对比”和“闪光”的特效,可以和音频的打击乐节奏同步。可以通过设置contrast_strength和flash_strength参数进行调整。用户还可以创建自定义效果。
以下代码显示了参数调整过程:
l = LucidSonicDream(& # 39;pancake _ foots . MP3 & # 39;,style = & # 39现代艺术& # 39;) L .幻觉(file _ name = & # 39pancake _ foots . MP4 & # 39;, speed _ fpm = 0, motion _ react = 0.8, contrast _ strength = 0.5, flash _ strength = 0.7) 使用自己的风格GAN weight [/S2]
如果您自己已经训练了StyleGAN或者在线获得了一些模型权重,那么您可以选择将文件路径作为样式参数的值传递给这些权重。
比如文章开头的视频,用的就是杰里米·托曼训练出来的模型。用于生成视频的代码如下:
l = LucidSonicDream(song = & # 39;raspberry.mp3 & # 39,style = & # 39VisionaryArt.pkl & # 39) L .幻觉(file _ name = & # 39raspberry.mp4 & # 39, pulse _ react = 1.2, motion _ react = 0.7, contrast _ strength = 0.5, flash _ strength = 0.5) 使用单独的轨迹[/S2]
这个包也可以用作音乐可视化工具,用户可以上传个人音轨来控制脉冲,运动,类别,对比度和闪光。如果你想将这些可视化组件与特定的乐器同步,使用这个包是个不错的选择。您也可以使用这些单独的轨道自定义特殊效果。
以下是示例代码:
l = LucidSonicDream(song = & # 39;lucidsonicdreams _ main.mp3 & # 39, pulse _ audio = & # 39;lucidsonicdreams _ pulse . MP3 & # 39;, class _ audio = & # 39;lucidsonicdreams _ class . MP3 & # 39;, style = & # 39;维基百科& # 39;) L .产生幻觉(& # 39;lucidsonicdreams.mp4 & # 39, pulse_react = 0.25, motion_react = 0, classes = [1,5,9,16,23,27,28,30,50,68,71,89], dominant _ classes _ first = True, class _ shuffle _ seconds = 8, class _ smooth _ seconds = 4, class _ pitch _ react = 0.2,
除了内置的“对比”和“闪光”特效,Lucid Sonic Dreams包还允许用户定制和创建特效。用户只需要创建一个至少有以下三个参数的函数:array,代表应用特效的图像;力度,决定了对音乐反应的强度;振幅表示任何给定时间点的音量。然后,自定义函数被传输到EffectsGenerator对象。
作者试验了以下代码,这些代码使用了scikit-image的漩涡特效:
从skimage.transform导入numpy作为NP 从lucidsonicdreams导入漩涡 导入效果生成器 def swirl _ func(array,strength,amplitude): swidled _ image = swirl(array, rotation = 0, strength = 100 * strength * amplitude, radius=650) astype(NP . uint 8) swirl _ effect = effects generator(swirl _ func, audio = & # 39;unfaith.mp3 & # 39, 强度= 0.2, 敲击=假) L = LucidSonicDream(& # 39;unfaith.mp3 & # 39, style = & # 39;纹理& # 39;) L .产生幻觉(& # 39;不公平. & # 39、 motion_react = 0.15、 speed_fpm = 2、 pulse_react = 1.5、 contrast_strength = 1、 flash_strength = 1、 custom _ effects =[swirl _ effect]) files . download(& # 34;不公平. & # 34)使用其他GAN架构
也可以使用其他GAN架构。只需定义一个函数,它以一组噪声向量和类别向量(NumPy数组)作为输入,输出一组枕头图像。其实这个函数甚至不需要用GAN,可以是任何能把输入向量转换成图像的函数。
以下代码使用BigGAN的PyTorch实现再现了深度音乐可视化工具:
from pytorch_pretrained_biggan import BigGAN, convert_to_images import torch biggan = BigGAN.from_pretrained('biggan-deep-512') biggan.to('cuda:0') def biggan_func(noise_batch, class_batch): noise_tensor = torch.from_numpy(noise_batch).cuda() class_tensor = torch.from_numpy(class_batch).cuda() with torch.no_grad(): output_tensor = biggan(noise_tensor.float(), class_tensor.float(), truncation = 1) return convert_to_images(output_tensor.cpu()) L = LucidSonicDream('sea_of_voices_inst.mp3', style = biggan_func, input_shape = 128, num_possible_classes = 1000) L.hallucinate('sea_of_voices.mp4', output_audio = 'sea_of_voices.mp3', speed_fpm = 3, classes = [13, 14, 22, 24, 301, 84, 99, 100, 134, 143, 393, 394], class_shuffle_seconds = 10, class_shuffle_strength = 0.1, class_complexity = 0.5, class_smooth_seconds = 4, motion_react = 0.35, flash_strength = 1, contrast_strength = 1)