从噪声到电影:深入浅出 AI 视频生成的底层原理(2026 最新)

关键词:扩散模型、Diffusion Transformer、时空 Patch、3D VAE、Flow Matching、Sora / Veo / 可灵

这篇文章不堆砌"哪个模型最强"的榜单,而是把 AI 视频"凭空生成"这件事的底层数学和工程逻辑讲清楚。读完你应该能回答:为什么是噪声变视频?为什么帧与帧之间不会"鬼畜"?以及如何用几十行代码亲手跑一遍核心流程。


一、先看现状:2026 年视频生成走到哪了

两年前 AI 视频还是"五秒钟、手指融化、画面糊成一团"的玩具。到 2026 年,主流模型已经能稳定输出 1080p 甚至原生 4K、十几秒、画面与音频同步生成的片段。

当前真正主流的几个模型------Google 的 Veo 3.1 、OpenAI 的 Sora 2 、快手的 可灵 3.0(Kling 3.0) 、字节的 Seedance 2.0------架构上有一个惊人的共识:

它们全部是 Diffusion Transformer(扩散 Transformer,简称 DiT)。

它们都不在原始像素上工作,而是把视频压缩进一个"时空潜空间",在里面把噪声一步步"去噪"成视频。下面我们就从这条主线把原理拆开。


二、整体框架:从一句话到一段视频

先建立全局认知。一个文本生成视频(Text-to-Video)系统,本质上是下面这条流水线:

复制代码
文本提示词 ──► 文本编码器 ──► 条件向量
                                  │
随机高斯噪声 ──► [ 扩散 Transformer 反复去噪 ] ──► 时空潜表示(latent)
                                  ▲
                          (条件向量注入引导)
                                  │
              时空潜表示 ──► 3D VAE 解码器 ──► 像素视频(+ 音频)

拆成四个核心模块:

  1. 文本编码:把"一只柯基在雪地里奔跑"变成模型能理解的向量(通常用 T5 或 CLIP 类编码器)。
  2. 时空压缩(3D VAE):像素视频太大,先压成低维潜空间,降低几十倍计算量。
  3. 扩散去噪(DiT):核心引擎。从纯噪声出发,在潜空间里一步步去噪,逐渐"显影"出符合提示词的内容。
  4. 解码还原:把去噪完成的潜表示解码回真实像素(现代模型还会同步生成音频)。

接下来逐个击破,重点在第 3 和第 2 模块


三、核心原理一:扩散模型------"加噪"与"去噪"

3.1 直觉:把生成问题变成去噪问题

扩散模型的核心思想极其优雅:

  • 前向过程(加噪) :拿一张真实图片,一点点往上加高斯噪声,加几百上千步后,它变成一团纯噪声。这个过程是固定的、无需学习的。
  • 反向过程(去噪) :训练一个神经网络,学会"看着一团带噪声的东西,预测出该减掉多少噪声"。如果网络学会了,那么我们就能从纯噪声出发,反向一步步去噪,无中生有地造出一张全新的图

视频只是把"一张图"换成"一叠按时间排列的图"而已。

3.2 数学表述(DDPM)

前向加噪 。给定真实数据 x0x_0x0,第 ttt 步的加噪结果可以一步到位地写出:

xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I) x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I)

其中 αˉt=∏s=1tαs\bar{\alpha}t = \prod{s=1}^{t}\alpha_sαˉt=∏s=1tαs 是一个随 ttt 增大而单调递减的系数(噪声调度)。ttt 越大,x0x_0x0 占比越小,噪声占比越大,直到几乎全是噪声。

训练目标 。我们训练一个网络 ϵθ\epsilon_\thetaϵθ,输入带噪样本 xtx_txt、步数 ttt 和条件 ccc(比如文本),让它预测当初加进去的噪声 ϵ\epsilonϵ:

L=Ex0,ϵ,t  ∥ϵ−ϵθ(xt,t,c)∥2   \mathcal{L} = \mathbb{E}_{x_0, \epsilon, t}\left\\; \\big\\\| \\epsilon - \\epsilon_\\theta(x_t, t, c) \\big\\\|\^2 \\;\\right L=Ex0,ϵ,t ϵ−ϵθ(xt,t,c) 2

就是一个最朴素的均方误差。训练阶段做的全部事情,就是反复地"随机选一个真实样本、随机加点噪声、让网络猜噪声"。

采样(生成) 。训练好后,从 xT∼N(0,I)x_T \sim \mathcal{N}(0, I)xT∼N(0,I) 出发,用网络预测的噪声反复去噪:

xt−1=1αt(xt−1−αt1−αˉt ϵθ(xt,t,c))+σtz x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}t}}\, \epsilon\theta(x_t, t, c) \right) + \sigma_t z xt−1=αt 1(xt−1−αˉt 1−αtϵθ(xt,t,c))+σtz

一步步从 xTx_TxT 走到 x0x_0x0,噪声团就"显影"成了内容。

💡 2026 趋势:Flow Matching

新一代模型(如 Stable Diffusion 3、部分视频模型)越来越多采用 Flow Matching / Rectified Flow ,不再预测离散噪声,而是学习一个从噪声分布到数据分布的连续"速度场" vθ(xt,t)v_\theta(x_t, t)vθ(xt,t),采样路径更直、步数更少、训练更稳。思想同源,只是把"预测噪声"换成了"预测前进方向"。


四、核心原理二:为什么要在"潜空间"里玩------3D VAE

4.1 像素空间太贵

一段 5 秒、24fps、512×512 的视频,就是 120×512×512×3≈9400120 \times 512 \times 512 \times 3 \approx 9400120×512×512×3≈9400 万个数。直接在像素上跑扩散,显存和算力都吃不消。

解法是 VAE(变分自编码器) :先用一个编码器 把视频压成一个小得多的潜表示 zzz,在 zzz 上做扩散,最后用解码器 还原回像素。这就是 Latent Diffusion(潜扩散) 的精髓,也是 Stable Diffusion 当年破圈的关键。

4.2 视频要压"时间维"------3D VAE

图片的 VAE 只压空间(高、宽)。但视频多了时间维 ,相邻帧高度冗余(背景几乎不动)。所以视频模型用 3D VAE:卷积核在"时间 × 高 × 宽"三个维度上同时压缩。

  • 空间通常压缩 8×8;
  • 时间通常压缩 4× 左右(比如 4 帧合并成 1 个时间潜帧)。

可灵(Kling)的官方架构说明里就明确写了用 3D VAE 高效压缩时空特征。压缩后扩散模型要处理的数据量直接小了几十倍,这是长视频、高分辨率能跑起来的工程前提。


五、核心原理三:Diffusion Transformer 与"时空 Patch"

5.1 从 U-Net 到 Transformer

早期扩散模型的去噪网络 ϵθ\epsilon_\thetaϵθ 是 U-Net (卷积结构)。Sora 带来的范式转变是:把 U-Net 换成 Transformer。Transformer 的可扩展性(scaling law)更好------加数据、加参数,效果稳定提升,这正是大模型时代最看重的性质。

5.2 关键招式:时空 Patch(Spacetime Patches)

Transformer 吃的是"一串 token"。怎么把一段视频潜表示变成 token 序列?

答案是 时空 Patch:把压缩后的时空潜表示,沿着"时间 × 高 × 宽"切成一个个小立方块(patch),每个立方块拉平成一个向量,就成了一个 token。

复制代码
潜空间视频 (T × H × W × C)
        │  按 (t_p × h_p × w_p) 切块
        ▼
一串时空 patch token ──► 喂给 Transformer

这个设计的妙处在于统一性 :无论视频是长是短、是横屏是竖屏、是高清是低清,都能切成同样规格的 patch 序列。这就是为什么 Sora 能用同一个模型训练任意时长、任意分辨率、任意宽高比的视频------OpenAI 的技术报告里把这套机制称为"把视频当作时空 patch 的集合"。

5.3 时序一致性靠什么------注意力

帧与帧之间不"鬼畜"、人物前后是同一个人、运动连贯------这些时间一致性 靠 Transformer 的注意力机制保证:

  • 空间注意力:同一帧内不同位置互相"看"(保证单帧画面合理)。
  • 时间注意力:不同时间步的同一区域互相"看"(保证运动连贯)。

很多实现采用 3D 全注意力 (所有时空 patch 互相 attend),效果最好但算力最贵;也有用时空分解注意力(先时间后空间)来省算力的折中方案。这正是"画面会不会抖、人物会不会变脸"的根本所在。

5.4 文本怎么"指挥"画面------条件注入与 CFG

提示词通过**交叉注意力(Cross-Attention)**注入:文本向量作为 Key/Value,潜表示 patch 作为 Query,让"柯基""雪地""奔跑"这些语义去影响每个 patch 的去噪方向。

此外几乎所有模型都用 无分类器引导(Classifier-Free Guidance, CFG) 来增强提示词的"听话程度"。做法是在采样时同时算"有提示词"和"无提示词"两个预测,然后外推放大二者的差:

ϵ^=ϵθ(xt,t,∅)+w⋅(ϵθ(xt,t,c)−ϵθ(xt,t,∅)) \hat{\epsilon} = \epsilon_\theta(x_t, t, \varnothing) + w \cdot \big( \epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing) \big) ϵ^=ϵθ(xt,t,∅)+w⋅(ϵθ(xt,t,c)−ϵθ(xt,t,∅))

引导系数 www 越大,越贴合提示词(但太大会过饱和、失真)。你在产品里调的"提示词相关性"滑块,背后往往就是这个 www。


六、动手:用代码跑通核心流程

下面给两段可独立运行的 PyTorch 教学代码(为聚焦原理做了简化,不是工业实现)。

6.1 扩散的"加噪 / 去噪"骨架

这段代码不依赖任何视频数据,直接展示扩散调度与采样循环的数学骨架:

python 复制代码
import torch

# ---------- 1. 噪声调度(线性 beta) ----------
T = 1000
betas = torch.linspace(1e-4, 0.02, T)          # 每一步的噪声强度
alphas = 1.0 - betas
alpha_bars = torch.cumprod(alphas, dim=0)       # ᾱ_t = ∏ α_s

# ---------- 2. 前向加噪:一步到位得到 x_t ----------
def q_sample(x0, t, noise):
    """x_t = √ᾱ_t · x0 + √(1-ᾱ_t) · ε"""
    ab = alpha_bars[t].view(-1, 1, 1, 1)         # 广播到 (B,C,H,W)
    return ab.sqrt() * x0 + (1 - ab).sqrt() * noise

# ---------- 3. 训练目标:让网络预测噪声 ----------
def training_loss(model, x0, cond):
    B = x0.size(0)
    t = torch.randint(0, T, (B,), device=x0.device)   # 随机步数
    noise = torch.randn_like(x0)                       # 随机噪声
    x_t = q_sample(x0, t, noise)
    pred = model(x_t, t, cond)                         # 网络预测噪声 ε_θ
    return ((noise - pred) ** 2).mean()                # MSE,就这么简单

# ---------- 4. 采样:从纯噪声反向去噪 ----------
@torch.no_grad()
def sample(model, shape, cond, guidance=4.0):
    x = torch.randn(shape)                             # x_T ~ N(0, I)
    for t in reversed(range(T)):
        t_b = torch.full((shape[0],), t, dtype=torch.long)
        # --- Classifier-Free Guidance ---
        eps_cond   = model(x, t_b, cond)
        eps_uncond = model(x, t_b, None)               # 空条件
        eps = eps_uncond + guidance * (eps_cond - eps_uncond)
        # --- DDPM 反向一步 ---
        a, ab, b = alphas[t], alpha_bars[t], betas[t]
        x = (x - (b / (1 - ab).sqrt()) * eps) / a.sqrt()
        if t > 0:
            x = x + b.sqrt() * torch.randn_like(x)     # 注入随机性
    return x

把上面的 model 换成处理视频张量 (B, T, C, H, W) 的网络,把图片换成视频潜表示,这套骨架就直接迁移到视频生成------核心数学一模一样

6.2 一个最小的"时空注意力"块(DiT 的灵魂)

这段展示时间一致性的关键------时空分解注意力:

python 复制代码
import torch
import torch.nn as nn

class SpatioTemporalBlock(nn.Module):
    """简化版 DiT 块:空间注意力 + 时间注意力 + 交叉注意力(文本条件)"""
    def __init__(self, dim, n_heads, text_dim):
        super().__init__()
        self.spatial_attn  = nn.MultiheadAttention(dim, n_heads, batch_first=True)
        self.temporal_attn = nn.MultiheadAttention(dim, n_heads, batch_first=True)
        self.cross_attn    = nn.MultiheadAttention(dim, n_heads, batch_first=True,
                                                   kdim=text_dim, vdim=text_dim)
        self.norm1 = nn.LayerNorm(dim)
        self.norm2 = nn.LayerNorm(dim)
        self.norm3 = nn.LayerNorm(dim)
        self.ff = nn.Sequential(nn.Linear(dim, dim * 4), nn.GELU(),
                                nn.Linear(dim * 4, dim))

    def forward(self, x, text):
        # x: (B, T, N, D)  ------ T 个时间步,每步 N 个空间 patch token
        B, Ti, N, D = x.shape

        # 1) 空间注意力:同一帧内 N 个 patch 互相看
        h = x.reshape(B * Ti, N, D)
        h = h + self.spatial_attn(self.norm1(h), self.norm1(h), self.norm1(h))[0]

        # 2) 时间注意力:同一空间位置在 T 个时间步之间互相看(保证运动连贯)
        h = h.reshape(B, Ti, N, D).permute(0, 2, 1, 3).reshape(B * N, Ti, D)
        h = h + self.temporal_attn(self.norm2(h), self.norm2(h), self.norm2(h))[0]
        h = h.reshape(B, N, Ti, D).permute(0, 2, 1, 3).reshape(B * Ti, N, D)

        # 3) 交叉注意力:让文本条件引导画面内容
        t = text.unsqueeze(1).expand(B, Ti, -1, -1).reshape(B * Ti, -1, text.size(-1))
        h = h + self.cross_attn(self.norm3(h), t, t)[0]

        # 4) 前馈
        h = h + self.ff(h)
        return h.reshape(B, Ti, N, D)

读懂这两段代码,你就握住了所有主流视频生成模型的"骨架":扩散负责"从噪声造内容",时空注意力负责"帧间连贯",交叉注意力负责"听懂提示词"

6.3 真实开发:直接调用厂商 API

绝大多数实际项目不会自己训模型,而是调用 Veo / 可灵 / Seedance 等厂商接口。形态大同小异------提交一个生成任务、轮询任务状态、取回视频 URL:

python 复制代码
import requests, time

API_BASE = "https://api.example-video-provider.com/v1"  # 占位,以实际厂商文档为准
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1) 提交生成任务
def create_task(prompt, duration=5, resolution="1080p"):
    resp = requests.post(f"{API_BASE}/videos/generations", headers=HEADERS, json={
        "model": "video-gen-latest",
        "prompt": prompt,
        "duration": duration,
        "resolution": resolution,
        "aspect_ratio": "16:9",
    })
    resp.raise_for_status()
    return resp.json()["task_id"]

# 2) 轮询直到完成(视频生成通常是异步的,耗时几十秒到几分钟)
def wait_for_result(task_id, interval=5, timeout=600):
    start = time.time()
    while time.time() - start < timeout:
        r = requests.get(f"{API_BASE}/tasks/{task_id}", headers=HEADERS).json()
        status = r["status"]
        if status == "succeeded":
            return r["output"]["video_url"]
        if status == "failed":
            raise RuntimeError(r.get("error", "generation failed"))
        time.sleep(interval)
    raise TimeoutError("generation timed out")

if __name__ == "__main__":
    tid = create_task("一只柯基在雪地里奔跑,慢动作,电影级光影")
    url = wait_for_result(tid)
    print("生成完成:", url)

⚠️ 各厂商参数名、鉴权方式、计费(基本都按"秒"收费)各不相同,以官方文档为准。上面是通用模式骨架。


七、总结:一张图记住全部

模块 作用 关键技术
文本编码器 把提示词变向量 T5 / CLIP
3D VAE 时空压缩,降算力 3D 卷积、潜空间
时空 Patch 视频→token 序列 Spacetime Patches
Diffusion Transformer 去噪生成主引擎 DiT、扩散 / Flow Matching
时间注意力 帧间连贯一致 3D / 分解注意力
交叉注意力 + CFG 听懂并贴合提示词 Cross-Attention、引导系数
解码器 潜表示→像素(+音频) 3D VAE Decoder

一句话串起来:

把视频压进时空潜空间 → 切成时空 patch → 用 Transformer 在扩散过程中从噪声去噪、靠注意力保证连贯、靠文本条件引导内容 → 解码回像素。

接下来值得关注的方向

  • Flow Matching / 一致性模型:更少采样步数、更快生成,正在取代传统 DDPM 采样。
  • 音视频联合生成:2026 主流模型已把对白、音效、环境音与画面在同一次前向里同步生成。
  • 更长、更可控:多镜头一致性、首尾帧控制、相机轨迹控制成为新战场。
  • 自回归 vs 扩散之争:自回归在超长视频上有理论优势,但 2026 年 DiT 仍是产业主力。

本文聚焦原理与最小可运行示例,工业级实现还涉及大量训练技巧、数据工程与分布式优化。如果你想要某一模块(比如 3D VAE 训练、Flow Matching 推导)的深入拆解,欢迎在评论区交流。