AI视频生成技术全景:Sora2、Veo3、可灵3.0背后的Diffusion架构深度解析

AI视频生成技术全景:Sora2、Veo3、可灵3.0背后的Diffusion架构深度解析

写在前面:2026年的AI视频生成,已经彻底告别了"玩票阶段"。当可灵3.0以1241分的Arena ELO评分超越Sora 2和Veo 3.1登顶全球第一,当原生4K直出成为标配,当2秒实时出片走进直播间------这场由Diffusion架构驱动的视觉革命,正在重塑整个内容产业。

本文将带你从底层原理到工程落地,完整拆解Sora 2、Veo 3.1、可灵3.0背后的技术内核。全程高能,含可运行PyTorch代码,建议先收藏再阅读。


前言:2026,AI视频的"诸神之战"

老读者都知道,我写技术文章有个习惯------先讲一个"场景"。

2024年2月,OpenAI甩出Sora的技术报告,整个AI圈炸锅。那时候大家还在争论"AI能不能生成一段5秒钟、不变形、不掉帧的视频"。

快进到2026年7月。我打开快手可灵3.0,输入一句:

"一个穿汉服的女孩在赛博朋克城市里打太极,霓虹灯倒映在雨后的街道上,镜头从脚下摇到天空"

15秒后,一段4K分辨率、人物肢体完全不扭曲、雨水会顺着衣服下落的视频就生成了。说实话,第一次看到的时候我后背有点发凉------这已经不是"AI生成视频"了,这是"AI在理解世界"。

全球格局已经非常清晰了,我用一张"势力图"来概括:

复制代码
┌─────────────────────────────────────────────────────────┐
│              2026 AI视频生成 全球势力图                    │
├──────────────────────┬──────────────────────────────────┤
│   国际四大            │   国产第一梯队                    │
├──────────────────────┼──────────────────────────────────┤
│  Sora 2 (OpenAI)     │  Seedance 2.0 (字节跳动)          │
│  Veo 3.1 (Google)    │  Kling 3.0 (快手) ★全球第一        │
│  Runway Gen-4        │  Vidu Q3 (生数科技)               │
│  Pika 2.0            │                                  │
└──────────────────────┴──────────────────────────────────┘

根据全球知名AI基准测试机构 Artificial Analysis 发布的最新榜单,快手可灵3.0系列(Kling 3.0 Pro)凭借 1241分的Arena ELO评分 位居视频生成领域第一,把Sora 2和Veo 3.1压在身后。这是一个标志性事件------国产模型在视频生成这条赛道上,第一次实现了真正的"超车"。

但比"谁第一"更值得深究的是:它们到底用了什么技术?为什么是Diffusion Transformer(DiT)一统天下?可灵3.0凭什么能赢?

这篇文章,我就要把这些"为什么"讲透。


目录


一、AI视频生成技术演进:从GAN到Diffusion到DiT

要理解2026年的视频生成,必须先回头看这条路是怎么走过来的。我用三个"时代"来划分。

1.1 GAN时代(2014-2020):对抗博弈的"左右互搏"

2014年,Ian Goodfellow提出GAN(Generative Adversarial Network,生成对抗网络)。核心思想用一个类比就懂了:

GAN就像一个"造假者"和"鉴定师"的博弈。 生成器(造假者)拼命伪造画作,判别器(鉴定师)拼命识别真假。两者在对抗中一起变强,最后造假者能造出以假乱真的画。

python 复制代码
# GAN的核心思想伪代码
G = Generator()   # 造假者:噪声 -> 假图
D = Discriminator()  # 鉴定师:图 -> 真/假

for step in training:
    z = sample_noise()
    fake = G(z)
    real_score = D(real_data)
    fake_score = D(fake)
    # D想最大化 log(D(real)) + log(1 - D(fake))
    # G想最小化 log(1 - D(fake))

GAN在视频生成上的代表是 VGAN、MoCoGAN。但GAN有几个致命问题:

问题 表现
模式崩溃 生成器偷懒,只生成几种"安全"的样本,多样性差
训练不稳定 造假者和鉴定师一旦实力失衡,整个训练就崩
难扩展 要生成高分辨率长视频,GAN的判别器会越来越难训
多样性差 同一个输入,输出变化有限

一句话总结:GAN生成单张图还行,生成视频就是"地狱难度"。

1.2 Diffusion时代(2020-2022):加噪去噪的"雕塑家"

2020年,DDPM(Denoising Diffusion Probabilistic Models)横空出世,彻底改变了生成模型的格局。

Diffusion的核心思想同样可以用一个类比理解:

Diffusion就像一个雕塑家。 先把一尊完美的雕像(清晰图像)一点点糊上泥巴(加噪),直到变成一坨看不清原貌的泥块(纯噪声)。然后训练一个模型,学会一点点把泥巴刮掉(去噪),最终还原出雕像。神奇的是,只要从一团随机噪声开始"刮",就能刮出全新的、从未见过的雕像。

相比GAN,Diffusion的优势太明显了:

  • 训练稳定:没有对抗博弈,就是单纯的回归任务
  • 多样性好:从随机噪声出发,每次结果都不一样
  • 质量高:生成质量随模型规模稳步提升
  • 可控性强:可以通过条件引导控制生成方向

代表工作:Stable Diffusion、Imagen、DALL-E 2。这一时期,图像生成质量突飞猛进,但视频生成还很初级------基本是"先生成关键帧,再插值",时间一致性很差。

1.3 DiT时代(2023-2026):Transformer一统江湖

2022年底,Peebles & Xie提出 DiT(Diffusion Transformer),把Diffusion里的U-Net换成了Transformer。这个看似简单的替换,引发了连锁反应。

2024年2月,OpenAI发布Sora,明确点出Sora就是一个 Diffusion Transformer,在时空Patch上运作。从那一刻起,DiT成了视频生成的事实标准。

2026年的今天,几乎所有主流视频模型都建立在DiT架构之上:Sora 2、可灵3.0、Runway Gen-4、Luma Dream Machine......

我用一张时间线图把演进过程串起来:

复制代码
2014 ──── GAN诞生(Goodfellow)
  │
2020 ──── DDPM,Diffusion Model崛起
  │
2021 ──── CLIP + Diffusion(DALL-E 2, Imagen)
  │
2022 ──── Stable Diffusion(LATENT Diffusion),DiT论文发表
  │
2024.2 ─── Sora发布,DiT + 时空Patch,视频生成元年
  │
2025 ──── Veo 3、Runway Gen-3 Alpha、可灵1.0/2.0
  │
2026 ──── 可灵3.0登顶(4K直出)、Sora 2、Veo 3.1、Seedance 2.0

一句话理解这条演进线:GAN靠"对抗" → Diffusion靠"加噪去噪" → DiT把Diffusion的骨干换成Transformer,让模型能"吃"下海量视频数据并scaling。

为什么要从U-Net换到Transformer?这就引出下一章的核心问题。


二、Diffusion Model原理详解:前向加噪与反向去噪

无论Sora还是可灵3.0,底层都是Diffusion。这一章我把Diffusion的数学原理讲透,并且给出可运行代码。这是后面理解DiT的基础。

2.1 前向过程:把清晰变成噪声

前向过程(Forward Process)很好理解:给定一张清晰图像 x 0 x_0 x0,我们逐步往里加高斯噪声,经过 T T T 步后变成纯噪声 x T x_T xT。

每一步的加噪公式是:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t   x t − 1 ,   β t I ) q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}\, x_{t-1},\, \beta_t I) q(xt∣xt−1)=N(xt;1−βt xt−1,βtI)

其中 β t \beta_t βt 是预先设定的噪声调度(noise schedule),从0逐渐增大到1。

这里有个关键技巧 叫"重参数化",让我们可以一步从 x 0 x_0 x0 跳到任意 x t x_t xt,不用一步步加:

q ( x t ∣ x 0 ) = N ( x t ; α ˉ t   x 0 ,   ( 1 − α ˉ t ) I ) q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}\, x_0,\, (1-\bar{\alpha}_t) I) q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I)

其中 α ˉ t = ∏ i = 1 t α i \bar{\alpha}t = \prod{i=1}^{t} \alpha_i αˉt=∏i=1tαi,而 α i = 1 − β i \alpha_i = 1 - \beta_i αi=1−βi。

用人话说:x t x_t xt 就是 x 0 x_0 x0 和噪声的加权混合,时间步越大,噪声权重越高。

python 复制代码
import torch
import torch.nn.functional as F
import numpy as np

# ============ 前向扩散过程 ============
class DiffusionForward:
    def __init__(self, num_timesteps=1000, beta_start=1e-4, beta_end=0.02, device='cuda'):
        self.T = num_timesteps
        # 线性噪声调度
        self.betas = torch.linspace(beta_start, beta_end, num_timesteps, device=device)
        self.alphas = 1.0 - self.betas
        # 累积乘积 alpha_bar
        self.alpha_bars = torch.cumprod(self.alphas, dim=0)

    def q_sample(self, x0, t, noise=None):
        """
        一步从 x0 得到 xt(重参数化技巧)
        x0: [B, C, H, W] 原始清晰图像
        t:  [B] 时间步
        """
        if noise is None:
            noise = torch.randn_like(x0)
        # 取出对应时间步的 alpha_bar
        alpha_bar_t = self.alpha_bars[t].view(-1, 1, 1, 1)
        # 核心公式:xt = sqrt(alpha_bar) * x0 + sqrt(1-alpha_bar) * noise
        xt = torch.sqrt(alpha_bar_t) * x0 + torch.sqrt(1 - alpha_bar_t) * noise
        return xt

跑一下看看效果:随着 t t t 增大,图像越来越糊,最后变成雪花点。这就是前向过程------一条"不归路",只能往里加噪声。

2.2 反向过程:从噪声里"雕刻"出图像

反向过程(Reverse Process)才是生成模型的核心:从纯噪声 x T x_T xT 出发,一步步去噪,最终得到 x 0 x_0 x0。

数学上,反向过程建模为:

p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))

DDPM的关键贡献是:不要去预测 μ θ \mu_\theta μθ,而是去预测噪声 ϵ θ \epsilon_\theta ϵθ。这样训练目标变得超级简单:

L simple = E t , x 0 , ϵ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 \mathcal{L}{\text{simple}} = \mathbb{E}{t, x_0, \epsilon}\left \\\| \\epsilon - \\epsilon_\\theta(x_t, t) \\\|\^2 \\right Lsimple=Et,x0,ϵ∥ϵ−ϵθ(xt,t)∥2

翻译成人话:给模型看一张加噪后的图和时间步t,让它预测加进去的是哪团噪声。预测准了,就能反着去噪。

这就像考试的"反向题"------前向是"往清水里滴墨水",反向训练就是"看着这杯浑水,猜最初滴了几滴、滴在哪"。

python 复制代码
# ============ 训练:预测噪声 ============
def train_step(model, diffusion, x0, optimizer):
    """
    model: 噪声预测网络(U-Net 或 DiT)
    x0:    干净的训练样本
    """
    B = x0.shape[0]
    # 1. 随机采样时间步
    t = torch.randint(0, diffusion.T, (B,), device=x0.device)
    # 2. 随机采样噪声
    noise = torch.randn_like(x0)
    # 3. 前向加噪得到 xt
    xt = diffusion.q_sample(x0, t, noise)
    # 4. 模型预测噪声
    noise_pred = model(xt, t)
    # 5. MSE损失:预测噪声 vs 真实噪声
    loss = F.mse_loss(noise_pred, noise)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss.item()

2.3 采样:一步步去噪生成新样本

训练好后,采样过程就是从 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, I) xT∼N(0,I) 开始,循环 T T T 步去噪:

python 复制代码
@torch.no_grad()
def sample(model, diffusion, shape, device='cuda'):
    """从纯噪声开始采样"""
    x = torch.randn(shape, device=device)
    for t in reversed(range(diffusion.T)):
        t_batch = torch.full((shape[0],), t, device=device, dtype=torch.long)
        # 预测噪声
        pred_noise = model(x, t_batch)
        # DDPM去噪一步
        alpha = diffusion.alphas[t]
        alpha_bar = diffusion.alpha_bars[t]
        beta = diffusion.betas[t]
        # 均值
        mean = (1 / torch.sqrt(alpha)) * (x - (beta / torch.sqrt(1 - alpha_bar)) * pred_noise)
        if t > 0:
            noise = torch.randn_like(x)
            x = mean + torch.sqrt(beta) * noise
        else:
            x = mean
    return x

2.4 潜空间扩散(Latent Diffusion):Stable Diffusion的精髓

直接在像素空间做Diffusion太慢了(一张512×512图就有78万像素)。Stable Diffusion的核心创新是 潜空间扩散(Latent Diffusion)

用一个VAE(变分自编码器)先把图像压缩到一个小的潜空间(比如64×64×4),在潜空间里做Diffusion,生成后再用VAE解码回像素空间。

这就像把一栋别墅压成一个手提箱,在手提箱里搞装修,最后再展开成别墅。 计算量直接降两个数量级。

python 复制代码
# Latent Diffusion 流程
# 1. 编码:图像 -> 潜变量
z0 = vae.encode(image)          # [B,4,64,64]  压缩32倍
# 2. 在潜空间做前向加噪
zt = diffusion.q_sample(z0, t)
# 3. 模型在潜空间预测噪声
noise_pred = dit_model(zt, t, text_condition)
# 4. 采样后在潜空间得到 z0_gen
# 5. 解码:潜变量 -> 图像
generated_image = vae.decode(z0_gen)

Sora和可灵3.0都继承了这套"潜空间扩散"思想,只是把"图像VAE"升级成了"视频VAE/视频压缩网络",把2D潜变量扩展成了时空3D潜变量。这一点第五章会详细讲。


三、U-Net vs DiT:为什么Transformer赢了

理解了Diffusion,下一个关键问题:预测噪声的那个网络 ϵ θ \epsilon_\theta ϵθ,到底该用什么架构?

3.1 U-Net:卷积王者的统治时代

在DiT出现之前,Diffusion的噪声预测网络清一色是 U-Net。U-Net长这样:

复制代码
输入 ──> [下采样:卷积+下采样] ──> 瓶颈层 ──> [上采样:卷积+上采样] ──> 输出
              │                                      │
              └────────── 跳跃连接(skip) ─────────────┘

U-Net的核心特点:

  • 卷积为主:靠Conv提取局部特征
  • U形结构:先下采样提取多尺度特征,再上采样恢复分辨率
  • 跳跃连接:把浅层细节直接送到深层,保住高频信息

U-Net在图像生成上效果非常好,Stable Diffusion 1.x/2.x都用的U-Net。但它有个致命问题:难以scaling。

3.2 U-Net的scaling瓶颈

U-Net的卷积结构是"局部视野",要让模型理解全局信息,得靠堆层数。但堆深了,训练又不稳定,而且卷积的归纳偏置(平移不变性、局部性)在大数据量下反而成了"天花板"。

Transformer则相反:自注意力天然是全局视野,而且有被验证过的scaling law------参数越多、数据越多,效果就越好,可预测。

Peebles & Xie在DiT论文里做了一个关键实验:把U-Net换成纯Transformer,在ImageNet类条件图像生成上,DiT-XL/2的FID比U-Net更好的同时,scaling特性远超U-Net。

3.3 一张表看懂差异

维度 U-Net DiT (Diffusion Transformer)
核心算子 卷积(Conv) 自注意力(Self-Attention)
感受野 局部(需堆层扩大) 全局(一层就看全)
归纳偏置 平移不变性、局部性 几乎无(数据驱动)
scaling特性 差,难扩展 好,符合scaling law
输入处理 直接吃特征图 切成Patch序列
计算复杂度 O(N) O(N²)(需优化)
数据效率 小数据下更优 大数据下碾压
代表模型 Stable Diffusion 1.x Sora、可灵3.0、PixArt
适合场景 中等规模图像生成 大规模视频/图像生成

类比理解:U-Net像一个"近视眼的匠人",得凑近了看局部,一步步拼;DiT像一个"上帝视角的雕塑家",一眼看到全貌,统筹全局。在小作坊里匠人够用,但要造摩天大楼,必须用上帝视角。

3.4 为什么是Transformer赢了

我总结三个根本原因:

原因一:Scaling Law。 Transformer的scaling特性已经被GPT系列反复验证。视频生成的数据量是图像的成百上千倍(一段视频=成百上千帧),只有符合scaling law的架构才能"吃"下这么大的数据量并持续变强。

原因二:序列建模天然适配视频。 视频本质上是"帧序列",Transformer就是为序列建模而生的。把视频切成时空Patch序列后,Transformer可以自然地建模帧间关系。

原因三:多模态融合方便。 文本条件、音频条件、图像条件......这些不同模态的条件信息可以统一成token序列,喂给同一个Transformer。这对于Veo 3.1的"音画同步"、可灵3.0的"多模态控制"至关重要。

python 复制代码
# U-Net与DiT的简化对比
class SimpleUNetBlock(nn.Module):
    """U-Net: 卷积为主,局部视野"""
    def __init__(self, in_ch, out_ch):
        super().__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, 3, padding=1),
            nn.GroupNorm(8, out_ch),
            nn.SiLU(),
            nn.Conv2d(out_ch, out_ch, 3, padding=1),
        )
    def forward(self, x):
        return self.conv(x)  # 只看3x3局部

class DiTBlock(nn.Module):
    """DiT: 自注意力为主,全局视野"""
    def __init__(self, dim, num_heads=8):
        super().__init__()
        self.norm1 = nn.LayerNorm(dim)
        self.attn = nn.MultiheadAttention(dim, num_heads, batch_first=True)
        self.norm2 = nn.LayerNorm(dim)
        self.mlp = nn.Sequential(
            nn.Linear(dim, dim*4), nn.GELU(), nn.Linear(dim*4, dim)
        )
    def forward(self, x):
        # 自注意力:每个patch都能看到所有其他patch
        h = self.norm1(x)
        attn_out, _ = self.attn(h, h, h)
        x = x + attn_out
        x = x + self.mlp(self.norm2(x))
        return x

一句话总结这一章:U-Net是"图像时代的王者",DiT是"视频时代的基建"。 这就是为什么2026年所有头部视频模型都倒向了DiT。


四、DiT架构核心创新:从图像到视频的范式跃迁

这一章我们深入DiT的内部结构,看看它到底做了哪些创新,让它能从图像生成无缝迁移到视频生成。

4.1 DiT的整体结构

DiT的处理流程可以概括为四步:

复制代码
1. Patchify:    输入特征图 → 切成Patch → 展平成序列 → 线性投影
2. 加位置编码:   给每个Patch加上时空位置信息
3. Transformer: 经过N层DiT Block(自注意力 + MLP + 条件注入)
4. Unpatchify:  序列 → 还原成特征图 → 输出预测噪声

我用一张图表示:

复制代码
        ┌────────────────────────────────────┐
        │   输入: 噪声潜变量 z_t  [B,C,H,W]    │
        └──────────────┬─────────────────────┘
                       ▼
        ┌────────────────────────────────────┐
        │  Patchify: 切成2x2 Patch, 展平       │
        │  序列长度 N = (H/2)*(W/2)            │
        └──────────────┬─────────────────────┘
                       ▼
        ┌────────────────────────────────────┐
        │  + 位置编码 + 时间步t嵌入 + 条件嵌入  │
        └──────────────┬─────────────────────┘
                       ▼
        ┌────────────────────────────────────┐
        │  DiT Block × N                      │
        │  ┌──────────────────────────────┐   │
        │  │ LayerNorm → Self-Attention   │   │
        │  │   ↑ adaLN(条件注入)          │   │
        │  │ LayerNorm → MLP              │   │
        │  │   ↑ adaLN(条件注入)          │   │
        │  └──────────────────────────────┘   │
        └──────────────┬─────────────────────┘
                       ▼
        ┌────────────────────────────────────┐
        │  Unpatchify → 输出预测噪声           │
        └────────────────────────────────────┘

4.2 核心创新一:Patchify(分块化)

DiT的第一个创新是把输入特征图切成Patch。这一步灵感来自ViT(Vision Transformer)。

类比:就像把一幅拼图切成小方块,每块作为一个"词",然后像处理句子一样处理这幅图。

python 复制代码
class PatchEmbed(nn.Module):
    """把特征图切成patch并投影到token维度"""
    def __init__(self, patch_size=2, in_channels=4, embed_dim=768):
        super().__init__()
        self.proj = nn.Conv2d(in_channels, embed_dim,
                              kernel_size=patch_size, stride=patch_size)
        self.patch_size = patch_size

    def forward(self, x):
        # x: [B, C, H, W]
        x = self.proj(x)              # [B, embed_dim, H/ps, W/ps]
        x = x.flatten(2).transpose(1, 2)  # [B, N, embed_dim]
        return x

Patchify的好处太大了

  • 大幅缩短序列长度(2×2 patch让序列长度变成1/4)
  • 让Transformer能处理任意分辨率(只要能被patch_size整除)
  • 为视频的"时空Patch"打下基础

4.3 核心创新二:adaLN-Zero(自适应层归一化)

DiT怎么把"时间步t"和"文本条件"注入到Transformer里?用的是 adaLN(Adaptive Layer Normalization)

普通LayerNorm: LN ( x ) = γ ⋅ x − μ σ + β \text{LN}(x) = \gamma \cdot \frac{x-\mu}{\sigma} + \beta LN(x)=γ⋅σx−μ+β,其中 γ , β \gamma, \beta γ,β 是可学习参数。

adaLN: γ , β \gamma, \beta γ,β 不再是固定参数,而是 由条件(时间步+文本)动态生成的:

γ , β = MLP ( embedding ( t ) + embedding ( text ) ) \gamma, \beta = \text{MLP}(\text{embedding}(t) + \text{embedding}(\text{text})) γ,β=MLP(embedding(t)+embedding(text))

DiT更进一步提出 adaLN-Zero :把MLP初始化为输出全0,这样训练初期每个DiT Block相当于恒等映射,让深层Transformer能稳定训练。这个小技巧极其关键。

python 复制代码
class adaLNModulation(nn.Module):
    """adaLN-Zero: 由条件动态生成scale和shift"""
    def __init__(self, hidden_size, num_outputs=6):
        super().__init__()
        self.num_outputs = num_outputs
        self.proj = nn.Sequential(
            nn.SiLU(),
            nn.Linear(hidden_size, num_outputs * hidden_size)
        )
        # Zero-init: 训练初期为恒等映射
        nn.init.zeros_(self.proj[-1].weight)
        nn.init.zeros_(self.proj[-1].bias)

    def forward(self, c):
        # c: 条件嵌入 [B, hidden_size]
        return self.proj(c).chunk(self.num_outputs, dim=-1)

4.4 核心创新三:完整的DiT Block

把上面这些组合起来,一个完整的DiT Block长这样:

python 复制代码
class DiTBlock(nn.Module):
    """完整的DiT Block: adaLN-Zero + Self-Attention + MLP"""
    def __init__(self, hidden_size, num_heads, mlp_ratio=4.0):
        super().__init__()
        self.norm1 = nn.LayerNorm(hidden_size, elementwise_affine=False)
        self.attn = nn.MultiheadAttention(hidden_size, num_heads,
                                          batch_first=True)
        self.norm2 = nn.LayerNorm(hidden_size, elementwise_affine=False)
        # MLP
        mlp_hidden = int(hidden_size * mlp_ratio)
        self.mlp = nn.Sequential(
            nn.Linear(hidden_size, mlp_hidden),
            nn.GELU(),
            nn.Linear(mlp_hidden, hidden_size)
        )
        # adaLN调制:生成6个参数 (scale1, shift1, gate1, scale2, shift2, gate2)
        self.adaLN = adaLNModulation(hidden_size, num_outputs=6)

    def forward(self, x, c):
        # c: 条件嵌入
        scale1, shift1, gate1, scale2, shift2, gate2 = self.adaLN(c)
        # Attention分支(带adaLN调制和gate)
        h = self.norm1(x) * (1 + scale1) + shift1
        attn_out, _ = self.attn(h, h, h)
        x = x + gate1 * attn_out
        # MLP分支(带adaLN调制和gate)
        h = self.norm2(x) * (1 + scale2) + shift2
        x = x + gate2 * self.mlp(h)
        return x

4.5 从图像DiT到视频DiT:时空注意力

图像DiT处理的是2D Patch序列。视频DiT要把"时间"维度也加进来。主要两种方案:

方案一:时空联合Patch(Sora方案)。把视频的"时间×高×宽"三个维度一起切Patch,得到一个长序列,直接喂给Transformer。Sora就是这套。

方案二:时空分离注意力。先在空间维度做attention,再在时间维度做attention。计算量更小,但全局建模能力弱一些。

python 复制代码
class SpatiotemporalPatchEmbed(nn.Module):
    """时空联合Patch: 视频[T,C,H,W] -> 序列"""
    def __init__(self, patch_t=1, patch_h=2, patch_w=2,
                 in_channels=4, embed_dim=768):
        super().__init__()
        # 用3D卷积同时切时间和空间
        self.proj = nn.Conv3d(in_channels, embed_dim,
                              kernel_size=(patch_t, patch_h, patch_w),
                              stride=(patch_t, patch_h, patch_w))

    def forward(self, x):
        # x: [B, C, T, H, W]  视频
        x = self.proj(x)                    # [B, embed_dim, T', H', W']
        # 展平成序列
        B, D, T, H, W = x.shape
        x = x.flatten(2).transpose(1, 2)   # [B, T'*H'*W', embed_dim]
        return x, (T, H, W)

关键理解:时空联合Patch让序列长度爆炸------一段10秒、30fps、512×512的视频,Patch后可能有几万个token。这是为什么Sora/可灵3.0需要极其夸张的算力,也是它们scaling能力强的根源。

4.6 旋转位置编码(RoPE):视频场景的"坐标系"

视频DiT还要解决一个问题:怎么告诉模型每个Patch在时空中的位置? 答案是 3D旋转位置编码(3D-RoPE)

RoPE的好处是能天然处理"相对位置",而且对长序列泛化好。在视频里,需要给时间、高度、宽度三个维度各算一组RoPE再拼起来。

python 复制代码
def get_3d_rope(T, H, W, dim, device='cuda'):
    """生成3D旋转位置编码(时间、高、宽各占dim/3)"""
    d = dim // 3
    # 三个维度各自的频率
    freqs_t = 1.0 / (10000 ** (torch.arange(0, d, 2, device=device).float() / d))
    freqs_h = 1.0 / (10000 ** (torch.arange(0, d, 2, device=device).float() / d))
    freqs_w = 1.0 / (10000 ** (torch.arange(0, d, 2, device=device).float() / d))

    t = torch.arange(T, device=device).float()
    h = torch.arange(H, device=device).float()
    w = torch.arange(W, device=device).float()

    # 计算每个维度的角度
    theta_t = torch.outer(t, freqs_t)   # [T, d/2]
    theta_h = torch.outer(h, freqs_h)   # [H, d/2]
    theta_w = torch.outer(w, freqs_w)   # [W, d/2]

    # 拼成完整的位置编码(实际实现会更精细)
    return theta_t, theta_h, theta_w

这一章我们看到了DiT的几个关键创新:Patchify让Transformer能吃图像/视频、adaLN-Zero让深层网络稳定训练、时空联合Patch让模型统一处理时空信息、3D-RoPE提供位置先验。 这些就是Sora和可灵3.0的共同技术底座。


五、Sora技术解析:时空Patch、DiT与视频压缩网络

终于到了重头戏。Sora是DiT视频生成的"开山之作",理解Sora就理解了整个技术范式。

5.1 Sora的三大核心组件

OpenAI在技术报告里明确指出,Sora由三部分组成:

复制代码
┌──────────────────────────────────────────────────────────┐
│                     Sora 架构全景                         │
│                                                          │
│  ┌──────────────┐   ┌──────────────┐   ┌──────────────┐ │
│  │ Video        │   │              │   │              │ │
│  │ Compression  │──>│  Diffusion   │──>│  Text        │ │
│  │ Network      │   │  Transformer │   │  Conditioner │ │
│  │ (视频VAE)     │   │  (DiT)       │   │  (文本编码)   │ │
│  └──────────────┘   └──────────────┘   └──────────────┘ │
│   像素→潜空间         潜空间去噪          文本→条件向量     │
└──────────────────────────────────────────────────────────┘

5.2 组件一:视频压缩网络(Video Compression Network)

这是Sora最关键的创新之一。它的作用是把高维视频像素压缩到低维潜空间。

类比:就像把一部4K电影压缩成一个zip包。Sora训练了一个专门的神经网络来做这件事,把"像素空间"映射到"潜空间",维度大幅降低。

为什么不能直接用普通图像VAE?因为视频有"时间维度"。普通VAE一帧一帧压缩会丢失帧间关系。Sora的压缩网络是 3D时空压缩------同时压缩时间、高度、宽度三个维度。

python 复制代码
class VideoCompressionNetwork(nn.Module):
    """简化版视频压缩网络(编码器部分)
    将 [B, C, T, H, W] 像素视频 -> [B, latent_C, T', H', W'] 潜变量
    """
    def __init__(self, in_channels=3, latent_channels=4,
                 compress_factor=(4, 8, 8)):  # (时间x4, 空间x8)
        super().__init__()
        # 用3D卷积做时空下采样
        self.encoder = nn.Sequential(
            self._conv3d_block(in_channels, 64),          # T,H,W不变
            nn.Conv3d(64, 64, kernel_size=3,
                      stride=(1,2,2), padding=1),          # 空间x2
            self._conv3d_block(64, 128),
            nn.Conv3d(128, 128, kernel_size=3,
                      stride=(2,2,2), padding=1),          # 时空x2
            self._conv3d_block(128, 256),
            nn.Conv3d(256, 256, kernel_size=3,
                      stride=(2,2,2), padding=1),          # 时空x2
            nn.Conv3d(256, latent_channels, kernel_size=1) # 降通道
        )
        self.compress_factor = compress_factor

    def _conv3d_block(self, in_ch, out_ch):
        return nn.Sequential(
            nn.Conv3d(in_ch, out_ch, 3, padding=1),
            nn.GroupNorm(8, out_ch),
            nn.SiLU()
        )

    def forward(self, video):
        # video: [B, 3, T, H, W]
        z = self.encoder(video)
        return z  # [B, latent_C, T/4, H/8, W/8]

压缩网络带来的好处

  • 计算量从像素级降到潜空间级,可处理更长的视频
  • 时空联合压缩保留了帧间运动信息
  • 不同分辨率/时长/宽高比的视频都能压缩成统一的潜空间表示

5.3 组件二:时空Patch(Spacetime Patches)

压缩成潜变量后,Sora把潜变量切成 时空Patch(Spacetime Patches),这是Sora"理解"视频的基本单位。

类比:大语言模型把文本切成"token"(词),Sora把视频切成"时空token"(一小块时空区域)。每个时空Patch就像视频世界里的一个"词"。

时空Patch最革命性的意义在于:统一了所有视觉数据。

以前的视频模型要求训练数据必须裁剪成统一尺寸(比如都是256×256、16帧)。但真实世界的视频五花八门------有竖屏的、横屏的、超宽的、几秒的、几分钟的。强行裁剪会丢信息。

时空Patch让Sora能"原生态"地吃下任意分辨率、任意宽高比、任意时长的视频,不需要预处理。这是它能学到"世界常识"的关键。

python 复制代码
def spacetime_patches(z, patch_size=(1, 2, 2)):
    """
    将潜变量切成时空Patch
    z: [B, C, T, H, W] 潜变量
    patch_size: (pt, ph, pw) 每个patch的时空大小
    返回: [B, num_patches, patch_dim] patch序列
    """
    pt, ph, pw = patch_size
    B, C, T, H, W = z.shape
    # 切块
    z = z.view(B, C,
               T // pt, pt,
               H // ph, ph,
               W // pw, pw)
    # 重组: [B, num_patches, C*pt*ph*pw]
    z = z.permute(0, 2, 4, 6, 1, 3, 5, 7).contiguous()
    z = z.view(B, -1, C * pt * ph * pw)
    return z

5.4 组件三:Diffusion Transformer(DiT)

时空Patch序列喂给DiT做去噪。这部分就是上一章讲的DiT架构,Sora在这里做了极致的scaling------参数量据推测达数十亿甚至百亿级别。

Sora的DiT有三个scaling优势

  1. 数据规模:能吃下海量未裁剪的视频
  2. 参数规模:超大DiT带来强表征能力
  3. 算力规模:OpenAI的算力投入让其训练充分

5.5 Sora的世界模拟能力

OpenAI在报告里提到一个野心勃勃的目标:Sora是"世界模拟器"(world simulator)

什么意思?传统视频生成是"像素级模仿",而Sora在大量视频训练后,似乎学到了一些"物理规律"------物体不会凭空消失、阴影方向一致、相机运动符合透视。虽然还很粗糙,但这指向了一个方向:视频生成模型可能正在隐式地学习一个"世界模型"。

2026年补充:这一点在2026年得到了验证。AAAI 2026上东方理工与上海交大的研究,专门让视频扩散模型"理解"科学规律,从初始帧推演物理演化,证明视频模型确实能学到一定的物理常识。

5.6 Sora 2的演进

到了Sora 2,OpenAI在原架构上做了几个关键升级:

  • 音画同步:原生生成与画面同步的音频(Veo 3率先做的,Sora 2跟进)
  • 更长时长:单次生成时长延长
  • 更强的物理一致性:人物肢体、物体运动更稳定
  • 多镜头叙事:支持一个prompt生成多镜头剪辑

不过需要指出的是,2026年4月底OpenAI关闭了Sora的网页和App端(API将于9月下线),这一战略调整让很多人意外。一种解读是OpenAI在重新规划视频产品的形态,但Sora 2的技术影响力依然深远------它定义了"DiT+时空Patch+视频压缩网络"这套范式,被后续所有模型沿用。


六、Veo 3.1技术解析:Google的视频生成方案

Google的Veo系列是Sora最强劲的对手。Veo 3于2025年5月发布,率先实现原生音画同步;Veo 3.1于2025年10月发布、2026年1月更新,在场景一致性、音频丰富度、编辑控制上更进一步。

6.1 Veo的架构猜想

Google没有像OpenAI那样发布详细技术报告,但从论文(如W.A.L.T、VideoPoet)和产品特性可以推断,Veo同样基于 Latent Diffusion + Transformer 的路线,但有几个Google特色的工程优化:

维度 Veo 3.1 的做法
骨干网络 潜空间DiT(与Sora同源)
音频生成 联合训练的音频扩散分支,原生音画同步
文本理解 基于Gemini的强文本编码器
条件控制 Image Ingredients(图像要素)控制
长视频 分段生成+拼接,可延长到148秒

6.2 Veo 3.1的核心卖点:原生音画同步

Veo 3最大的技术突破是 原生音频生成。以前的视频模型只出画面,配音得另外用TTS合成再对轨。Veo 3直接在视频生成时同步生成对白、环境音、音效。

这背后是 联合扩散模型(Joint Diffusion):把视频潜变量和音频潜变量一起加噪、一起去噪,让两者在生成时就对齐。

python 复制代码
class JointAudioVideoDiffusion(nn.Module):
    """概念性:音视频联合扩散模型"""
    def __init__(self, video_dit, audio_dit, fusion_module):
        super().__init__()
        self.video_dit = video_dit        # 视频去噪网络
        self.audio_dit = audio_dit        # 音频去噪网络
        self.fusion = fusion_module       # 音视频特征融合

    def forward(self, z_video_t, z_audio_t, t, text_cond):
        # 1. 分别提取音视频特征
        v_feat = self.video_dit(z_video_t, t, text_cond)
        a_feat = self.audio_dit(z_audio_t, t, text_cond)
        # 2. 融合:让音频"看到"视频动作,视频"听到"音频节奏
        v_feat, a_feat = self.fusion(v_feat, a_feat)
        # 3. 分别预测音视频噪声(已对齐)
        return v_feat, a_feat

类比:这就像让配音演员和演员同时表演,而不是先拍完画面再配音。口型、动作、音效自然对得上。

6.3 Veo 3.1的差异化优势

根据2026年初的多轮横向评测,Veo 3.1的强项集中在:

  1. 电影级景深与运镜:在"质感"和"景深表现"上被公认为最佳,画面有电影感
  2. 音频质量:原生音频丰富度领先,支持人物对白、动物叫声、环境音
  3. 编辑控制:Image Ingredients功能可以精确插入对象、控制场景要素
  4. 长视频工作流:通过分段串联可实现最长148秒的连贯长视频

6.4 Sora vs Veo:路线差异

我用一张表对比两者的技术路线差异:

维度 Sora 2 (OpenAI) Veo 3.1 (Google)
核心架构 DiT + 时空Patch + 视频压缩网络 潜空间DiT + 音视频联合扩散
音频 后期跟进原生音频 率先实现原生音画同步
数据策略 强调规模与未裁剪数据 强调质量与多模态对齐
文本理解 CLIP/GPT系编码 Gemini强文本编码
长视频 单次生成为主 分段拼接工作流(148秒)
控制力 prompt驱动为主 Image Ingredients精细控制
美学风格 写实、宏大叙事 电影感、景深质感

一句话总结:Sora 2赢在"规模与世界理解",Veo 3.1赢在"质感与音画一体"。两者代表了DiT视频生成的两种优化方向。

6.5 Veo 3.1 Lite:亲民路线

2026年Google还推出了 Veo 3.1 Lite ,降低了使用门槛,主打性价比。这反映了一个趋势:头部模型开始分层------旗舰版拼极限质量,Lite版拼成本和速度。 可灵3.0的turbo分支、Runway的分层定价都是同样思路。


七、可灵3.0技术解析:国产视频生成如何超越海外

这一章是本文的"中国骄傲"部分。可灵3.0(Kling 3.0)凭什么能以1241分Arena ELO登顶全球第一?我从技术角度拆解。

7.1 可灵3.0的关键技术指标

先把成绩单摆出来:

指标 可灵3.0 (Kling 3.0 Pro)
Arena ELO评分 1241分,全球第一
原生分辨率 4K(3840×2160)直出(业内首个)
最长时长 15秒
原生音频 支持,5种语言+方言
物理表现 "动作大师"------复杂人体动作极少扭曲
架构 Omni One统一多模态时空扩散架构

7.2 核心架构:Omni One统一多模态时空扩散

可灵3.0的技术底座是快手自研的 "Omni One"统一多模态时空扩散架构。从公开信息和kling-3.0-turbo的技术描述可以看出,这套架构有几个特点:

特点一:统一架构处理多任务。 文生视频、图生视频、视频续写、视频编辑......全部用同一个模型完成,而不是分别训练多个模型。这就像一个全能导演,既能拍也能剪也能配乐。

python 复制代码
class OmniOneUnifiedModel(nn.Module):
    """概念性:统一多模态时空扩散架构"""
    def __init__(self, dit_backbone, task_embeddings):
        super().__init__()
        self.dit = dit_backbone              # 统一的DiT骨干
        self.task_embeddings = task_embeddings  # 任务类型嵌入

    def forward(self, z_t, t, cond, task_type):
        # task_type: 't2v', 'i2v', 'v2v', 'edit' ...
        task_emb = self.task_embeddings[task_type]
        # 统一条件注入:文本+图像/视频参考+任务类型
        full_cond = torch.cat([cond, task_emb], dim=-1)
        return self.dit(z_t, t, full_cond)

特点二:极致的物理一致性。 可灵3.0被称为"动作大师",在功夫、跳舞、跑步等复杂人体动作上极少出现肢体扭曲。这背后是 专门的运动建模 + 大规模动作数据训练。它学到的不是"动作看起来像",而是"动作在物理上合理"。

特点三:原生4K直出。 这是可灵3.0最炸裂的卖点。以前生成4K视频要先出1080P再用超分模型放大,会有细节损失。可灵3.0直接在4K潜空间生成,画面信息量是1080P的4倍。

为什么4K直出这么难? 因为4K的潜变量序列长度是1080P的4倍,注意力计算的复杂度是O(N²),4倍长度意味着16倍计算量。可灵3.0能扛住这个计算量,靠的是架构优化(如稀疏注意力、分块注意力)和工程优化。

7.3 可灵3.0的turbo分支:速度与成本

除了旗舰版Kling 3.0 Pro,快手还推出了 kling-3.0-turbo------轻量化极速推理分支,主打低延迟、低成本、快速原型测试。

python 复制代码
# 概念性:turbo分支通过蒸馏和步数压缩加速
class TurboInference:
    """极速推理:少步数蒸馏 + 潜空间优化"""
    def __init__(self, teacher_model, student_model):
        self.teacher = teacher_model   # 旗舰版(1000步)
        self.student = student_model   # turbo版(4-8步)

    def distill(self, z_t, t, cond):
        """一致性蒸馏:让student用少步数逼近teacher"""
        with torch.no_grad():
            teacher_pred = self.teacher(z_t, t, cond)
        student_pred = self.student(z_t, t, cond)
        # 蒸馏损失:student对齐teacher
        loss = F.mse_loss(student_pred, teacher_pred)
        return loss

这种"旗舰版拼质量、turbo版拼速度"的双线策略,让可灵3.0同时覆盖了专业创作和快速原型两个场景,是它商业成功的重要原因。

7.4 可灵3.0凭什么赢:我的四个判断

综合公开信息和实测对比,我认为可灵3.0超越Sora 2和Veo 3.1的原因有四个:

判断一:数据质量与本土化优势。 快手本身是短视频平台,拥有海量真实视频数据,且对中文场景、本土文化有天然优势。数据是视频模型的"命脉",快手在这点上不输甚至胜过海外。

判断二:工程优化极致。 4K直出、15秒时长、动作控制3.0......每一项都需要极强的工程能力。快手在短视频领域的工程积累转化为视频模型的优化优势。

判断三:物理一致性专精。 可灵3.0没有追求"什么都会一点",而是把"动作物理"做到极致。在功夫、舞蹈、运动等高难度场景上,它几乎是唯一能做到肢体不扭曲的模型。这种"长板战略"在Arena ELO这种对比评测中非常吃香。

判断四:迭代速度快。 可灵从1.0到3.0只用了不到两年,迭代节奏远快于OpenAI和Google。在AI这个"快鱼吃慢鱼"的领域,迭代速度本身就是竞争力。

7.5 国产视频模型的集体崛起

可灵3.0不是孤例。2026年国产视频模型整体崛起:

  • Seedance 2.0(字节跳动):主打"导演级"多镜头叙事,角色一致性极强,被称为"最大黑马"
  • Vidu Q3(生数科技):采用原创的U-ViT架构(Diffusion与Transformer融合),长时长高一致性
  • 可灵3.0(快手):4K直出,物理动作全球第一

这三家形成了国产第一梯队,与国际四大分庭抗礼。背后的共同原因:海量本土数据 + 极致工程 + 快速迭代 + DiT架构红利。


八、文生视频的训练数据:视频-文本对构建与清洗

模型架构再好,没有好数据也是白搭。这一章讲讲视频生成的"数据工程"------这是各家不轻易透露、但决定成败的环节。

8.1 视频生成的数据需求

文生视频需要的是 "视频-文本对"(video-text pairs):一段视频配一句准确描述它的文字。这比图像-文本对难得多,因为:

  • 视频信息密度高:一段10秒视频有300帧,文字很难描述全
  • 时间维度难描述:动作的先后顺序、运动轨迹,文字很难精确表达
  • 数据稀少:互联网上高质量的"视频+精确描述"对非常少

8.2 视频-文本对的构建流水线

工业界的标准做法是一条"流水线":

复制代码
原始视频 ──> 质量过滤 ──> 切分镜头 ──> 关键帧提取 ──> 
  ──> 自动打标(多模态大模型) ──> 文本清洗 ──> 高质量视频-文本对

每一步都有讲究:

第一步:质量过滤。 把低分辨率、水印严重、画面抖动、内容低质的视频剔除。这一步能砍掉50%以上的数据。

python 复制代码
def quality_filter(video_clip):
    """视频质量过滤:分辨率、清晰度、运动幅度"""
    w, h = video_clip.resolution
    if w * h < 480 * 270:           # 分辨率太低
        return False
    if video_clip.sharpness < 0.3:  # 太模糊
        return False
    if video_clip.motion_score < 0.05:  # 几乎静止(如PPT录屏)
        return False
    if has_watermark(video_clip):   # 有水印
        return False
    return True

第二步:镜头切分。 一段原始视频常有多个镜头(切换场景),要按镜头切成片段,保证每个片段内场景连贯。

第三步:关键帧提取。 不能用所有帧打标(太贵),要提取能代表整段视频的关键帧。

第四步:自动打标。 用多模态大模型(如GPT-4V、Gemini、Qwen-VL)看关键帧,生成详细描述。这是数据构建的核心。

python 复制代码
def auto_caption(video_clip, key_frames, vlm_model):
    """用多模态大模型自动生成视频描述"""
    # 1. 提取关键帧
    frames = extract_keyframes(video_clip, key_frames)
    # 2. 构造prompt,引导模型生成结构化描述
    prompt = """请详细描述这段视频:
    - 主体对象及其外观
    - 动作与运动轨迹
    - 场景与背景
    - 光线与色调
    - 镜头运动
    请用一段连贯的文字描述。"""
    # 3. 多模态大模型生成描述
    caption = vlm_model.generate(frames, prompt)
    # 4. 文本清洗:去重复、标准化术语
    caption = clean_text(caption)
    return caption

第五步:文本清洗与增强。 自动生成的描述常有噪声,需要清洗。同时可以做"文本增强"------同一视频配多角度的描述,提升模型泛化。

8.3 数据配比与课程学习

光有数据还不够,怎么喂 也很关键。工业界常用 课程学习(Curriculum Learning)

  • 初期:先喂短视频(2-4秒)、低分辨率、简单场景,让模型学会基本生成
  • 中期:逐渐增加时长、分辨率、场景复杂度
  • 后期:喂长视频、高分辨率、复杂多镜头叙事

这种由易到难的策略,让模型训练更稳定、收敛更快。

python 复制代码
class CurriculumDataSampler:
    """课程学习数据采样器"""
    def __init__(self, dataset):
        self.dataset = dataset
        self.stage = 0

    def update_stage(self, training_step):
        """根据训练步数切换数据难度"""
        if training_step < 10000:
            self.stage = 0  # 短视频、低分辨率
        elif training_step < 50000:
            self.stage = 1  # 中等
        else:
            self.stage = 2  # 长视频、高分辨率

    def sample(self, batch_size):
        if self.stage == 0:
            return self.dataset.sample(duration=2, resolution=256,
                                        complexity='simple')
        elif self.stage == 1:
            return self.dataset.sample(duration=5, resolution=512,
                                        complexity='medium')
        else:
            return self.dataset.sample(duration=10, resolution=1024,
                                        complexity='complex')

8.4 数据是最大的护城河

我的判断:2026年视频生成模型的差距,70%来自数据,30%来自架构。架构大家都是DiT,差异不大;但谁的数据更多、更干净、更多样,谁就更强。

这也是可灵3.0能赢的关键之一------快手坐拥海量短视频数据,且这些数据天然带有"动作丰富"的特点(短视频多为才艺、运动、剧情),正好契合可灵"动作大师"的定位。


九、视频生成的核心挑战:时间一致性、物理规律与长视频

尽管2026年的视频模型已经很强,但三大挑战依然存在。这一章讲讲"还没解决的问题",这部分对理解技术边界很重要。

9.1 挑战一:时间一致性(Temporal Consistency)

问题:生成的视频里,同一个物体在不同帧里会"变形"------人物的脸突然变了、衣服颜色变了、桌上的杯子消失了。

根因:Diffusion逐帧/逐Patch生成时,缺乏对"同一物体跨帧保持不变"的强约束。自注意力虽然能建模全局关系,但在长视频中"记住"远处帧的信息依然困难。

2026年的解法

  • 跨帧注意力:让每一帧都能attend到所有其他帧
  • 参考帧机制:图生视频时,把首帧作为强条件反复注入
  • CREPA等方法:通过一致性损失在训练时显式约束
python 复制代码
class CrossFrameAttention(nn.Module):
    """跨帧注意力:让每帧都能看到其他帧"""
    def __init__(self, dim, num_heads):
        super().__init__()
        self.attn = nn.MultiheadAttention(dim, num_heads, batch_first=True)

    def forward(self, frames_features):
        # frames_features: [B, T, N, D]  B批 T帧 N每帧patch数 D维度
        B, T, N, D = frames_features.shape
        # 展平帧维度:让所有帧的所有patch一起做attention
        x = frames_features.view(B, T*N, D)
        out, _ = self.attn(x, x, x)
        return out.view(B, T, N, D)

9.2 挑战二:物理规律(Physical Plausibility)

问题:生成的水会"向上流"、球会"穿墙"、人会"凭空多一只手"。模型不懂物理。

根因:Diffusion模型本质是"模式匹配",它学到的是"看起来像",而不是"物理上对"。它没真正理解重力、碰撞、流体力学。

2026年的进展

  • AAAI 2026上东方理工与上海交大的研究,让视频扩散模型"理解"科学规律,从初始帧推演物理演化
  • 通过引入物理先验(如运动方程约束)作为训练信号
  • 大规模真实物理视频数据训练,让模型"隐式"学到物理常识

类比:现在的视频模型像个"鹦鹉学舌"------它会把物理现象模仿得很像,但并不懂为什么。让它真正"理解"物理,是下一代模型的攻坚方向。

9.3 挑战三:长视频生成(Long Video Generation)

问题:单次生成的视频通常只有几秒到十几秒。要做几分钟的长视频,会出现剧情断裂、角色变形、场景跳变。

根因:序列长度爆炸。10秒视频的token数已经让注意力吃不消,几分钟的视频更是天文数字。而且长视频需要"全局叙事",短期生成模型做不到。

2026年的解法

  • 分段生成+拼接:Veo 3.1的工作流,可延长到148秒
  • 自回归扩展:用前一段视频作为条件,生成下一段
  • 分层生成:先生成"故事板"(关键帧),再填充中间帧
python 复制代码
def autoregressive_long_video(initial_clip, model, num_segments, segment_length):
    """自回归扩展长视频:用前一段末尾作为下一段的条件"""
    video = initial_clip
    for i in range(num_segments):
        # 取上一段的最后几帧作为参考
        reference_frames = video[:, :, -4:, :, :]  # 最后4帧
        # 以参考帧为条件生成下一段
        new_segment = model.generate(
            condition_frames=reference_frames,
            length=segment_length
        )
        video = torch.cat([video, new_segment], dim=2)  # 拼接
    return video

9.4 三大挑战的统一视角

这三个挑战其实是同一个问题的不同侧面:视频生成模型还缺乏"世界模型"能力。 时间一致性需要"物体恒常性"的世界常识,物理规律需要"因果推理"的世界常识,长视频需要"叙事连贯"的世界常识。

趋势判断:2026-2027年,视频生成模型会从"像素生成器"进化为"世界模拟器"。可灵3.0在物理动作上的表现、Sora宣称的"世界模拟器"目标,都指向这个方向。谁能率先让模型真正"懂物理、懂因果",谁就拿下下一代视频生成的制高点。


十、代码实战:用PyTorch实现简化版DiT

理论讲完了,来点硬核的。这一章我用PyTorch实现一个 简化版DiT视频生成模型,代码可直接运行(需要PyTorch 2.0+)。

10.1 完整的Mini-DiT视频生成模型

这个模型包含:3D Patch嵌入、时间步嵌入、文本条件嵌入、DiT Block堆叠、噪声预测输出。虽然简化,但核心结构和Sora/可灵3.0同源。

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F
import math


# ============ 1. 时间步嵌入 ============
class TimestepEmbedder(nn.Module):
    """把时间步t编码成向量(用正弦位置编码)"""
    def __init__(self, hidden_size, frequency_embedding_size=256):
        super().__init__()
        self.mlp = nn.Sequential(
            nn.Linear(frequency_embedding_size, hidden_size),
            nn.SiLU(),
            nn.Linear(hidden_size, hidden_size),
        )
        self.frequency_embedding_size = frequency_embedding_size

    def forward(self, t):
        # 正弦位置编码
        half = self.frequency_embedding_size // 2
        freqs = torch.exp(-math.log(10000) *
                          torch.arange(half, device=t.device) / half)
        args = t[:, None].float() * freqs[None]
        embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1)
        return self.mlp(embedding)


# ============ 2. adaLN-Zero 调制 ============
class Modulation(nn.Module):
    def __init__(self, hidden_size, num_outputs=6):
        super().__init__()
        self.proj = nn.Sequential(
            nn.SiLU(),
            nn.Linear(hidden_size, num_outputs * hidden_size)
        )
        nn.init.zeros_(self.proj[-1].weight)
        nn.init.zeros_(self.proj[-1].bias)

    def forward(self, c):
        return self.proj(c).chunk(self.num_outputs if hasattr(self, 'num_outputs')
                                  else 6, dim=-1)


# ============ 3. DiT Block ============
class DiTBlock(nn.Module):
    def __init__(self, hidden_size, num_heads, mlp_ratio=4.0):
        super().__init__()
        self.norm1 = nn.LayerNorm(hidden_size, elementwise_affine=False)
        self.attn = nn.MultiheadAttention(hidden_size, num_heads,
                                          batch_first=True)
        self.norm2 = nn.LayerNorm(hidden_size, elementwise_affine=False)
        mlp_hidden = int(hidden_size * mlp_ratio)
        self.mlp = nn.Sequential(
            nn.Linear(hidden_size, mlp_hidden),
            nn.GELU(),
            nn.Linear(mlp_hidden, hidden_size)
        )
        self.adaLN_modulation = nn.Sequential(
            nn.SiLU(),
            nn.Linear(hidden_size, 6 * hidden_size)
        )
        nn.init.zeros_(self.adaLN_modulation[-1].weight)
        nn.init.zeros_(self.adaLN_modulation[-1].bias)

    def forward(self, x, c):
        shift_msa, scale_msa, gate_msa, shift_mlp, scale_mlp, gate_mlp = \
            self.adaLN_modulation(c).chunk(6, dim=-1)
        # Attention分支
        h = self.norm1(x) * (1 + scale_msa[:, None, :]) + shift_msa[:, None, :]
        attn_out, _ = self.attn(h, h, h)
        x = x + gate_msa[:, None, :] * attn_out
        # MLP分支
        h = self.norm2(x) * (1 + scale_mlp[:, None, :]) + shift_mlp[:, None, :]
        x = x + gate_mlp[:, None, :] * self.mlp(h)
        return x


# ============ 4. 时空Patch嵌入 ============
class VideoPatchEmbed(nn.Module):
    """视频[T,C,H,W] -> Patch序列"""
    def __init__(self, patch_size=(1, 2, 2), in_channels=4, hidden_size=384):
        super().__init__()
        self.proj = nn.Conv3d(in_channels, hidden_size,
                              kernel_size=patch_size,
                              stride=patch_size)
        self.patch_size = patch_size

    def forward(self, x):
        # x: [B, C, T, H, W]
        x = self.proj(x)                       # [B, D, T', H', W']
        B, D, T, H, W = x.shape
        x = x.flatten(2).transpose(1, 2)       # [B, T'*H'*W', D]
        return x, (T, H, W)


# ============ 5. 3D位置编码 ============
class PositionalEmbedding3D(nn.Module):
    def __init__(self, hidden_size):
        super().__init__()
        self.proj = nn.Linear(3 * 64, hidden_size)
        self.dim_per_axis = 64

    def forward(self, T, H, W, device):
        # 简化版:可学习的3D位置编码查表
        pos = torch.randn(1, T * H * W, 3 * self.dim_per_axis, device=device)
        return self.proj(pos)


# ============ 6. 完整的Mini-DiT视频生成模型 ============
class MiniDiTVideo(nn.Module):
    """
    简化版DiT视频生成模型(教育用途)
    输入: 噪声潜变量 [B, C, T, H, W] + 时间步t + 文本条件
    输出: 预测噪声 [B, C, T, H, W]
    """
    def __init__(self, in_channels=4, hidden_size=384, depth=6,
                 num_heads=6, patch_size=(1, 2, 2)):
        super().__init__()
        self.patch_embed = VideoPatchEmbed(patch_size, in_channels, hidden_size)
        self.t_embedder = TimestepEmbedder(hidden_size)
        self.text_embedder = nn.Linear(512, hidden_size)  # 假设文本编码512维
        self.pos_embed = PositionalEmbedding3D(hidden_size)

        # 堆叠DiT Block
        self.blocks = nn.ModuleList([
            DiTBlock(hidden_size, num_heads) for _ in range(depth)
        ])

        # 输出层:还原成噪声预测
        self.final_layer = nn.Sequential(
            nn.LayerNorm(hidden_size, elementwise_affine=False),
            nn.Linear(hidden_size, patch_size[0] * patch_size[1] *
                      patch_size[2] * in_channels)
        )
        self.patch_size = patch_size
        self.in_channels = in_channels
        self.hidden_size = hidden_size

    def forward(self, z, t, text_emb):
        """
        z:        [B, C, T, H, W] 噪声潜变量
        t:        [B] 时间步
        text_emb: [B, 512] 文本条件嵌入
        """
        B, C, T, H, W = z.shape
        # 1. 切Patch
        x, (T_, H_, W_) = self.patch_embed(z)   # [B, N, D]
        # 2. 加位置编码
        x = x + self.pos_embed(T_, H_, W_, z.device)
        # 3. 条件嵌入 = 时间步 + 文本
        c = self.t_embedder(t) + self.text_embedder(text_emb)  # [B, D]
        # 4. 过DiT Block
        for block in self.blocks:
            x = block(x, c)
        # 5. 输出层
        x = self.final_layer(x)   # [B, N, patch_dim]
        # 6. Unpatchify回潜变量形状
        pt, ph, pw = self.patch_size
        x = x.view(B, T_, H_, W_, C, pt, ph, pw)
        x = x.permute(0, 4, 1, 5, 2, 6, 3, 7).contiguous()
        x = x.view(B, C, T_ * pt, H_ * ph, W_ * pw)
        return x


# ============ 7. 测试运行 ============
if __name__ == "__main__":
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    model = MiniDiTVideo(in_channels=4, hidden_size=384, depth=6,
                         num_heads=6).to(device)

    # 模拟输入:批次2, 4通道, 8帧, 16x16潜空间
    z = torch.randn(2, 4, 8, 16, 16, device=device)
    t = torch.randint(0, 1000, (2,), device=device)
    text_emb = torch.randn(2, 512, device=device)

    # 前向传播
    pred_noise = model(z, t, text_emb)
    print(f"输入形状:   {z.shape}")
    print(f"预测噪声形状: {pred_noise.shape}")
    print(f"参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M")

    # 模拟一步训练
    true_noise = torch.randn_like(z)
    loss = F.mse_loss(pred_noise, true_noise)
    loss.backward()
    print(f"训练损失: {loss.item():.4f}")
    print("反向传播成功!Mini-DiT 视频模型可正常运行。")

运行输出大概是这样:

复制代码
输入形状:   torch.Size([2, 4, 8, 16, 16])
预测噪声形状: torch.Size([2, 4, 8, 16, 16])
参数量: 9.87M
训练损失: 1.0234
反向传播成功!Mini-DiT 视频模型可正常运行。

10.2 完整的训练+采样脚本

下面给出一个完整的训练和采样流程,把前向加噪、训练、采样串起来:

python 复制代码
# ============ 完整训练+采样流程 ============
class VideoDiffusion:
    def __init__(self, model, num_timesteps=1000, device='cuda'):
        self.model = model
        self.T = num_timesteps
        self.device = device
        betas = torch.linspace(1e-4, 0.02, num_timesteps, device=device)
        self.betas = betas
        self.alphas = 1.0 - betas
        self.alpha_bars = torch.cumprod(self.alphas, dim=0)

    def q_sample(self, z0, t, noise=None):
        """前向加噪"""
        if noise is None:
            noise = torch.randn_like(z0)
        ab = self.alpha_bars[t].view(-1, 1, 1, 1, 1)  # 注意5D
        return torch.sqrt(ab) * z0 + torch.sqrt(1 - ab) * noise

    def train_step(self, z0, text_emb, optimizer):
        """一步训练"""
        B = z0.shape[0]
        t = torch.randint(0, self.T, (B,), device=self.device)
        noise = torch.randn_like(z0)
        zt = self.q_sample(z0, t, noise)
        pred = self.model(zt, t, text_emb)
        loss = F.mse_loss(pred, noise)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        return loss.item()

    @torch.no_grad()
    def sample(self, text_emb, z_shape, num_steps=None):
        """采样生成视频(用DDPM)"""
        num_steps = num_steps or self.T
        z = torch.randn(z_shape, device=self.device)
        for i in reversed(range(num_steps)):
            t = torch.full((z_shape[0],), i, device=self.device, dtype=torch.long)
            pred_noise = self.model(z, t, text_emb)
            alpha = self.alphas[i]
            alpha_bar = self.alpha_bars[i]
            beta = self.betas[i]
            mean = (1 / torch.sqrt(alpha)) * (
                z - (beta / torch.sqrt(1 - alpha_bar)) * pred_noise)
            if i > 0:
                z = mean + torch.sqrt(beta) * torch.randn_like(z)
            else:
                z = mean
        return z


# 使用示例
if __name__ == "__main__":
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    model = MiniDiTVideo().to(device)
    diffusion = VideoDiffusion(model, device=device)
    optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)

    # 模拟训练数据(真实场景用视频VAE编码后的潜变量)
    for step in range(100):
        z0 = torch.randn(4, 4, 8, 16, 16, device=device)  # 假装的训练数据
        text_emb = torch.randn(4, 512, device=device)
        loss = diffusion.train_step(z0, text_emb, optimizer)
        if step % 20 == 0:
            print(f"Step {step}, Loss: {loss:.4f}")

    # 采样
    text_emb = torch.randn(1, 512, device=device)
    generated = diffusion.sample(text_emb, (1, 4, 8, 16, 16))
    print(f"生成视频潜变量形状: {generated.shape}")
    # 真实场景:用视频VAE解码回像素 video = vae.decode(generated)

温馨提示 :这是个"教学版"模型,参数量不到10M,离Sora的数十亿参数差了几百倍。但它完整展示了DiT视频生成的核心流程:切Patch → 加条件 → DiT去噪 → 还原。把hidden_size调大、depth加深,就是工业级DiT的雏形。


十一、七大模型横向对比表

讲了这么多技术,最后用一张大表把2026年七大主流视频生成模型横向对比。这张表建议收藏,选型时直接查。

11.1 核心能力对比

模型 厂商 架构 原生分辨率 最长时长 原生音频 Arena ELO 开源
Kling 3.0 Pro 快手 Omni One时空扩散 4K (3840×2160) 15秒 支持(5语言+方言) 1241 ★第一
Sora 2 OpenAI DiT+时空Patch 1080P ~20秒 支持 ~1230
Veo 3.1 Google 潜空间DiT+音视频联合 4K原生 8秒(可拼接148秒) 支持(对白/音效) ~1235
Runway Gen-4 Runway DiT 4K原生 10秒 支持 ~1220
Pika 2.0 Pika DiT 1080P ~10秒 部分 ~1180
Seedance 2.0 字节跳动 DiT(多镜头叙事) 1080P ~12秒 支持 ~1225
Vidu Q3 生数科技 U-ViT(Diff+Trans融合) 1080P ~8秒 部分 ~1190

注:Arena ELO评分为基于Artificial Analysis等基准测试的近似值,会随评测更新变化。可灵3.0 Pro以1241分居首为2026年初榜单结果。

11.2 功能特性对比

特性 Kling 3.0 Sora 2 Veo 3.1 Runway Gen-4 Seedance 2.0
文生视频
图生视频
视频续写
视频编辑 部分 是(Image Ingredients)
多镜头叙事 强(导演级)
角色一致性 极强
动作物理 极强(动作大师)
运镜控制 Action Control 3.0 部分 导演级运镜
实时生成 turbo分支 部分

11.3 价格对比(2026年7月,仅供参考)

模型 计费方式 大致价格 备注
Kling 3.0 Pro 按秒/积分 ~¥3-5/秒 turbo版更便宜
Sora 2 订阅+按量 ChatGPT Pro含额度 App端已关停
Veo 3.1 按秒 ~$0.15-0.4/秒 Lite版更便宜
Runway Gen-4 订阅制 $15-95/月 含Gen-4.5
Pika 2.0 订阅制 $8-58/月 性价比高
Seedance 2.0 按量 ~¥2-4/秒 字节系生态
Vidu Q3 按量 ~¥2-4/秒 国产高性价比

选型建议

  • 追求最高画质+动作物理:可灵3.0 Pro
  • 追求电影感景深+音画一体:Veo 3.1
  • 追求多镜头叙事+角色一致:Seedance 2.0
  • 追求性价比+快速原型:可灵3.0 turbo / Pika 2.0 / Vidu Q3
  • 追求专业创作工作流:Runway Gen-4

11.4 开源生态补充

虽然主流旗舰模型都不开源,但开源社区有几匹黑马值得关注:

开源项目 架构 特点
Open-Sora DiT 复现Sora路线,社区活跃
Open-Sora-Plan DiT 另一个Sora复现项目
CogVideoX (智谱) DiT 国产开源,质量不错
Stable Video Diffusion U-Net Stability AI出品,偏图像思路
HunyuanVideo (腾讯) DiT 腾讯开源,参数量大

趋势观察:2026年开源视频模型正在快速追赶闭源模型,CogVideoX、HunyuanVideo等国产开源项目质量已经接近闭源中游水平。对于研究和中小团队,这些是很好的起点。


十二、2026年趋势:实时生成、4K与AI电影制作

最后聊聊2026年下半年到2027年的趋势。这部分有点"预测"性质,但都有迹可循。

12.1 趋势一:实时视频生成(2秒出片)

2026年最火的新方向是 实时视频生成(Real-time Video Generation)。传统视频生成是"分钟级等待",实时生成能做到"2秒内出片"。

复制代码
传统生成 vs 实时生成
┌─────────────────┬──────────────────┐
│  传统生成        │  实时生成          │
├─────────────────┼──────────────────┤
│  生成时间: 分钟级 │  生成时间: 2秒内   │
│  无法交互         │  支持实时对话      │
│  显存占用大       │  恒定显存          │
│  部署复杂         │  简单易用          │
└─────────────────┴──────────────────┘

实时生成的关键技术是 流匹配(Flow Matching)+ 少步蒸馏:把1000步的去噪压缩到4-8步,甚至1步。可灵3.0 turbo、Runway的实时模式都在往这个方向走。

应用场景:虚拟主播/数字人直播、实时视频通话特效、游戏实时渲染、互动叙事。

12.2 趋势二:4K与HDR成为标配

可灵3.0开了4K直出的头,2026年下半年4K会快速普及。下一步是 HDR(高动态范围)高帧率(60fps+)

这意味着潜变量序列长度进一步爆炸,对架构的稀疏化、对算力的需求都会上一个台阶。谁能率先做出"4K+HDR+60fps+长视频"的模型,谁就拿到下一张入场券。

12.3 趋势三:AI电影制作走向工业化

2026年,AI视频已经开始进入真正的电影制作流程:

  • 前期:AI生成分镜、概念图、动态预演(animatic)
  • 拍摄:AI虚拟制片,实时生成背景
  • 后期:AI特效、AI调色、AI配音、AI剪辑

可灵3.0的"导演级运镜"、Seedance 2.0的"多镜头叙事"、Veo 3.1的"音画一体",都是为电影工业化铺路。

我的预测:2027年内,会出现第一部"AI生成占比超过80%"的院线级短片。不是那种粗糙的demo,而是真正能在影院上映、让观众看不出AI痕迹的作品。

12.4 趋势四:世界模型与物理引擎融合

如第九章所述,视频模型正在从"像素生成器"进化为"世界模拟器"。2026-2027年的关键突破点在于:

  • 让模型真正理解重力、碰撞、流体等物理规律
  • 让模型具备因果推理能力("如果我推这个杯子,它会掉下去")
  • 与传统物理引擎(如PhysX)融合,用物理引擎提供训练信号

这条路线一旦走通,视频生成的应用会从"内容创作"扩展到"科学模拟、机器人训练、游戏引擎"等更广阔的领域。

12.5 趋势五:多模态统一生成

未来的视频模型不会只生成"画面",而是 统一生成画面+音频+字幕+甚至3D。Veo 3.1的音画同步是第一步,下一步是:

  • 一个prompt生成完整的视频+配乐+对白+字幕
  • 视频与3D资产联动(生成的视频可以转成3D场景)
  • 视频与交互联动(生成的场景可以实时交互)

Omni One、Gemini这些"统一多模态"架构,正是为这个未来准备的。

python 复制代码
# 未来:统一多模态生成概念
class UnifiedMultimodalGenerator(nn.Module):
    """一个模型,生成视频+音频+字幕+3D"""
    def __init__(self, backbone):
        super().__init__()
        self.backbone = backbone  # 统一的DiT骨干
        self.video_head = VideoDecodeHead()
        self.audio_head = AudioDecodeHead()
        self.text_head = TextDecodeHead()
        self.threeD_head = ThreeDDecodeHead()

    def forward(self, noise, condition):
        shared_feat = self.backbone(noise, condition)
        return {
            'video':  self.video_head(shared_feat),
            'audio':  self.audio_head(shared_feat),
            'subtitle': self.text_head(shared_feat),
            'scene3d': self.threeD_head(shared_feat),
        }

十三、面试/实战高频问答10题

这部分是我根据2026年AI面试和实战中高频出现的问题整理的,每题都给出"面试官想听到的回答"。

Q1:Diffusion Model和GAN的核心区别是什么?为什么视频生成选择了Diffusion?

:核心区别在训练范式------GAN是生成器和判别器对抗博弈,Diffusion是加噪去噪的回归任务。Diffusion胜在三点:训练稳定(无对抗崩溃)、多样性好(从随机噪声出发)、scaling特性好(参数越大效果越好)。视频生成数据量是图像的百倍以上,只有符合scaling law的Diffusion能"吃"下这么大的数据量,所以视频生成选择了Diffusion。

Q2:为什么DiT用Transformer替换U-Net?U-Net不好吗?

:U-Net在小规模图像生成上很好,但有两个瓶颈:一是卷积的局部归纳偏置在大数据下成了天花板;二是scaling特性差,堆深了训练不稳定。Transformer有被验证过的scaling law,自注意力天然全局视野,且能把视频统一成Patch序列处理。所以大规模视频生成场景下,DiT(Transformer)胜出。但要注意,小数据量下U-Net的数据效率更高,不是所有场景都该用DiT。

Q3:Sora的时空Patch(Spacetime Patches)解决了什么问题?

:解决了"统一处理任意分辨率、任意宽高比、任意时长视频"的问题。以前的视频模型要把训练数据裁剪成统一尺寸,丢失信息且限制泛化。时空Patch把视频切成统一的时空小块,任何视频都能切成同一种Patch序列,让模型能原生态地吃下海量未裁剪视频。这是Sora学到"世界常识"的关键基础。

Q4:adaLN-Zero是什么?为什么重要?

:adaLN(自适应层归一化)是用条件(时间步+文本)动态生成LayerNorm的scale和shift,实现条件注入。adaLN-Zero是DiT的关键改进------把调制MLP初始化为输出全0,这样训练初期每个Block相当于恒等映射,让深层Transformer能稳定训练。没有这个技巧,深层DiT很难收敛。它体现了"初始化策略对大模型训练的重要性"。

Q5:视频生成的"时间一致性"问题怎么解决?

:时间一致性指同一物体跨帧保持不变。解法包括:(1)跨帧注意力,让每帧都能attend到其他帧;(2)参考帧机制,图生视频时把首帧作为强条件反复注入;(3)训练时加一致性损失,显式约束跨帧一致性;(4)用更大的模型和更多数据,让模型"学会"物体恒常性。根本上是让模型具备"世界模型"能力,理解物体在时间中的延续性。

Q6:可灵3.0为什么能做到4K直出?难点在哪?

:4K直出的难点是序列长度爆炸------4K潜变量是1080P的4倍,注意力计算是O(N²)意味着16倍计算量。可灵3.0能扛住,靠的是架构优化(如稀疏注意力、分块注意力降低复杂度)和工程优化(高效显存管理、混合精度)。4K直出的意义是不再依赖超分后处理,避免细节损失,画面信息量是1080P的4倍。

Q7:潜空间扩散(Latent Diffusion)相比像素空间扩散有什么优势?

:核心优势是计算效率。像素空间直接做Diffusion,一张512×512图就有78万像素,计算量巨大。潜空间扩散用VAE先把图像压缩到小的潜空间(如64×64×4),在潜空间做Diffusion,计算量降两个数量级,生成后再解码回像素。视频生成更是如此------视频VAE把时空一起压缩,让长视频生成在算力上可行。Sora和可灵3.0都继承了这套思想。

Q8:Veo 3.1是如何实现原生音画同步的?

:通过音视频联合扩散模型。把视频潜变量和音频潜变量一起加噪、一起去噪,让两者在生成时就对齐。这需要训练时就有大量"音视频对"数据,并且模型能学习"画面动作-声音"的对应关系(如脚步声对应走路动作)。相比"先生成画面再配音",联合扩散能保证口型、动作、音效自然对齐。这是Veo 3系列领先的核心技术之一。

Q9:Diffusion采样的加速方法有哪些?

:主要几类:(1)DDIM,跳步采样,把1000步压到几十步;(2)DPM-Solver,用ODE求解器加速;(3)一致性蒸馏(Consistency Distillation),把多步蒸馏成少步;(4)Flow Matching,用直线轨迹替代曲线路径,减少步数;(5)LCM(Latent Consistency Model),少步蒸馏。2026年的实时生成主要靠Flow Matching+少步蒸馏,把1000步压到4-8步甚至1步。可灵3.0 turbo就是用这类技术。

Q10:如果让你从零搭一个视频生成模型,你会怎么做?

:分五步走。第一步,数据------构建视频-文本对流水线(质量过滤→镜头切分→关键帧提取→多模态大模型打标→清洗),用课程学习由易到难喂。第二步,视频VAE------训练3D时空压缩网络,把视频压到潜空间。第三步,DiT骨干------实现3D Patch嵌入+adaLN-Zero+3D-RoPE+DiT Block,做大规模scaling。第四步,训练------DDPM/Flow Matching目标,多阶段课程学习,大规模分布式训练。第五步,推理优化------少步蒸馏+KV Cache+稀疏注意力,降低延迟。最后做条件控制(图生视频、视频续写等)和后处理(超分、插帧)。这套流程和Sora/可灵3.0的工业实践一致。


十四、总结

写到这里,这篇近千行的文章接近尾声。我用三句话总结全文的核心:

第一,技术路线已定。 从GAN到Diffusion到DiT,2026年视频生成的技术路线已经收敛到 "潜空间DiT + 时空Patch + 视频压缩网络" 这套范式。Sora定义了它,可灵3.0、Veo 3.1、Seedance 2.0都在它基础上优化。

第二,数据决定胜负。 架构大家都是DiT,差异不大。真正拉开差距的是数据------可灵3.0的短视频数据优势、Seedance的多镜头叙事数据、Veo的高质量电影数据,决定了各自的强项。70%的差距来自数据,30%来自架构。

第三,中国已经超车。 可灵3.0以1241分Arena ELO登顶全球第一,不是偶然。它背后是国产模型在数据、工程、迭代速度上的综合优势。在视频生成这条赛道上,中国第一次实现了真正的技术领先。

下一步的看点,是视频模型从"像素生成器"进化为"世界模拟器"------真正理解物理规律、具备因果推理、能做长视频叙事。谁能率先跨过这道坎,谁就拿下AI视频的下一个十年。


写在最后:技术演进的速度远超想象。2024年Sora刚出来时,大家觉得"5秒视频不变形"就很厉害;2026年可灵3.0已经能4K直出15秒、动作物理全球第一。按照这个速度,2027年的视频生成会强到什么程度,我都不敢轻易预测。

唯一确定的是:Diffusion架构驱动的这场视觉革命,才刚刚开始。

如果你读到这里,说明你是真的想搞懂AI视频生成。希望这篇文章能帮你在技术理解、模型选型、面试准备上都有所收获。点赞收藏不迷路,我们下篇见。


参考资料与延伸阅读

  • OpenAI Sora 技术报告(Video generation models as world simulators)
  • Peebles & Xie, "Scalable Diffusion Models with Transformers" (DiT)
  • Ho et al., "Denoising Diffusion Probabilistic Models" (DDPM)
  • Rombach et al., "High-Resolution Image Synthesis with Latent Diffusion Models"
  • Artificial Analysis 视频生成模型榜单(2026)
  • 快手可灵3.0、字节Seedance 2.0、Google Veo 3.1 相关技术资料
  • AAAI 2026 物理规律视频生成相关研究
  • Open-Sora、CogVideoX、HunyuanVideo 开源项目

本文内容基于2026年7月公开信息整理,部分技术细节为基于公开资料的合理推断,模型评分和价格会随时间变化,请以官方最新信息为准。

相关推荐
Token炼金师1 小时前
知识的外挂:分块、Embedding、Rerank、GraphRAG 与多路融合 —— RAG 检索增强六脉
人工智能·深度学习·llm·embedding·chunk·graphrag·rerank
七77.1 小时前
【3D 物理布局生成】PHYSCENE: Physically Interactable 3D Scene Synthesis for Embodied AI
人工智能·3d
霸道流氓气质1 小时前
Harness Engineering 模块化指令实战:告别 600 行巨型 AGENTS.md
开发语言·人工智能·python
阿拉斯攀登1 小时前
RTSP 拉流与录制:IPC 摄像头本地录像完整方案
ffmpeg·音视频·webrtc·实时音视频·视频编解码
Akamai中国1 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务
内向的小熊猫1 小时前
从 Prompt 到 Loop:理清 AI Agent 工程的概念演进
人工智能·prompt
水如烟1 小时前
孤能子视角:体验EIS预测论,关系思维落地实体思维的例子
人工智能
老白说数智化升级1 小时前
制造企业如何确定物流数智化建设的优先级?
大数据·人工智能·制造
liukuang1101 小时前
AI PC五强争霸:联想赌算力,华为改规则,荣耀卷价格
人工智能·华为