搭建一個 AI 網路電視臺
AI 網路電視臺是一個實驗性演示,旨在展示自動影片和音樂合成的最新進展。
👉 立即訪問 AI 網路電視臺 Space 觀看直播。
如果您使用移動裝置,可以透過 Twitch 映象觀看直播。
概念
AI 網路電視臺的目的是以一種有趣且易於訪問的方式,演示使用 Zeroscope 和 MusicGen 等開源文字轉影片模型生成的影片。
您可以在 Hugging Face 中心找到這些開源模型
- 影片模型:zeroscope_v2_576 和 zeroscope_v2_XL
- 音樂模型:musicgen-melody
單個影片序列特意製作得很短,這意味著網路電視臺應被視為技術演示/展示片,而非實際節目(帶有藝術指導或程式設計)。
架構
AI 網路電視臺透過獲取一系列影片鏡頭提示,並將其傳遞給文字轉影片模型以生成一系列片段。
此外,一個基礎主題和想法(由人類撰寫)透過大型語言模型(此處為 ChatGPT)生成每個影片剪輯的各種獨立提示。
以下是 AI 網路電視臺當前架構的圖示
實現管道
網路電視臺使用 NodeJS 和 TypeScript 實現,並使用 Hugging Face 上託管的各種服務。
文字轉影片模型
核心影片模型是 Zeroscope V2,一個基於 ModelScope 的模型。
Zeroscope 由兩部分組成,可以連結在一起
- 第一步使用 zeroscope_v2_576 生成 576x320 的影片剪輯
- 可選的第二步使用 zeroscope_v2_XL 將影片升級到 1024x576
👉 生成和升級都需要使用相同的提示詞。
呼叫影片鏈
為了快速製作原型,網路電視臺透過兩個執行 Gradio 的重複 Hugging Face Spaces 執行 Zeroscope,這些 Spaces 使用 @gradio/client NPM 包呼叫。您可以在這裡找到原始的 Spaces
- zeroscope-v2 作者:@hysts
- Zeroscope XL 作者:@fffiloni
如果您在 Hub 上搜尋 Zeroscope,還可以找到社群部署的其他 Spaces。
👉 公開 Spaces 隨時可能因訪問量過大而暫停。如果您打算部署自己的系統,請複製這些 Spaces 並在您自己的賬戶下執行。
使用託管在 Space 上的模型
使用 Gradio 的 Spaces 具有公開 REST API 的能力,然後可以使用 @gradio/client 模組從 Node 呼叫該 API。
這裡是一個例子
import { client } from "@gradio/client"
export const generateVideo = async (prompt: string) => {
const api = await client("*** URL OF THE SPACE ***")
// call the "run()" function with an array of parameters
const { data } = await api.predict("/run", [
prompt,
42, // seed
24, // nbFrames
35 // nbSteps
])
const { orig_name } = data[0][0]
const remoteUrl = `${instance}/file=${orig_name}`
// the file can then be downloaded and stored locally
}
後期處理
一旦單個鏡頭(影片剪輯)被升級,它就會被傳遞給 FILM(用於大運動的幀插值),一種幀插值演算法
- 原始連結:網站、原始碼
- Hugging Face 上的模型:/frame-interpolation-film-style
- 您可以複製的 Hugging Face Space:@fffiloni 的 video_frame_interpolation
在後期處理過程中,我們還添加了用 MusicGen 生成的音樂
廣播流
注意:您可以使用多種工具來建立影片流。AI 網路電視臺目前使用 FFmpeg 讀取由 mp4 影片檔案和 m4a 音訊檔案組成的播放列表。
以下是建立此類播放列表的示例
import { promises as fs } from "fs"
import path from "path"
const allFiles = await fs.readdir("** PATH TO VIDEO FOLDER **")
const allVideos = allFiles
.map(file => path.join(dir, file))
.filter(filePath => filePath.endsWith('.mp4'))
let playlist = 'ffconcat version 1.0\n'
allFilePaths.forEach(filePath => {
playlist += `file '${filePath}'\n`
})
await fs.promises.writeFile("playlist.txt", playlist)
這將生成以下播放列表內容
ffconcat version 1.0
file 'video1.mp4'
file 'video2.mp4'
...
FFmpeg 然後再次用於讀取此播放列表,並將 FLV 流傳送到 RTMP 伺服器。FLV 是一種舊格式,但由於其低延遲而在即時流媒體領域仍然很受歡迎。
ffmpeg -y -nostdin \
-re \
-f concat \
-safe 0 -i channel_random.txt -stream_loop -1 \
-loglevel error \
-c:v libx264 -preset veryfast -tune zerolatency \
-shortest \
-f flv rtmp://<SERVER>
FFmpeg 有許多不同的配置選項,更多資訊請參閱官方文件。
對於 RTMP 伺服器,您可以在 GitHub 上找到開源實現,例如 NGINX-RTMP 模組。
AI 網路電視臺本身使用 node-media-server。
💡 您也可以直接流式傳輸到 Twitch RTMP 入口點之一。有關更多詳細資訊,請檢視 Twitch 文件。
觀察與示例
以下是一些生成內容的示例。
我們首先注意到,應用 Zeroscope XL 的第二遍處理會顯著提高影像質量。幀插值的影響也清晰可見。
角色與場景構成
動態場景模擬
文字轉影片模型真正引人入勝的一點是它們能夠模仿它們所訓練的真實世界現象。
我們已經看到大型語言模型能夠合成模仿人類反應的令人信服的內容,但這在應用於影片時將事物帶到了一個全新的維度。
影片模型預測場景的下一幀,其中可能包含流體、人物、動物或車輛等運動物體。目前,這種模擬並不完美,但評估未來的模型(針對更大或專業資料集,例如動物運動進行訓練)在重現物理現象的準確性以及模擬代理行為的能力方面將很有趣。
💡 未來探索這些能力將很有趣,例如透過在覆蓋更多現象的更大影片資料集上訓練影片模型。
樣式和效果
失敗案例
方向錯誤:模型有時在處理運動和方向時會遇到問題。例如,這裡的影片片段似乎是倒放的。此外,修飾符關鍵詞綠色也沒有被考慮進去。
真實場景的渲染錯誤:有時我們會看到諸如移動的垂直線或波浪之類的偽影。目前尚不清楚其原因,但這可能與使用的關鍵詞組合有關。
影像中插入的文字或物體:模型有時會將提示中的詞語注入場景中,例如“IMAX”。在提示中提及“Canon EOS”或“Drone footage”也可能導致這些物體出現在影片中。
在下面的例子中,我們注意到“llama”(羊駝)這個詞不僅插入了一隻羊駝,還插入了兩次火焰中的“llama”字樣。
建議
以下是根據之前的觀察可以給出的一些早期建議
使用影片專用提示關鍵詞
您可能已經知道,如果您不提示 Stable Diffusion 影像的特定方面,衣服顏色或一天中的時間等內容可能會變得隨機,或者被賦予一個通用值,例如中性午間光線。
影片模型也是如此:您需要對事物具體化。例子包括攝像機和角色的運動、它們的朝向、速度和方向。您可以為了創意目的(想法生成)而將其保持未指定,但這可能不會總是給出您想要的結果(例如,實體反向動畫)。
保持場景之間的一致性
如果您計劃建立多個影片序列,您會希望在每個提示中新增儘可能多的細節,否則您可能會從一個序列到另一個序列丟失重要細節,例如顏色。
💡 這也將提高影像質量,因為提示用於 Zeroscope XL 的升級部分。
利用幀插值
幀插值是一個強大的工具,可以修復小的渲染錯誤,並將許多缺陷轉化為特色,尤其是在動畫較多的場景中,或者卡通效果可以接受的情況下。FILM 演算法將透過影片剪輯中之前和之後的事件來平滑幀中的元素。
當攝像機平移或旋轉時,這對於置換背景非常有效,並且還可以為您提供創作自由,例如控制生成後的幀數,以製作慢動作效果。
未來工作
我們希望您喜歡觀看 AI 網路電視臺的直播,並希望它能激發您在該領域創造更多內容。
由於這是首次嘗試,許多事情並非本次技術演示的重點:生成更長、更多樣化的序列,新增音訊(音效、對話),生成和編排複雜場景,或者讓語言模型代理對管道擁有更多控制權。
其中一些想法可能會在 AI 網路電視臺的未來更新中實現,但我們也迫不及待地想看到研究人員、工程師和開發者社群會創造出什麼!