
之前一直想给自己原创的角色做一支动画短片用传统流程走了一遍之后发现光是人设设定、原画拆解、逐帧动画这几个环节就能劝退大多数业余创作者。后来把 AI 绘画、AI 视频生成、TTS 配音这些工具串成一条生产链才真正找到一条低成本制作 OC 动画的可行路径。本文会把这条链路整理成系列教程的第一部分重点解决“角色到底怎么保持一致性”“分镜怎么拆”“静态画面怎么批量产出”这三个问题同时把后续动态视频生成的方案留出接口。这套思路适合已经接触过 AI 绘画、但对完整动画流程还没有头绪的玩家也适合想系统地用 AI 辅助做内容生产的开发者。1. 背景与核心概念1.1 什么是 OC 动画OC 是 Original Character 的缩写指创作者自己设计的原创角色。围绕这个角色展开的设定图、插画、短篇漫画和动画短片都算 OC 创作。相比直接改编已有 IPOC 创作最大的价值在于角色和世界观完全归自己支配所以在同人创作、独立游戏、短视频内容里非常常见。OC 动画就是把原本静止的人设图变成可以讲故事、有动作、有声音的视频内容。按传统动画流程这个过程非常重需要有完整的角色设定稿包括正面、侧面、背面、表情差分。需要拆解分镜脚本把故事切成一个个镜头。需要为每个镜头绘制关键帧再补中间帧。需要合成、上色、配音、配乐。一个人的力量很难完成。而 AI 动画制作的出现把大量重复性劳动交给了模型创作者的重心从“画出来”转移到了“设计出来”和“选出来”。1.2 AI 制作 OC 动画的核心流程我采用的流程不是某个单一工具一步生成动画而是把 AI 能力拆成几个环节每个环节使用最合适的工具阶段主要任务常用工具方向角色设定确定外观、性格、标志性元素AI 绘画角色 LoRA分镜设计把故事拆成镜头写作工具 手绘草图静态画面生成按分镜生成关键帧Stable Diffusion 系列工具动态片段生成让关键帧动起来AnimateDiff、图生视频工具配音配乐生成台词和背景音TTS、BGM 素材库剪辑合成拼合画面、音轨、字幕剪映、Premiere、FFmpeg整个流程里最影响成片质量的不是视频生成而是前面的角色一致性和分镜拆解。角色一旦不稳定后面每个镜头都会返工。1.3 为什么“AI 动画”不能只靠一个工具很多读者会问现在不是有直接文生视频的工具吗为什么不直接输入一段文字生成动画直接文生视频的问题在于可控性不足。我们可以让 AI 生成一段“女孩在校园里走”但是很难让 AI 准确生成“我的角色小月穿着白色卫衣、银白长发、发尾渐变蓝从画面左侧走入停在樱花树旁”。尤其是多镜头场景角色外观、服装、身材比例会出现肉眼可见的漂移。所以更稳的方案是先用 AI 绘画生成符合角色设定的静态图再把静态图作为基础通过图生视频或动画插件生成动态片段。这样角色样貌在前期就已经固定下来视频阶段只需关注动作和镜头。2. 环境准备与版本说明这篇教程的实战部分以本地部署 Stable Diffusion WebUI 为例因为我需要批量生成分镜画面并且需要 ControlNet 控制姿势、AnimateDiff 生成视频片段。在线 AI 绘画工具虽然有但批量化和可重复性不如本地方案灵活。2.1 硬件环境AI 绘画和视频生成都是计算密集型任务建议GPUNVIDIA 显卡显存 8GB 以上。内存16GB 以上。硬盘至少预留 50GB 空间主要用于模型文件和生成素材。如果你只有轻量级 GPU也不是不能做只是生成分辨率、批次大小、视频片段长度都需要相应缩小。本文示例中的参数思路仍可复用版本需要根据你的项目实际情况调整。2.2 软件工具工具作用说明Stable Diffusion WebUI文生图、图生图、ControlNet 控制社区生态丰富插件多ComfyUI节点式工作流适合批量生成可选适合进阶玩家ControlNet 插件姿势、深度、线稿控制是保持构图和动作稳定的关键AnimateDiff 插件将静态图转成短视频片段适合生成 2 秒到 4 秒的动画TTS 工具生成角色配音可选也可自己录FFmpeg视频拼接和转码开源免费如果你希望完全使用在线服务也可以把第 3、4 章的思路迁移到线上绘图工具上但 ControlNet 这类精细化控制功能通常需要订阅支持。2.3 模型选择生成效果受底模影响很大。要制作二次元风格的 OC 动画建议优先选择二次元大模型比如社区常见的 Anything 系列、Counterfeit 系列。如果你想要更偏写实或半写实的效果也可以换 3D 渲染风格或写实风格的大模型。这里没有绝对标准关键是先找一个大模型作为“基底”后续所有生成都在这个基底上做避免中途反复切换底模导致角色风格漂移。2.4 项目目录结构任何项目都是先有结构再有内容。我在制作前会建好目录oc-animation-project/ ├── character/ │ ├── lora/ # 角色 LoRA 模型 │ ├── reference/ # 角色参考图 │ ├── expressions/ # 表情差分图 │ └── poses/ # 动作参考图 ├── storyboard/ │ └── scene_split.csv # 分镜表 ├── scrapes/ │ ├── scene01/ # 分镜画面 │ ├── scene02/ │ └── raw/ ├── video_clips/ │ └── scene01/ # 动画片段 ├── audio/ │ ├── tts/ # 配音 │ └── music/ # 背景音乐 └── output/ # 最终合成这个目录结构的好处是角色素材、分镜、画面、视频、音频各自独立不会在项目后期找不到文件。尤其是 LoRA 模型和参考图一旦散落下次想复刻同样风格会非常困难。3. 角色设定与人设图生成3.1 先写一份“人设卡”用 AI 生成角色之前建议先写一份人设卡。这不是给 AI 看的而是给自己看的。人设卡越具体后面的提示词和分镜就越有依据。人设卡的内容可以包括角色名、性别、年龄。发型、发色、瞳色、服装。标志性元素比如发饰、伤疤、特殊颜色的挑染。性格关键词影响表情和动作设计。标志性姿势或口头禅。下面是我的角色设定示例我会把它保存为 JSON 文件放在character/目录下{ character: { name: 小月, gender: 女, age: 16, hair: 银白色长发, eyes: 蓝色, costume: 白色连帽卫衣浅蓝色短裙, personality: 安静好奇心强, signature_element: 发尾渐变蓝刘海右侧有菱形发卡, signature_pose: 双手抱着一本书微微低头 } }3.2 生成第一张基础人设图有了人设卡之后开始生成基础人设图。这张图要尽量“干净”不需要复杂背景正面站立即可。因为它是后续所有镜头角色一致性的参考锚点。一个可复用的提示词模板如下character_prompt { base_prompt: ( (masterpiece, best quality:1.2), 1girl, silver long hair, blue eyes, white hoodie, light blue skirt, hair ornament, gradient blue hair tips, standing, full body, simple background, looking at viewer ), negative_prompt: ( lowres, bad anatomy, bad hands, extra fingers, missing fingers, watermark, text, signature, blurry, cropped ), lora: lora:oc_yue_v1:0.7, seed: 123456, steps: 30, cfg_scale: 7, width: 768, height: 1024 }这里有几个关键参数需要解释masterpiece, best quality提高整体画质的提示词放在开头。negative_prompt反向提示词告诉模型不要生成什么。手部崩坏、多余手指、水印是二次元模型常见问题。seed随机种子。固定同一个 seed模型会倾向于生成相近的构图和细节。cfg_scale提示词符合程度。数值太高容易过饱和数值太低则画面偏离提示词。7 左右是一个常见起点。lora角色 LoRA这是角色一致性的进阶方案。第一次生成可以不用先用底模画出基础形象后面如果发现角色容易被“画偏”再考虑训练小规模 LoRA。3.3 角色一致性的三根支柱很多 AI 动画新手都会遇到一个非常致命的问题每个镜头的角色长得都不一样。想要解决这个问题需要建立三个习惯第一固定提示词描述。把角色的发色、瞳色、服装、标志性元素写成一个固定的词组块之后所有镜头的 prompt 都从这个基础块复制而来而不是每次都重新写一遍。第二固定 seed 与参考图。如果遇到一个非常满意的形象就把这张图保存下来后续用图生图的方式把参考图作为底图再配合新场景提示词。第三训练角色 LoRA。如果你打算做长剧情动画固定 prompt 和 seed 还不够稳训练一个角色 LoRA 是投入产出比最高的方案。LoRA 会学习角色的核心特征在生成时通过lora:名字:权重调用。下面简单说一下角色 LoRA 的数据准备思路准备 15 到 30 张角色图尽量包含多个角度、多种表情、不同场景。图片尺寸最好统一为正方形分辨率 512 或 768 都可以。图片标注建议使用角色名作为触发词例如yue并在描述中加入简单标签。训练时学习率、步数先按社区常见默认值跑一轮测试后观察是否过拟合。训练 LoRA 是独立且较深的话题这里不展开但值得说明的是如果只是做 2D 动画镜头不依赖 LoRA 也可能成功如果要保证 20 个以上镜头角色统一LoRA 很有必要。4. 分镜脚本设计4.1 从剧本到分镜有了角色还不够动画需要故事。第一步是写一个短剧本不需要多复杂单个镜头数量控制在 10 个以内会更容易完成。以“小月的放学时刻”为例剧本可以写成场景一放学铃声响起小月收拾书包走出教室。场景二小月走在校园小路上风吹起头发。场景三她在樱花树下停下抬头看花。场景四拿出手机拍下一张照片露出微笑。把剧本拆成分镜表时每条记录一个镜头至少包含镜号、景别、画面内容、动作描述、台词或音效、预计时长、AI 生成策略。4.2 分镜表示例镜号景别画面内容动作/情绪台词/音效预计时长AI 生成策略01全景教室门口小月背着书包走出正常行走放学铃声3s文生图 图生视频02中景校园小路小月迎面走来风吹起银白长发风声3s图生图 AnimateDiff03中景樱花树下停住抬头看花环境音2s图生图 图生视频04近景小月举手机拍花微笑快门声3s图生图 图生视频分镜表是整个项目的“剧本代码”。后面的静态画面生成、视频生成、配音、剪辑全部围绕这张表执行。所以分镜表完成得越细致后续返工越少。4.3 分镜表如何辅助 AI 生成分镜表的每一行最后都要转成 AI 绘画提示词。比如镜号 03 的提示词可以在基础 prompt 上追加scene03_prompt character_prompt[base_prompt] ( , standing under cherry blossom tree, looking up at blossoms, soft petals falling, afternoon light, small depth of field )这个过程看起来简单但要注意一点不要在镜头提示词里塞太多细节。一个镜头只表达一个核心动作和核心环境。如果又是“走路”又是“抬头”又是“拿手机”模型往往会顾此失彼。5. 静态画面生成实战5.1 用 ControlNet 控制姿势AI 绘画生成角色时最容易失控的就是动作。你可以通过提示词描述“坐在地上”或“抬起手”但模型不一定会严格遵循。这时 ControlNet 的 OpenPose 功能非常有用。OpenPose 可以从一张参考图中提取人物的骨骼姿势然后让生成结果遵循这个骨架。具体操作在 Stable Diffusion WebUI 中打开 ControlNet 面板。上传一张人物姿势参考图可以是自己画的火柴人草图也可以是从游戏、照片中截取的动作参考。预处理器选择openpose模型选择对应版本。控制权重建议从 0.8 开始调整数值高则姿势还原强数值低则留给模型自由发挥的空间。举个例子我想生成镜号 04 中“举手机拍照”的动作如果直接输入 prompt 效果不稳定就先用姿势参考图锁住手臂位置和头部角度再把角色小月的人设图作为图生图底图这样画面才能同时满足“角色相同”和“动作到位”两个要求。5.2 用图生图保持角色统一图生图是角色一致性的重要手段。流程如下把基础人设图放入图生图区域。描述当前镜头的新场景、新动作。设置一个合适的重绘幅度denoising strength通常在 0.4 到 0.6 之间比较合适。重绘幅度是个需要体会的参数数值越低越接近原图但场景变化能力弱。数值越高越偏离原图场景变化能力强但角色特征容易丢失。如果角色服装颜色突然改变、发色被改掉多半是重绘幅度太高。建议从 0.5 左右开始调节遇到角色特征丢失就降低遇到画面构图改不动就提高。5.3 批量生成脚本手动一张张点击生成非常耗时。如果想让 10 个镜头每个镜头都产出 4 个候选图更高效的方式是直接调用 Stable Diffusion WebUI 的本地 API 批量生成。下面是使用 Python 调用 API 批量生成分镜画面的示例脚本import base64 import json import os import time import requests API_URL http://127.0.0.1:7860/sdapi/v1/txt2img def generate_image(prompt: str, negative_prompt: str, seed: int, output_path: str, width: int 768, height: int 432) - None: payload { prompt: prompt, negative_prompt: negative_prompt, steps: 30, width: width, height: height, cfg_scale: 7, seed: seed, batch_size: 1, restore_faces: True, override_settings: { sd_model_checkpoint: anything-v5.safetensors } } resp requests.post(API_URL, jsonpayload) resp.raise_for_status() data resp.json() if not data.get(images): raise RuntimeError(API response has no image data) image_bytes base64.b64decode(data[images][0]) os.makedirs(os.path.dirname(output_path), exist_okTrue) with open(output_path, wb) as f: f.write(image_bytes) print(fsaved: {output_path}, seed{seed}) scenes [ { name: scene01, prompt: classroom door, girl walking out, school bag, silver long hair, blue eyes, white hoodie, seed: 20250101, }, { name: scene02, prompt: campus path, girl walking, wind blowing hair, cherry trees, silver long hair, blue eyes, white hoodie, seed: 20250102, }, ] for scene in scenes: prompt f(masterpiece, best quality:1.2), 1girl, {scene[prompt]} output fscrapes/{scene[name]}/raw_{scene[seed]}.png generate_image( promptprompt, negative_promptlowres, bad anatomy, bad hands, watermark, text, signature, blurry, seedscene[seed], output_pathoutput, ) time.sleep(1)这段代码的核心价值不是“一键生成”而是让生成过程可重复、可追溯。脚本里的seed和prompt是多镜头项目里最重要的资产。建议每次生成都记录成 JSON 日志方便后来复现某个画面。5.4 生成表情差分动画里角色的情绪需要表情变化。你可以用同样的方式基于人设图生成开心、难过、惊讶、生气等表情差分图。表情差分提示词示例emotion_prompts { happy: gentle smile, closed eyes, slight blush, surprised: open eyes, open mouth, surprised expression, sad: downcast eyes, slight frown, teary eyes, angry: frowning, knit eyebrows, glaring }生成表情差分时建议固定 seed并基于正面人设图进行图生图。这样表情变化不会影响整体脸型和发型。6. 从静态画面到动态片段6.1 AnimateDiff 生成短视频素材当静态关键帧都准备好后就需要让画面动起来。AnimateDiff 是本地部署方案里比较成熟的动画生成策略它可以在 Stable Diffusion WebUI 中作为插件使用。思路是先在 WebUI 中设置帧数、帧率、运动参数然后以静态关键帧为底图生成一小段视频。因为 AnimateDiff 会连续采样多帧所以生成的片段天然带有运动连续性比单独生成多张图再拼接要自然得多。常见参数建议参数建议值说明帧数16 到 24 帧对应 1 到 2 秒片段帧率8 到 12 fps先用低帧率测试运动强度0 到 0.5数值越大动作越大也越容易变形上下文长度8 帧数值影响运动的连贯性需要根据显存调整实际生成时不要贪长。一个 2 秒的片段只要动作自然、角色不崩就已经达到可用的标准。如果你的画面运动幅度太大AnimateDiff 很容易产生脸部扭曲所以最好在分镜设计阶段就把动作控制在小幅度比如“头发飘动”“轻微点头”“风把衣角吹起”。6.2 使用在线图生视频工具如果你不想折腾本地视频插件也可以用在线图生视频服务。操作思路把已经生成好的静态图上传然后在提示词或参数面板里描述运动方式和镜头语言比如“镜头缓慢推进风吹动头发人物轻微呼吸”。在线工具的优点是无门槛、效果上限高缺点是单次生成时长有限、生成费用偏高而且生成结果的可控性不如本地方案强。实际项目中我通常会把本地 AnimateDiff 和在线图生视频工具结合使用简单动作用本地批量生成复杂运镜交给在线工具。6.3 TTS 配音与音效视频画面生成后还需要配音。配音可以用 TTS 工具也可以自己录音。如果使用 TTS角色性格会影响音色选择安静型角色适合轻柔的声音活泼型角色适合稍快、明亮的声音。常见的 TTS 工具需要根据实际可用情况选择这里不指定具体某家服务。建议至少生成两遍对比后选择语气更自然的一条。音效方面不需要全部自己制作。可以准备一个素材目录把脚步声、环境声、快门声、铃声等常见音效分类存放。剪辑时直接把音轨拖入对应时间点即可。6.4 使用 FFmpeg 合成片段将动画片段和配音合成可以使用 FFmpeg 命令行工具。最简单的合成方式如下ffmpeg -i video_clips/scene01/scene01_001.mp4 \ -i audio/tts/scene01.wav \ -c:v libx264 -c:a aac \ -shortest \ output/scene01.mp4参数说明-i指定输入文件可以有多个。-c:v libx264视频编码为 H.264兼容性最好。-c:a aac音频编码为 AAC。-shortest以较短的输入为最终时长避免画面和声音对不上。这里的命令只是初步合成。正式剪辑时我通常还会加入字幕、转场和背景音乐这部分可以在剪映或 Premiere 中处理也可以用 FFmpeg 配合脚本做更精细的批量处理。7. 常见问题与排查思路7.1 问题排查速查表以下是 AI 制作 OC 动画过程中最高频遇到的问题问题现象常见原因解决思路每个镜头角色长相不一致没有固定提示词和 seed固定基础 prompt固定 seed使用同一张参考图角色脸部崩坏底模不擅长该角色LoRA 权重不合适降低 LoRA 权重到 0.4 到 0.8换底模测试手部崩坏、多手指模型对复杂手部结构学习不足负向提示词加 extra fingers尽量裁掉手部或使用 OpenPose 精确控制人物动作僵硬图生视频模型能力限制缩短生成片段降低运动幅度后期补关键帧背景与角色风格不匹配底模对不同元素的偏好不同使用“线稿上色”分层方案或增加背景关键词权重分辨率不足画面模糊显存限制导致生成尺寸小低尺寸生成后使用高清修复或用 ControlNet Tile 放大训练 LoRA 后角色过拟合训练步数过多、数据量少减小训练步数增加数据多样性降低 LoRA 权重7.2 角色崩坏的处理顺序如果你在生成过程中发现角色越来越偏不要立即改提示词先按以下顺序排查检查基础 prompt 是否被改动。复制粘贴时很可能不小心漏掉关键特征词。检查 seed 是否变化。多镜头项目建议直接用固定 seed。检查是否使用了多张参考图。图生图时参考图如果被替换角色立刻会变。检查 LoRA 权重。权重太高脸型容易固化甚至过拟合权重太低角色特征消失。多数角色一致性崩溃都出在这四个环节中的某一个而不是模型本身不行。7.3 动画生成时画面跳变的解决思路使用 AnimateDiff 时经常出现画面抖动或闪烁这和帧间采样不稳定有关。常见改善方法固定运动强度不要设置过大。提高采样步数从 30 步提高到 40 步。把生成视频的分辨率控制在模型能稳定处理的范围内。分镜头生成时尽量让单段视频只包含简单运动复杂动作拆到多个镜头里完成。8. 最佳实践与工程建议8.1 提示词资产化管理AI 绘画项目的提示词不应该只在 WebUI 的输入框里。每次生成都必须记录包括基础 prompt、反向 prompt、seed、采样步数、CFG、LoRA 权重、模型文件在内的完整信息并保存为 JSON 或 CSV。示例记录格式{ scene: scene03, prompt: ..., negative_prompt: ..., seed: 20250103, model: anything-v5.safetensors, lora: oc_yue_v1:0.7, cfg_scale: 7, steps: 30, width: 768, height: 432, remark: 需要樱花飘落效果 }这样做的最大好处是如果某个镜头效果很好未来可以用同样的参数复现如果某个镜头崩了也能快速定位是哪一步参数出了问题。8.2 素材文件命名规范项目文件一多命名混乱就会导致灾难。建议采用统一命名格式{场景编号}_{镜号}_{版本}_{seed}.{ext}例如scene01_shot02_v1_20250102.png scene01_shot02_v2_20250103.png scene02_shot01_v1_20250110.mp4版本号用v1、v2不要用“最终版”“修改版2”这类无法排序的名称。8.3 工程化思维先小样后全量拿到分镜表后不要急着把 10 个镜头全部生成。建议先挑 1 个镜头做完整验证覆盖“角色设定图 → 分镜图 → 视频片段 → 配音 → 合成”的整个流程。确认流程没问题后再批量生产其他镜头。这样能避免过程后期才发现角色风格不符合预期导致 9 个镜头全部返工。我把这个习惯称为“1 镜头闭环测试”。它和软件开发里的最小可行产品思路很像。8.4 版权与内容安全注意事项AI 生成内容在发布前需要结合所使用的平台和工具体系评估版权政策不同平台对 AI 生成内容的使用范围有不同的要求公开分享前建议确认清楚。此外不建议拿他人角色设定图直接作为训练素材也不建议刻意模仿某个特定创作者或角色的风格来生成内容。合规使用素材才能让创作持续下去。8.5 算力与时间分配AI 动画制作最耗时间的往往不是点击生成而是反复调参和选图。建议在项目初期固定一套“参数组合”除非必要不要每次生成都换模型和采样方法。参数稳定后批量生成和批量筛选会高效很多。本地生成长视频会受到显存限制建议先规划好每段视频的时长。单段 2 秒左右是安全范围多段 2 秒片段拼接后的效果通常优于一次生成 10 秒的长片段。9. 下一步可以继续扩展的方向目前完成的部分只是把角色和静态画面打通真正让动画“活”起来还需要继续深入以下几个方向。第一继续打磨角色 LoRA。如果你的角色在动态视频中仍然出现崩脸更精细的 LoRA 训练数据和参数调整是优先要做的。第二探索更复杂的镜头语言。目前生成的多是固定机位的小幅度运动接下来可以通过 ControlNet 的深度图和运动参数尝试推镜头、拉镜头、摇镜头等效果。第三让角色更像“角色”。除了外观还可以给角色添加标志性的小动作习惯例如撩头发、低头思考、快步走时书本抱在怀里。用 AI 生成时把这些行为关键词放进 prompt角色的辨识度会提升很多。第四尝试多角色交互。两个角色同时出现在画面里时需要分别控制每个角色的姿态和位置这时 ControlNet 的姿态控制能力和角色 LoRA 的分区调用会变得非常重要。AI 制作 OC 动画本身还是一个快速变化的领域。工具迭代非常快新的视频生成模型和插件不断出现但“先固化角色、再拆分镜、再批量生成、最后合成”的思路在较长一段时间内仍然适用。本系列第一部分到这里先把角色一致性和分镜基础打牢后续的新工具和新方法都可以继续接入这套流程。如果这篇文章对你有帮助可以先收藏备用跟着把基础人设图跑出来下一部分再一起进入动态片段生成和配音合成分。