当前位置: 首页 > 科技观察

当GAN生成的图像可以遮挡音效时,这个Python包只需要几行代码

时间:2023-03-17 15:19:14 科技观察

GAN就可以生成奇幻怪异的图像,我们对此并不陌生。如果它们也可以干扰音效呢?最近,有人创建了一个实现类似效果的Python包LucidSonicDreams,只需几行代码即可将AI生成的绘画与音乐同步。GitHub地址:https://github.com/mikaelalafriz/lucid-sonic-dreamsColab教程地址:https://colab.research.google.com/drive/1Y5i50xSFIuN3V4Md8TB30_GOAtts7RQD?usp=sharing项目提供的demo视频中,随着Saje的歌曲《Raspberry》,GAN生成的图像也在不断变化,呈现出相应的节奏。工作原理生成艺术作品通常由GAN网络完成。LucidSonicDreams包默认使用StyleGAN2-ADA架构,但也可以自定义GAN架构。这些模型是在特定“风格”的图像数据集上训练的,因此它们可以输出无限多与训练图像的风格一致的图像。另外,LucidSonicDreams使用JustinPinkney创建库中的StyleGAN2预训练模型(地址:https://github.com/justinpinkney/awesome-pretrained-stylegan2)。那么这些图像究竟是如何生成的呢?将输入馈送到StyleGAN2模型(输入是512个数字的向量),输入决定了模型的输出图像,因此输入向量的微小变化也会导致输出图像的微小变化。现在有趣的部分来了:如果我们从音乐中提取一个声波,从声波中提取一个值(如振幅)并将其添加到输入向量中,会发生什么?LucidSonicDreams对视频的每一帧执行这些操作,生成随音乐脉动和变换的图像。具体来说,在LucidSonicDreams包中,音乐控制着3个主要的视觉组件:Pulse、Motion和Class:Pulse意味着视觉“跳”到音乐的节奏。在数学上,“脉冲”是将声波的振幅暂时添加到输入向量的结果(即该向量在下一帧仍然是原始向量);运动是指视觉画面变化的速度。从数学上讲,它是对输入向量累加振幅(即以后不会清零相加的振幅);category是指生成图像中物体的标签,例如基于WikiArt图像训练的风格中就有167个类别(包括梵高、达芬奇、抽象等)。而这些是由音高控制的,具体来说,12个音高对应12个不同的类别。这些音调的幅度会影响传递给第二个输入向量(类别向量)的数字,这由模型生成的对象决定。项目作者说,这个想法的灵感来自马特·西格曼(MattSiegelman)的DeepMusicVisualizer项目。网上有一些类似的项目,但LucidSonicDreams的独特之处在于它是作为Python包实现的,并且允许定制。使用LucidSonicDreamsPack,您可以极其轻松和灵活地完成这些LucidSonicDreams。用户可以使用pip安装:然后只需要输入几行Python代码:fromlucidsonicdreamsimportLucidSonicDreamL=LucidSonicDream(song='chemical_love.mp3',style='abstractphotos')L.hallucinate(file_name='chemical_love.mp4')改变样式我们可以通过运行查看默认可用的样式:fromlucidsonicdreamsimportshow_stylesshow_styles()这将为您提供一组来自JustinPinkney创建的库的样式名称。您还可以输入自己的StyleGAN权重,或使用其他GAN架构。调整参数LucidSonicDreams包的默认设置运行良好,但它实际上有很多参数-30+,但这些是可调的(有关参数详细信息,请参阅Colab教程)。哪些参数最重要?让我们看看整个视频生成流水线:首先,输入向量被初始化并插值为视频的“基本运动”。参数speed_fpm控制运动的速度,fpm的意思是“framesperminute”,即每分钟初始化的vector数量。对于每个后续帧,参数pulse_react、motion_react和class_react控制音频操纵每个相应组件的程度。在模型基于这些向量生成图像后,图像会经过一系列特效(也会对音乐做出反应)。默认情况下,LucidSonicDreams包具有“对比”和“闪光”效果,可以与音频的打击节奏同步。可以通过设置contrast_strength和flash_strength参数进行调整。用户还可以创建自定义效果。下面的代码展示了调整过程:L=LucidSonicDream('pancake_feet.mp3',style='modernart')L.hallucinate(file_name='pancake_feet.mp4',speed_fpm=0,motion_react=0.8,contrast_strength=0.5,flash_strength=0.7)使用自己的StyleGAN权重如果自己训练过StyleGAN,或者在网上获取了一些模型权重,可以选择将这些权重的文件路径作为style参数的取值。例如,本文开头的视频使用了JeremyTorman训练的模型。用于生成视频的代码如下:L=LucidSonicDream(song='raspberry.mp3',style='VisionaryArt.pkl')L.hallucinate(file_name='raspberry.mp4',pulse_react=1.2,motion_react=0.7,contrast_strength=0.5,flash_strength=0.5)使用单独的音轨这个包也可以用作音乐可视化工具,用户可以上传单独的音轨,然后控制Pulse、Motion、Class、Contrast和Flash。如果你想将这些视觉组件与特定的仪器同步,使用这个包是一个不错的选择。您还可以使用这些单独的轨道来自定义效果。下面是示例代码: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,contrast_strength=0.3)自定义效果除了内置的“对比度”和“闪光”效果外,LucidSonicDreams软件包还允许用户创建自定义效果。用户只需创建一个至少包含3个参数的函数:数组,表示要应用效果的图像;强度,决定了对音乐的反应强度;和振幅,表示任何给定时间点的音量。然后,将该自定义函数传递给EffectsGenerator对象。作者实验了如下代码,其中使用了scikit-image的漩涡效果:importnumpyasnpfromskimage.transformimportswirlfromlucidsonicdreamsimportEffectsGeneratordefswirl_func(array,strength,amplitude):swirlled_image=swirl(array,rotation=0,strength=100*strength*amplitude,650)return(swirlled_image*255).astype(np.uint8)swirl_effect=EffectsGenerator(swirl_func,audio='unfaith.mp3',strength=0.2,percussive=False)L=LucidSonicDream('unfaith.mp3',style='textures')L.hallucinate('unfaith.mp4',motion_react=0.15,speed_fpm=2,pulse_react=1.5,contrast_strength=1,flash_strength=1,custom_effects=[swirl_effect])files.download("unfaith.mp4")使用其他GAN架构您还可以使用其他GAN架构。只需定义一个函数,将一组噪声向量和类向量(NumPy数组)作为输入并输出一组Pillow图像。事实上,该函数甚至不需要使用GAN,它可以是任何将输入向量转换为图像的函数。以下代码使用BigGAN的PyTorch实现再现深度音乐可视化工具:frompytorch_pretrained_bigganimportBigGAN,convert_to_imagesimporttorchbiggan=BigGAN.from_pretrained('biggan-deep-512')biggan.to('cuda:0')defbiggan_func(noise_batch)=noise_batch.from_numpy(noise_batch).cuda()class_tensor=torch.from_numpy(class_batch).cuda()withtorch.no_grad():output_tensor=biggan(noise_tensor.float(),class_tensor.float(),truncation=1)返回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,=[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)【小编推荐:如何促进有效沟通?查看AppGalleryConnect!在大数据存储的未来,节能技术的发展成为刚需。一篇文章带你了解Python递归函数。Python是如何处理垃圾的?的?7个适合初学者的Python工具,真的不错