除了生成圖像,Stable Diffusion玩音樂也不在話下。
你聽說過 Stable Diffusion 吧?它是一個從文字生成圖像的開源人工智慧模型,可以生成「騎馬的宇航員」。
現在,Stable Diffusion 模型經過調試可以生成聲譜圖了,如下動圖中的放克低音與爵士薩克斯獨奏。
更神奇的是,這個聲譜圖可以轉換成音訊片段。
這就是今天要介紹的 Riffusion 模型,它是由 Seth Forsgren 和 Hayk Martiros 出於個人愛好而創建一個 app 項目,通過 Stable Diffusion 實現實時音樂生成。

項目地址:https://github.com/riffusion/riffusion-app
具體而言,1.5 版本的 Stable Diffusion 模型對與文字配對的聲譜圖進行了微調。音訊處理發生在模型的下游。
聲譜圖
音訊聲譜圖以可視的形式將聲音片段的頻率內容表現出來,其中 x 軸表示時間,y 軸表示頻率。每個像素的顏色顯示了音訊在給定頻率和時間上的振幅。

我們可以使用短時傅立葉變換(STFT)從音訊中計算聲譜圖,它將音訊近似為不同幅度和相位的正弦波組合。

STFT 是可逆的,因此可以從聲譜圖中重建原始音訊。然而,Riffusion 模型得到的聲譜圖只包含正弦波的振幅,而不包含相位,這是因為相位是混亂的,很難學習。相反在重建音訊片段時,我們使用 Griffin-Lim 演算法來近似相位。
聲譜圖中的頻率區間使用 Mel 尺度,這是一個音高知覺尺度,由聽眾判斷彼此之間的距離是否相等。
下圖是一個解釋為聲譜圖並轉換為音訊的手繪圖像。回放可以直觀地了解它們是如何運作的。請注意聽下半部分兩條曲線的音高,以及頂部四條垂直線如何發出類似於 hi-hat 音的節拍。

我們使用了 Torchaudio,好處在於它有優秀的模組可以在 GPU 上高效地進行音訊處理。
圖像到圖像
使用 diffusion 模型不僅可以將創作條件設置為文字 prompt,還可以設置為其他圖像。這對於修正聲音的同時保留你喜歡的原始片段的結構非常有用。使用者可以使用去噪強度參數控制與原始片段的偏離程度,並向新的 prompt 方向傾斜。
例如,下圖為放克薩克斯管的即興重複片段,然後修改一下,把鋼琴音量調高。

放克低音和爵士薩克斯獨奏。

放克鋼琴曲。
下例將搖滾獨奏改編為民謠小提琴。

搖滾電吉他獨奏

原聲民間小提琴獨奏。
循環和插值
生成短片段固然很有趣,但無限的 AI 生成片段才是我們真正想要的。
假設放入一個 prompt 並生成 100 個具有不同 seed 的片段。我們無法將結果片段連接起來,因為它們有不同的音調、節奏和強拍。
因此,我們的策略是選擇一個初始圖像,並通過使用不同的 seed 和 prompt 運行圖像到圖像的生成,並生成該初始圖像的變體。這將保留片段的關鍵屬性。為了使它們可循環,我們還創建了具有精確測量數值的初始圖像。

然而,即使使用這種方法,片段之間的過渡仍然很突兀。對於具有相同整體結構的同一 prompt 的多種解釋,仍然可以在它們的氛圍和旋律主題上呈現很大不同。
為了解決這個問題,我們在模型潛在空間中的 prompt 和 seed 之間平滑地進行插值。在 diffusion 模型中,潛在空間是一個特徵向量,它嵌入了模型可以生成的整個可能空間。彼此相似的項目在潛在空間中是接近的,並且潛在空間的每個數值都解碼為可行的輸出。
關鍵在於,我們可以對帶有兩種不同 seed 的 prompt 之間的潛在空間進行取樣,也可以對帶有相同 seed 的兩個不同 prompt 進行取樣。下面是一個視覺化模型示例:
我們的模型可以用來做同樣的事,它往往產生光滑的過渡,即使在完全不同的 prompt 之間。這比插入原始音訊有趣得多,因為在潛在空間中,所有中間點聽起來仍然像合理的片段。
下圖是彩色的,以顯示相同 prompt 的兩個 seed 之間的潛在空間插值。播放這個序列要比只播放兩個端點流暢得多。插入片段往往是多樣化的,有自己的即興重複片段和主題。

下面是我們最喜歡的一個,從敲擊到爵士樂的 20 步插值。
還有一個是從教堂鐘聲到電子節拍。
最後是阿拉伯福音的插值,這一次兩個 seed 之間有相同的 prompt。
互動式 Web 應用程序
互動式 web 應用程序可以將所有的這些整合在一起,也可以輸入 prompt 並無限實時生成插值內容,同時以 3D 方式視覺化聲譜圖時間軸。
當使用者輸入新的 prompt 時,音訊平滑地過渡到新的 prompt。如果沒有新的 prompt,應用程序將在同一 prompt 的不同種子之間插入。聲譜圖被視覺化為遵循半透明播放頭時間軸的 3D 高度圖。

該應用程序是使用 Next.js、React、Typescript、three.js、Tailwind 和 Vercel 構建的,通過 API 進行通訊,以在 GPU 伺服器上運行推理調用。我們使用 Truss 打包模型並在本地進行測試,然後部署到 Baseten,它提供了 GPU 推理、自動縮放和可觀察性。我們在生產中使用了 NVIDIA A10G。
如果你的 GPU 足夠強大,可以在五秒內生成 stable diffusion 結果。你可以使用我們的測試燒瓶伺服器在本地運行體驗。
更多詳細內容請參閱原文。