当 AI 短剧、漫剧、恋综、电影、虚拟艺人这些词频繁出现在内容行业讨论中时,容易被忽略的一点是:它们的底层技术已经不再是单纯的“AI 画图”,而是从剧本生成、分镜设计、角色一致性控制、语音合成、视频生成、剪辑到内容理解的一整条多模型工业化流水线。更值得开发者关注的是,当生成侧已经能稳定产出片段时,“AI 观众”这样一个看似概念化的方向,也会顺理成章地变成一套可落地的内容理解与反馈系统:把弹幕自动生成、剧情走向预测、舆情抽取、热度模拟等能力接入短剧创作闭环。

这篇文章从工程视角拆解两件事:一是 AI 短剧、漫剧这类视频内容是怎么从文本一路变成成片的,二是“AI 观众”到底是一套什么样的技术系统。适合正在做 AIGC 应用、短视频工具、内容中台,或者准备把大模型能力接入视频生产流程的开发者。读完你可以得到一条可复现的最小制作链路、一套 AI 观众反馈服务的参考架构,以及一批直接能用于排错的问题清单。

1. 先理解 AI 影视内容的生产范式

1.1 从“AI 生成一张图”到“AI 生成一部剧”

很多项目在早期只解决单点问题:写一个文案、生成一张海报、合成一段配音。但短剧、漫剧这类内容,本质上是一个完整叙事单元。一个三分钟的短剧片段,至少要同时解决以下问题:

  • 人物是谁、长什么样、穿什么衣服、在哪个场景里,镜头切换后不能变成另一个人。
  • 画面要动起来,运动幅度、镜头推进、人物转身都必须符合叙事节奏。
  • 旁白和对白要对应到正确的时间点,口型、字幕、画面三者同步。
  • 多个视频片段拼接后,色调、分辨率、转场、背景音乐要统一。

这些需求叠加在一起,就不再是“调用一次文生图”或者“调用一次文生视频”能解决的。它要求把多个模型按固定顺序编排起来,前一个环节的输出成为后一个环节的输入,中间还需要存储、校验、重试和物料管理。所以真正改变内容生产方式的,不是某一个模型突然变强,而是生成流程从“单次生成”变成“流水线编排”。

下面这张表可以快速看出两种生产范式的差别:

对比维度 单点生成 工业化生成链路
输入 一句提示词 剧本、分镜表、角色设定、风格设定
输出 一张图、一段视频、一段音频 一集短剧、一组可复用素材
核心问题 单帧质量 跨镜头一致性、音画同步、批量产出
技术重点 提示词 调度、缓存、任务队列、失败重试
失败代价 重新生成一次 需要定位到具体环节并单独修复

1.2 AI 观众并不是玄学,而是一套内容理解系统

“AI 观众”这个说法听起来很产品化,但落到技术层面,它是一套内容理解与反馈生成系统。它不直接生产画面,而是对已经生成的视频内容做语义理解,再模拟观众视角输出反馈。

一个最小可用的 AI 观众系统至少包含三个环节:

  1. 输入侧:从成片中提取字幕、抽帧、语音识别文本,把视频变成可供模型理解的文本和图像序列。
  2. 理解侧:使用多模态模型识别场景、人物关系、情绪变化、剧情冲突点。
  3. 输出侧:基于理解结果生成弹幕、评论、评分、留存预测或情绪曲线,并通过规则引擎过滤违规内容。

也就是说,AI 观众的核心能力是“看懂内容之后做出反馈”。它可以用于成片内测、剧本评审、宣发话题抽取、弹幕互动等场景。它模拟的是目标观众的注意力分布和情绪反应,并不能替代真实用户测试,但可以在创作早期快速发现节奏问题、剧情平淡段和话题爆发点。

2. AI 短剧制作链路的环境准备与技术选型

2.1 先明确开发环境和生产环境的差别

AI 短剧链路包含的环节很多,学习环境和生产环境的目标完全不同。学习阶段追求“最小闭环跑通”,可以不用考虑并发、成本、素材管理。生产环境则必须处理任务失败、资源占用、人工审核、内容标识等问题。

项目 学习环境 生产环境
模型来源 云端 API、开源模型本地推理 API 网关、模型服务化、多供应商切换
任务触发 单个脚本同步调用 消息队列异步执行,支持重试和幂等
素材存储 本地磁盘临时目录 对象存储,按项目/场景/版本组织
失败处理 报错后手动重跑 记录失败任务,定位环节后定点重试
审核机制 无 人工审片 + 自动敏感词过滤
生成标识 可忽略 必须标记 AI 生成内容并保留记录

开发阶段容易出现的问题是:所有处理都写在一个脚本里,一旦某个视频片段生成失败,整条流水线都要重新跑。这一点到生产环境之前必须改掉。

2.2 按环节选型,不要只选一个“万能模型”

完整的 AI 短剧链路通常包含以下环节,每个环节的产物和关注点都不一样:

环节 常见实现方案 中间产物 关键点
剧本生成 大语言模型 API / 开源 LLM 剧情大纲、对白文本 结构化输出,便于后续解析
分镜拆分 LLM + 规则模板 分镜 JSON 字段稳定,包含镜头和时长
角色设定 文生图 / 图生图 角色正面立绘 固定 seed、参考图或 LoRA
画面生成 文生图 背景图、分镜图 风格统一,分辨率标准化
动态视频 图生视频 / 文生视频 MP4 片段 保持首帧构图,控制运动幅度
配音 开源 TTS / 商业 TTS WAV、MP3 旁白和对白分轨保存
口型同步 Wav2Lip 等算法 新视频片段 仅在人物说话片段使用
剪辑合成 FFmpeg、自动剪辑脚本 成片 MP4、SRT 字幕 音画同步,转场统一
AI 观众反馈 多模态模型 + LLM + 规则引擎 弹幕 JSON、分析报告 安全过滤,时间点对齐

这里不需要追求一个工具解决所有问题。实际项目中,文生图用一个平台、图生视频用另一个平台、TTS 用开源模型,是完全正常的组合方式。关键是要给每个环节定义清晰的输入输出格式,否则整条链路会因为字段不一致而频繁返工。

3. 实现一条最小 AI 短剧制作管线

3.1 用结构化提示词把剧本变成分镜

短剧生产的第一个技术步骤,不是直接生成画面,而是把剧本拆成结构化的分镜数据。分镜数据要包含:场景编号、镜头类型、时长、旁白、对白、画面提示词、镜头运动方式。

下面是一个分镜 JSON 的示例结构:

{
  "project": "守夜人",
  "style_fingerprint": "cg_style_v3, warm_neon, teal_orange, 4k",
  "scenes": [
    {
      "scene_id": "S01",
      "scene_type": "establish",
      "duration_seconds": 3,
      "narration": "夜晚的城市,信号塔亮起第一束光。",
      "dialogue": [],
      "camera": "slow push in",
      "visual_prompt": "a lone signal tower on rooftop, night city background, warm neon light, cinematic composition"
    },
    {
      "scene_id": "S02",
      "scene_type": "dialogue",
      "duration_seconds": 5,
      "narration": "",
      "dialogue": [
        {
          "character": "林晚",
          "line": "你确定今晚会来吗?"
        }
      ],
      "camera": "medium shot, close on eyes",
      "visual_prompt": "young woman in dark coat, worried eyes, night city bokeh, portrait lighting"
    }
  ]
}

把分镜格式化成 JSON,是为了后续每个步骤都能用代码读取。画面生成脚本、TTS 脚本、剪辑脚本都依赖这个统一的中间结构。如果分镜只是自然语言段落,下一步脚本就难以稳定解析。

3.2 角色一致性:固定 seed、参考图或 LoRA

短剧和单图最大的区别在于,同一个角色要出现在多个镜头里。角色不一致是 AI 短剧最常见的质量问题。

解决角色一致性问题有三种思路:

  1. 固定随机种子和模型权重:在同一个模型版本、同一个 seed、同一组提示词结构下生成同一角色,适合镜头数量少的项目。
  2. 使用参考图 / 首帧图:在图片生成和图生视频环节传入角色立绘,让模型基于参考图保持面部和服装特征。
  3. 训练角色 LoRA:为固定角色准备几十张多角度图片,训练一个轻量 LoRA,在生成时加载。适合角色贯穿全剧、对一致性和演技要求高的项目。

三种方案的取舍如下:

方案 成本 一致性效果 适用场景
固定 seed 最低 一般,受提示词影响大 测试、低预算短片段
参考图 中 较好,依赖参考图质量 大多数短剧项目
角色 LoRA 较高 最强,适合多镜头复用 固定 IP 角色、长剧

注意:不要只依赖负面提示词去修正人物。负面提示词能压制“多手指”“脸部变形”这类问题,但解决不了角色身份漂移。身份一致性必须靠参考图和 LoRA 这类外部约束。

3.3 图生视频、TTS 与口型同步

拿到分镜图和角色图之后,下一步是把静态图变成动态片段。图生视频相比文生视频更容易控制角色外观,因为它以输入图片作为首帧。下面是一个调用视频生成 API 的示例代码框架,实际项目中需要按自己使用的平台调整端点、请求头和参数:

import base64
import requests
import time

API_URL = "https://your-video-generation-endpoint.example.com/v1/img2video"
API_KEY = "your-api-key"

def image_to_video(image_path, prompt, duration_seconds=5):
    with open(image_path, "rb") as f:
        image_b64 = base64.b64encode(f.read()).decode()

    payload = {
        "image_base64": image_b64,
        "prompt": prompt,
        "duration_seconds": duration_seconds,
        "cfg_scale": 7.0,
        "motion_strength": "moderate"
    }
    headers = {"Authorization": f"Bearer {API_KEY}"}

    resp = requests.post(API_URL, json=payload, headers=headers, timeout=30)
    resp.raise_for_status()
    task_id = resp.json().get("task_id")

    # 轮询任务结果
    while True:
        detail = requests.get(
            f"{API_URL}/{task_id}",
            headers=headers,
            timeout=10
        ).json()
        if detail["status"] == "succeeded":
            return detail["video_url"]
        if detail["status"] == "failed":
            raise RuntimeError(detail.get("error", "unknown error"))
        time.sleep(5)

这段代码展示了两个生产要点:

  • 视频生成耗时较长,不能像图片接口那样同步等待,需要任务 ID 轮询。
  • cfg_scale 和运动强度要分场景调整。对话场景运动幅度小,动作戏运动幅度大,参数不能一套走天下。

配音部分可以用开源 TTS 或商业 TTS 批量生成每个场景的旁白和对白音轨,并按 scene_id 命名保存。口型同步则建议只在有人脸说话的镜头中使用 Wav2Lip 一类算法,把音频驱动到人物嘴部。

3.4 用 FFmpeg 完成自动拼接、字幕与音画合成

当所有分镜片段、音频、字幕材料都准备好后,剪辑工作可以完全用 FFmpeg 自动化完成。

按顺序拼接多个视频片段,推荐使用 concat demuxer,而不是逐个 re-encode 拼接:

# 先保证所有素材分辨率、帧率一致
ffmpeg -i scene_01.mp4 -i scene_02.mp4 -filter_complex \
"[0:v]scale=1920:1080,fps=30,format=yuv420p[v0];\
[1:v]scale=1920:1080,fps=30,format=yuv420p[v1];\
[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -c:v libx264 -c:a aac final.mp4

给视频烧录字幕前,最好先用 ffprobe 检查成片的基本信息:

ffprobe -v error -show_entries stream=codec_type,width,height,r_frame_rate \
-show_entries format=duration final.mp4

这一步最重要的是检查三个点:时长是否符合分镜表、是否同时包含视频流和音频流、分辨率是否统一。常见的字幕不同步问题,大多出现在片段拼接时音频偏移,而不是字幕文件本身写错。

4. 设计一个 AI 观众反馈系统

4.1 整体架构与数据流

AI 观众系统可以作为一个独立服务部署在内容生产链路之后。它的输入是成片和字幕,输出是一系列带时间点的观众反馈数据。

一个最小架构包含以下模块:

模块 职责 输入 输出
内容解析 提取字幕、抽帧、语音转写 成片 MP4、SRT 文本段、图像帧
场景理解 识别场景切换、人物关系、情绪变化 文本段 + 图像帧 场景标签、情绪曲线
弹幕生成 按剧情节点生成观众视角弹幕 场景理解结果 带时间戳的弹幕列表
安全过滤 过滤敏感词和不当内容 弹幕列表 审核后的弹幕
反馈聚合 生成热度曲线、话题点、留存预测 弹幕和情绪数据 分析报告 JSON

数据流可以理解为:视频片段拆成若干段落,每个段落抽 2 到 5 帧画面,连同字幕一起送给多模态模型,得到该段落的“观众反应”,最后按时间轴聚合。

4.2 最小实现:一个弹幕生成服务

下面用 FastAPI 写一个最简单的 AI 观众弹幕生成服务。它接收一段视频分镜描述,调用大模型生成多条弹幕,再做关键词过滤后返回:

import os
import json
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import openai

app = FastAPI()
client = openai.OpenAI(api_key=os.environ["LLM_API_KEY"])

class SceneInput(BaseModel):
    scene_id: str
    narration: str
    dialogue: list
    visual_summary: str
    emotion: str

class DanmakuItem(BaseModel):
    scene_id: str
    timestamp_seconds: float
    text: str
    emotion: str

PROMPT_TEMPLATE = """
你现在是一个资深弹幕文案作者。请基于以下剧情片段生成 5 条短弹幕。
要求:口语化、长度小于 20 字、符合剧情情绪、不要剧透后续内容。

剧情片段:
- 旁白:{narration}
- 对白:{dialogue}
- 画面:{visual_summary}
- 情绪:{emotion}

只输出 JSON 数组,格式如下:
["弹幕1", "弹幕2", "弹幕3"]
"""

def filter_danmaku(items: list[str]) -> list[str]:
    banned_keywords = ["违禁词示例"]
    result = []
    for text in items:
        text = text.strip()
        if not text:
            continue
        if len(text) > 20:
            continue
        if any(k in text for k in banned_keywords):
            continue
        result.append(text)
    return result

@app.post("/api/danmaku/generate", response_model=list[DanmakuItem])
def generate_danmaku(scene: SceneInput):
    prompt = PROMPT_TEMPLATE.format(
        narration=scene.narration or "无",
        dialogue=json.dumps(scene.dialogue, ensure_ascii=False),
        visual_summary=scene.visual_summary,
        emotion=scene.emotion,
    )
    try:
        resp = client.chat.completions.create(
            model="your-model-name",
            messages=[
                {"role": "system", "content": "你是一个短视频弹幕文案助手。"},
                {"role": "user", "content": prompt},
            ],
            temperature=0.8,
            max_tokens=300,
        )
        raw_text = resp.choices[0].message.content
        candidates = json.loads(raw_text)
    except Exception as exc:
        raise HTTPException(status_code=502, detail=f"LLM 调用失败: {exc}")

    danmaku_list = filter_danmaku(candidates)
    return [
        DanmakuItem(
            scene_id=scene.scene_id,
            timestamp_seconds=0.0,
            text=text,
            emotion=scene.emotion,
        )
        for text in danmaku_list
    ]

这个实现里,过滤规则只是示例,真正生产环境要用更完整的敏感词库和人工审核兜底。弹幕生成层需要注意几点:

  • 温度调到 0.7 到 0.9,保证多样性;太低会产生重复弹幕,太高会跑题。
  • 必须限制输出为 JSON,并在解析失败时做好容错,不能因为一条弹幕解析失败导致整个服务报错。
  • AI 生成的内容不能直接展示到公开页面,必须先经过过滤和审核。

4.3 AI 反馈如何辅助创作决策

AI 观众系统的价值不在于“生成几条弹幕”,而在于把反馈数据接入创作决策流程。

在实际项目中,可以这样使用:

  1. 剧本评审阶段:把剧本大纲逐段送入 LLM,模拟观众对每个情节点的新鲜感和弃剧概率,找到节奏拖沓的段落。
  2. 成片内测阶段:对成片按场景生成情绪曲线和弹幕热度,对比编剧预期,定位“该嗨没嗨起来”的片段。
  3. 宣发阶段:从弹幕中抽取高频话题词,作为短视频二创和标题文案的候选素材。

需要强调的是,AI 观众是基于已有内容分布做的模拟,它会更偏向“平均观众”。如果目标观众是特定人群,需要在提示词中补充人群画像,并且在生成结果后请真实用户做小范围验证,避免让 AI 反馈替代真实调研。

5. 常见质量问题和排查路径

5.1 角色在不同镜头里像换了个人

现象:同一个角色在场景切换后,脸型、发型、服装出现明显变化。

可能原因:

  • 生成时没有使用同一张角色参考图。
  • 图生视频时首帧分辨率或裁切比例不一致。
  • 提示词中角色描述不固定,前后字段顺序或措辞不同。
  • 使用不同模型版本或 seed 漂移。

排查顺序:

  1. 检查每个分镜的视觉提示词里,角色描述是否来自同一个模板字段。
  2. 检查图片进入图生视频前是否有自动裁切。
  3. 检查是否用了同一张角色立绘作为参考图。
  4. 如果仍不一致,考虑为角色训练 LoRA。

5.2 口型对不上、音画不同步

现象:人物说话时口型明显错位,或者旁白结束后嘴还在动。

可能原因:

  • TTS 生成的音频和分镜时长不一致。
  • 口型同步算法只在短句上有效,长句效果差。
  • 拼接时音频轨道提前或延后了几帧。

排查顺序:

  1. 用 ffprobe 检查每个片段的音频时长和视频时长差异。
  2. 确认 TTS 音频是否按照分镜 JSON 的 dialogue 逐句生成。
  3. 如果使用 Wav2Lip,将长句拆成短句单独处理,再拼接。
  4. 在 FFmpeg 拼接时加入 -shortest 时要注意是裁剪视频还是裁剪音频,避免错误轨道。

5.3 视频画面闪烁、物体变形

现象:人物手臂边缘闪烁,背景物体在相邻帧突然变形。

可能原因:

  • 采样步数过低,画面不够稳定。
  • cfg_scale 设置过高,生成结果过度强调提示词,导致局部变形。
  • 运动幅度设置过大,模型在相邻帧之间无法保持结构一致。
  • 输入图片分辨率与模型期望分辨率不一致。

处理建议:

参数 当前值 调整方向
采样步数 20 提升到 30 到 40
cfg_scale 12 降到 6 到 8
运动强度 high 改成 moderate
输入分辨率 1024x1024 对齐目标模型建议尺寸

如果问题仍然存在,优先考虑使用图生视频而不是文生视频,用静态构图约束视频内容。

5.4 链路任务失败、成品素材丢失

现象:整批生成任务中间有 20% 的片段失败,手动重跑后却只重跑了失败片段,拼接时发现素材仍然缺失。

原因:脚本没有按 scene_id 做任务幂等,重跑时没有跳过成功片段。

解决方案:

  • 每个生成环节以 scene_id 作为唯一键,生成成功后写入状态文件或数据库。
  • 重跑任务前先扫描已有产物,缺失才重新生成。
  • 每个任务的输入输出都记录日志,包含参数 hash,方便定位版本变化。

6. 生产落地清单与扩展方向

6.1 发布前的技术检查清单

AI 短剧项目从 Demo 走向正式发布,至少有这些技术点要核对:

  1. 素材管理:所有图片、音频、视频按 project/scene/version 三层组织,避免同名覆盖。
  2. 幂等与重试:每个环节都支持失败重跑且不会重复生成。
  3. 成本控制:记录每个片段的模型调用次数和 token 消耗,设置单日预算上限。
  4. 内容标识:AI 生成内容要增加明确标识,保留生成记录。
  5. 人工审核:成片发布前必须经过人工审片,不能直接依赖自动过滤。
  6. 日志与监控:记录每个环节的耗时、失败率、模型版本,便于回溯。

6.2 扩展方向与学习路径

如果这套链路已经在项目里跑通,下一步可以从三个方向深入。

第一个方向是多模态理解增强。当前 AI 观众系统依赖字幕和抽帧,效果还比较粗糙。可以加入音频情绪识别、场景切换检测、人物轨迹追踪,让反馈数据更接近真实观看体验。

第二个方向是角色数字化资产化。把角色立绘、LoRA 权重、口头禅语料、行为设定统一管理起来,让同一个 IP 角色能够在短剧、漫剧、直播、客服等场景复用。

第三个方向是互动内容生成。把 AI 观众系统和短剧播放端联通,根据实时弹幕调整剧情分支或主角行动,这就进入了互动短剧的范畴。

学习路径上,建议不要一上来就追求完整工业系统。先跑通“剧本 -> 分镜 JSON -> 图生视频 -> TTS -> FFmpeg 拼接”的最小链路,再逐步加入角色一致性控制、AI 观众反馈和任务调度。每一步都保证能稳定产出可验证的中间结果,再去扩展下一个环节。

AI 短剧和 AI 观众真正难的地方,不在于某个模型多强大,而在于把文本、图像、视频、音频、用户反馈这些异构内容组织成一条可靠的工程链路。先保证链路稳定,再谈画质和创意。这套思路,和做其他 AIGC 应用是一样的。

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐