搭建一个 AI 网络电视台

发布于 2023 年 7 月 17 日
在 GitHub 上更新

AI 网络电视台是一个实验性演示,旨在展示自动视频和音乐合成的最新进展。

👉 立即访问 AI 网络电视台 Space 观看直播。

如果您使用移动设备,可以通过 Twitch 镜像观看直播。

thumbnail.gif

概念

AI 网络电视台的目的是以一种有趣且易于访问的方式,演示使用 Zeroscope 和 MusicGen 等开源文本转视频模型生成的视频。

您可以在 Hugging Face 中心找到这些开源模型

单个视频序列特意制作得很短,这意味着网络电视台应被视为技术演示/展示片,而非实际节目(带有艺术指导或编程)。

架构

AI 网络电视台通过获取一系列视频镜头提示,并将其传递给文本转视频模型以生成一系列片段

此外,一个基础主题和想法(由人类撰写)通过大型语言模型(此处为 ChatGPT)生成每个视频剪辑的各种独立提示。

以下是 AI 网络电视台当前架构的图示

diagram.jpg

实现管道

网络电视台使用 NodeJS 和 TypeScript 实现,并使用 Hugging Face 上托管的各种服务。

文本转视频模型

核心视频模型是 Zeroscope V2,一个基于 ModelScope 的模型。

Zeroscope 由两部分组成,可以链接在一起

👉   生成和升级都需要使用相同的提示词。

调用视频链

为了快速制作原型,网络电视台通过两个运行 Gradio 的重复 Hugging Face Spaces 运行 Zeroscope,这些 Spaces 使用 @gradio/client NPM 包调用。您可以在这里找到原始的 Spaces

如果您在 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(用于大运动的帧插值),一种帧插值算法

在后期处理过程中,我们还添加了用 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 的第二遍处理会显著提高图像质量。帧插值的影响也清晰可见。

角色与场景构成

提示词:逼真的电影,讲述了一只羊驼扮演程序员,戴着眼镜,穿着连帽衫,在舒适、昏暗的房间里专注地盯着屏幕上的代码行,佳能 EOS,环境光线,高细节,电影感,artstation 热门。
提示词:3D 渲染动画,展示一群食物角色形成金字塔,一只香蕉得意地站在顶端。在一个拥有棉花糖云朵巧克力路的城市,皮克斯风格,CGI,环境光线,直射阳光,丰富配色,超现实,电影感,逼真。
提示词:一只红狐近距离特写,锐利的眼睛凝视镜头,环境光线营造出高对比度剪影,IMAX 摄像机,高细节电影效果,黄金时段,胶片颗粒。

动态场景模拟

文本转视频模型真正引人入胜的一点是它们能够模仿它们所训练的真实世界现象。

我们已经看到大型语言模型能够合成模仿人类反应的令人信服的内容,但这在应用于视频时将事物带到了一个全新的维度。

视频模型预测场景的下一帧,其中可能包含流体、人物、动物或车辆等运动物体。目前,这种模拟并不完美,但评估未来的模型(针对更大或专业数据集,例如动物运动进行训练)在重现物理现象的准确性以及模拟代理行为的能力方面将很有趣。

提示词:电影镜头,蜜蜂在花朵周围充满活力地嗡嗡作响,阳光照亮场景,以 4k IMAX 拍摄,背景虚化柔和。
提示词:一头灰熊在湍急的河流中捕捞三文鱼的动态镜头,环境光线突出溅起的水花,低角度,IMAX 摄像机,4K 电影画质,黄金时段,胶片颗粒。
提示词:加利福尼亚海岸宁静早晨的航拍镜头,海浪轻柔地拍打着岩石海岸。惊艳的日出以鲜艳的色彩照亮海岸,用 DJI Phantom 4 Pro 精美捕捉。在柔和的晨光下,风景的色彩和纹理栩栩如生。胶片颗粒,电影感,IMAX,电影。

💡 未来探索这些能力将很有趣,例如通过在覆盖更多现象的更大视频数据集上训练视频模型。

样式和效果

提示词:3D 渲染视频,一个友好的西兰花角色戴着帽子,在糖果遍布的城市街道上,姜饼屋林立,在明亮的阳光和蓝天下行走,皮克斯风格,电影感,逼真,电影,环境光线,自然光线,CGI,广角视野,白天,超现实。
提示词:电影感影片,拍摄宇航员和羊驼在黎明时分,山地景观沐浴在柔和的低饱和度色彩中,清晨薄雾,毛发上闪烁的露珠,崎岖的山峰,复古 NASA 宇航服,佳能 EOS,皮肤高细节,史诗般的构图,高画质,4K,Artstation 热门,美丽。
提示词:熊猫和黑猫乘坐小船沿河流而下,吉卜力工作室风格 > 电影感,美丽构图 > IMAX 摄像机跟随小船平移 > 高画质,电影感,电影,雾效,胶片颗粒,Artstation 热门。

失败案例

方向错误:模型有时在处理运动和方向时会遇到问题。例如,这里的视频片段似乎是倒放的。此外,修饰符关键词绿色也没有被考虑进去。

提示词:电影,展现一个绿色南瓜落入钉床,慢动作爆炸,碎片四处飞溅,环境雾气烘托戏剧性灯光,IMAX 摄像机拍摄,8k 超高清,高质量,Artstation 热门。

真实场景的渲染错误:有时我们会看到诸如移动的垂直线或波浪之类的伪影。目前尚不清楚其原因,但这可能与使用的关键词组合有关。

提示词:电影镜头,大峡谷上空迷人的飞行,橙红色刻画的悬崖和高原。正午阳光下,深邃的阴影与炽热的景观形成对比,使用 DJI Phantom 4 Pro 拍摄。摄像机旋转以捕捉广阔的纹理和色彩,imax 质量。胶片颗粒,电影感,电影。

图像中插入的文本或物体:模型有时会将提示中的词语注入场景中,例如“IMAX”。在提示中提及“Canon EOS”或“Drone footage”也可能导致这些物体出现在视频中。

在下面的例子中,我们注意到“llama”(羊驼)这个词不仅插入了一只羊驼,还插入了两次火焰中的“llama”字样。

提示词:电影场景,一只羊驼扮演消防员,身穿消防服,在混乱的城市场景中,戏剧性地向熊熊火焰喷水,佳能 EOS,环境光线,高质量,获奖,高度细致的毛发,电影感,Artstation 热门。

建议

以下是根据之前的观察可以给出的一些早期建议

使用视频专用提示关键词

您可能已经知道,如果您不提示 Stable Diffusion 图像的特定方面,衣服颜色或一天中的时间等内容可能会变得随机,或者被赋予一个通用值,例如中性午间光线。

视频模型也是如此:您需要对事物具体化。例子包括摄像机和角色的运动、它们的朝向、速度和方向。您可以为了创意目的(想法生成)而将其保持未指定,但这可能不会总是给出您想要的结果(例如,实体反向动画)。

保持场景之间的一致性

如果您计划创建多个视频序列,您会希望在每个提示中添加尽可能多的细节,否则您可能会从一个序列到另一个序列丢失重要细节,例如颜色。

💡 这也将提高图像质量,因为提示用于 Zeroscope XL 的升级部分。

利用帧插值

帧插值是一个强大的工具,可以修复小的渲染错误,并将许多缺陷转化为特色,尤其是在动画较多的场景中,或者卡通效果可以接受的情况下。FILM 算法将通过视频剪辑中之前和之后的事件来平滑帧中的元素。

当摄像机平移或旋转时,这对于置换背景非常有效,并且还可以为您提供创作自由,例如控制生成后的帧数,以制作慢动作效果。

未来工作

我们希望您喜欢观看 AI 网络电视台的直播,并希望它能激发您在该领域创造更多内容。

由于这是首次尝试,许多事情并非本次技术演示的重点:生成更长、更多样化的序列,添加音频(音效、对话),生成和编排复杂场景,或者让语言模型代理对管道拥有更多控制权。

其中一些想法可能会在 AI 网络电视台的未来更新中实现,但我们也迫不及待地想看到研究人员、工程师和开发者社区会创造出什么!

社区

注册登录 发表评论