搭建一个 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 网络电视台的未来更新中实现,但我们也迫不及待地想看到研究人员、工程师和开发者社区会创造出什么!