當(dāng)GAN生成圖像可以卡音效,這個(gè)Python包只需幾行代碼
GAN 生成圖像奇幻詭譎,對(duì)此我們?cè)缫巡荒吧?。如果它們還可以卡音效呢?最近,有人就創(chuàng)建了一個(gè)實(shí)現(xiàn)類似效果的 Python 包——Lucid Sonic Dreams,只用幾行代碼就可以實(shí)現(xiàn) AI 生成畫作與音樂(lè)的同步。
- GitHub 地址:https://github.com/mikaelalafriz/lucid-sonic-dreams
- Colab 教程地址:https://colab.research.google.com/drive/1Y5i50xSFIuN3V4Md8TB30_GOAtts7RQD?usp=sharing
在該項(xiàng)目提供的 demo 視頻中,伴隨著 Saje 的歌「Raspberry」,GAN 生成的圖像不斷變換且呈現(xiàn)出了對(duì)應(yīng)的節(jié)奏。
工作原理
生成藝術(shù)品通常是由 GAN 網(wǎng)絡(luò)來(lái)完成的。Lucid Sonic Dreams 包默認(rèn)使用 StyleGAN2-ADA 架構(gòu),不過(guò) GAN 架構(gòu)也可以自定義。將這些模型在特定「風(fēng)格」的圖像數(shù)據(jù)集上進(jìn)行訓(xùn)練,使之能夠輸出與訓(xùn)練圖像風(fēng)格一致的無(wú)窮多張圖像。此外,Lucid Sonic Dreams 使用 Justin Pinkney 創(chuàng)建庫(kù)中的 StyleGAN2 預(yù)訓(xùn)練模型(地址:
https://github.com/justinpinkney/awesome-pretrained-stylegan2) 。
那么這些圖像到底是如何生成的呢?
將輸入饋送至 StyleGAN2 模型(輸入為有 512 個(gè)數(shù)字的向量),輸入決定了模型的輸出圖像,因此對(duì)輸入向量進(jìn)行微小更改也將帶來(lái)輸出圖像的微小變化。
現(xiàn)在,有趣的部分到了:如果我們從音樂(lè)中獲取聲波,從聲波中提取數(shù)值(如振幅)并添加至輸入向量,會(huì)發(fā)生什么?
Lucid Sonic Dreams 對(duì)視頻每一幀執(zhí)行這些操作,生成脈沖與變換與音樂(lè)一致的圖像。
具體而言,利用 Lucid Sonic Dreams 包,音樂(lè)控制了 3 個(gè)主要視覺(jué)組件:脈沖(Pulse)、運(yùn)動(dòng)(Motion)和類別(Class):
- 脈沖指視覺(jué)畫面隨著音樂(lè)的敲擊性節(jié)奏而「跳動(dòng)」。從數(shù)學(xué)角度來(lái)看,「脈沖」是向輸入向量暫時(shí)添加聲波振幅的結(jié)果(即在下一幀中該向量仍是初始向量);
- 運(yùn)動(dòng)指視覺(jué)畫面變換的速度。從數(shù)學(xué)上看,它是向輸入向量累積添加振幅(即添加的振幅后續(xù)不會(huì)被清零);
- 類別指生成圖像中物體的標(biāo)簽,例如基于 WikiArt 圖像訓(xùn)練的風(fēng)格中就有 167 個(gè)類別(包括梵高、達(dá)芬奇、抽象派等)。而這些由音調(diào)進(jìn)行控制,具體而言,12 個(gè)音高分別對(duì)應(yīng) 12 個(gè)不同類別。這些音高的振幅對(duì)傳輸至第二個(gè)輸入向量(類別向量)的數(shù)字造成影響,而這由模型生成的對(duì)象來(lái)決定。
項(xiàng)目作者表示,這個(gè)想法受到 Matt Siegelman 的 Deep Music Visualizer 項(xiàng)目的啟發(fā)。目前網(wǎng)上也有一些類似的項(xiàng)目,但 Lucid Sonic Dreams 的獨(dú)特之處在于以 Python 包形式實(shí)現(xiàn),且允許自定義。
使用 Lucid Sonic Dreams 包,你可以做到這些
Lucid Sonic Dreams 具備極強(qiáng)的易用性和靈活性。用戶可以使用 pip 進(jìn)行安裝:
然后只需輸入幾行 Python 代碼即可:
- from lucidsonicdreams import LucidSonicDream
- L = LucidSonicDream(song = 'chemical_love.mp3', style = 'abstract photos')
- L.hallucinate(file_name = 'chemical_love.mp4')
改變風(fēng)格
運(yùn)行以下代碼,我們可以查看默認(rèn)可用的風(fēng)格:
- from lucidsonicdreams import show_styles
- show_styles()
這樣就可以得到一組風(fēng)格名稱,這些風(fēng)格來(lái)自 Justin Pinkney 創(chuàng)建的庫(kù)。你還可以輸入自己的 StyleGAN 權(quán)重,或者使用其他 GAN 架構(gòu)。
調(diào)整參數(shù)
Lucid Sonic Dreams 包的默認(rèn)設(shè)置很好用,但它實(shí)際上有很多參數(shù)——30 多個(gè),不過(guò)這些參數(shù)是可以調(diào)整的(參數(shù)詳細(xì)信息參見(jiàn) Colab 教程)。
哪些參數(shù)最重要呢?我們來(lái)看整個(gè)視頻生成 pipeline:
首先,對(duì)輸入向量進(jìn)行初始化和插值,作為視頻的「基礎(chǔ)運(yùn)動(dòng)」(base motion)。參數(shù) speed_fpm 控制運(yùn)動(dòng)的速度,fpm 表示「每分鐘幀數(shù)」,即每分鐘初始化的向量數(shù)。對(duì)于每個(gè)后續(xù)幀而言,參數(shù) pulse_react, motion_react, and class_react 控制音頻操縱每個(gè)對(duì)應(yīng)組件的程度。
模型基于這些向量生成圖像后,圖像被傳輸經(jīng)過(guò)一系列特效(也對(duì)音樂(lè)產(chǎn)生反應(yīng))。默認(rèn)情況下,Lucid Sonic Dreams 包具備「contrast」和「flash」特效,可以與音頻的敲擊性節(jié)奏同步。通過(guò)設(shè)置 contrast_strength 和 flash_strength 參數(shù),即可進(jìn)行調(diào)整。使用者還可以創(chuàng)建自定義特效。
以下代碼展示了調(diào)參過(guò)程:
- L = LucidSonicDream('pancake_feet.mp3', style = 'modern art')
- L.hallucinate(file_name = 'pancake_feet.mp4',
- speed_fpm = 0,
- motion_react = 0.8,
- contrast_strength = 0.5,
- flash_strength = 0.7)
使用自己的 StyleGAN 權(quán)重
如果你自己訓(xùn)練過(guò) StyleGAN,或者在網(wǎng)上獲得了一些模型權(quán)重,你可以選擇將文件路徑傳輸至這些權(quán)重,作為風(fēng)格參數(shù)的值。
例如,文章開(kāi)頭的視頻使用的是 Jeremy Torman 訓(xùn)練的模型。生成視頻所用代碼如下所示:
- 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)
使用單獨(dú)的音軌
這個(gè)包還可以用作音樂(lè)可視化工具,使用者可以上傳單獨(dú)的音軌,進(jìn)而控制 Pulse、Motion、Class、Contrast 和 Flash。如果你想使這些視覺(jué)組件與特定的樂(lè)器同步,使用這個(gè)包是不錯(cuò)的選擇。你還可以利用這些單獨(dú)的音軌自定義特效。
以下是示例代碼:
- L = LucidSonicDream(song = 'lucidsonicdreams_main.mp3',
- pulse_audio = 'lucidsonicdreams_pulse.mp3',
- class_audio = 'lucidsonicdreams_class.mp3',
- style = 'wikiart')
- L.hallucinate('lucidsonicdreams.mp4',
- 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)
自定義特效
除了內(nèi)置的「Contrast」和「Flash」特效外,Lucid Sonic Dreams 包還允許用戶自定義創(chuàng)建特效。用戶只需創(chuàng)建一個(gè)包含至少以下 3 個(gè)參數(shù)的函數(shù)即可:array,表示應(yīng)用特效的圖像;strength,決定對(duì)音樂(lè)的反應(yīng)強(qiáng)度;amplitude 表示在任意給定時(shí)間點(diǎn)的音量。之后,將該自定義函數(shù)傳輸至 EffectsGenerator 對(duì)象。
作者用以下代碼進(jìn)行了試驗(yàn),其使用的是 scikit-image 的 swirl 特效:
- import numpy as np
- from skimage.transform import swirl
- from lucidsonicdreams import EffectsGenerator
- def swirl_func(array, strength, amplitude):
- swirled_image = swirl(array,
- rotation = 0,
- strength = 100 * strength * amplitude,
- radius=650)
- return (swirled_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 架構(gòu)
你還可以使用其他 GAN 架構(gòu)。只需定義一個(gè)函數(shù),該函數(shù)以一組噪聲向量和類別向量(NumPy 數(shù)組)作為輸入,輸出一組 Pillow 圖像。事實(shí)上,該函數(shù)甚至不需要使用 GAN,它可以是能夠?qū)⑤斎胂蛄哭D(zhuǎn)換成圖像的任意函數(shù)。
下列代碼使用 BigGAN 的 PyTorch 實(shí)現(xiàn)復(fù)現(xiàn)了 Deep Music Visualizer:
- 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)
【編輯推薦】