公司动态
AI动画制作全流程:角色资产、分镜表与成片合成实战
制作一个原创角色动画过去至少需要画画、分镜、动画、配音和剪辑四类能力。现在借助 AI 工具这条链路被压缩成角色设定、素材生成、动态化、后期合成四个环节。我最近在整理一个名为 my_ai_town 的开源项目用来记录自己用 AI 制作 OC 动画的完整实践。这一篇是系列的第二部分但对应整个短片流程的第一阶段把角色、分镜和画面素材稳定地产出来。后面还会继续写配音、合成和发布。这篇文章会围绕一条可复现的主线展开先设计角色资产再搭建项目目录然后逐步完成角色卡、提示词、分镜表、视频片段、配音和成片合成。每一个环节都会说明做什么、为什么这样做、如何验证结果、遇到问题怎么排查。读者不需要先学会绘画但需要具备一点 Python 环境和命令行操作基础。即使你暂时不打算用 AI 制作 OC 动画也可以把这里的流程复用给 AI 短剧、AI 漫剧、角色视频、品牌虚拟形象等场景。1. 先拆工作流OC 动画不是从画布开始的而是从角色资产开始的很多人在第一次尝试 AI 动画时会直接打开一个生成工具输入“一个蓝发少女在森林里奔跑”然后期待拿到一个完整可用的镜头。这个思路基本会失败。因为 AI 生成模型并不知道“蓝发少女”是你心中的角色也不知道森林应该是什么风格更不知道这个镜头要持续几秒、画面里角色应该在哪个位置。正确的做法是先拆工作流把“我想做一个动画”拆成“我到底需要哪些资产、哪些约束、哪些中间产物”。AI 动画本质上是在处理一组可复用的数据资产而不是一次性生成一段视频。1.1 从脑海中的角色到可复用的角色资产OCOriginal Character指的是原创角色。在传统动画里OC 需要设定图、三视图、表情包、服装配色和场景风格。在 AI 动画流程里这些信息必须转换成文本和参考图让模型每次生成时都能保持同一张脸、同一套衣服、同一种画风。角色资产至少包含三类内容结构化的角色描述角色姓名、性别、年龄、发型、发色、瞳色、服装、配饰、性格关键词。正面参考图至少一张清晰的立绘最好有正面、侧面、半侧面的多角度参考。风格约束画风关键词、渲染风格、背景风格、色彩倾向。这三类内容会分别对应到提示词、参考图输入和 LoRA 模型。没有这些资产后续所有镜头都在“新生成一个近似角色”而不是“让同一个角色出演”。1.2 六个关键环节脚本、分镜、素材、动态、配音、后期一个完整 OC 动画的 AI 工作流可以压缩成六个环节环节主要输入主要输出人工介入点脚本故事梗概、角色性格文本剧本判断对白是否符合人设分镜剧本、角色资产分镜表确定镜头顺序和时长素材生成分镜表、角色卡立绘、背景图、局部元素挑选可用素材修复构图动态化静态图、提示词视频片段调整运动幅度和画面一致性配音对白文案、人设音色配音音频、音效确认语气和语速后期合成视频片段、音频、字幕成片文件剪辑节奏、音量、字幕样式这六个环节不是必须严格串行的。实际制作中我会先把第一版脚本和分镜表完成再去逐镜头生成素材这样能减少大量返工。如果你先做素材再写脚本很容易出现“素材很好看但讲不了故事”的情况。1.3 为什么先把流程拆开再生成画面AI 视频生成工具目前仍然不稳定。如果只用一个长提示词要求模型完成“角色进入小镇、和店主说话、走出画面”的完整镜头生成结果大概率会出现角色变脸、场景变形、动作不连贯的问题。把流程拆开的意义在于让每个环节的结果都可以被检查而不是等整段视频生成完才发现构图错乱。让每个镜头都使用相同的角色锚点从源头上减少角色不一致。让失败成本可控某个镜头生成失败只需重做该镜头不需要重做整个短片。我建议第一次实践时不要追求“一句提示词生成整部动画”而是用最小的闭环跑完这六个环节。先用一个 15 秒的短片验证流程再逐步加复杂度。2. 搭建可复现的 AI 动画目录环境AI 动画制作涉及模型、提示词、图片、音频、脚本和项目文件数量非常多。如果不提前设计目录结构三天后你大概率会忘记某张参考图对应的是第几个镜头也会因为随便改名导致工作流引用失效。所以第二步是先搭好工程目录。这个项目在 my_ai_town 中采用了按“资产类型 镜头编号”组织的思路这里我给出一个通用版本适用于本地 ComfyUI、Stable Diffusion WebUI 或云端生成工具。2.1 基础运行环境本地运行图生图或视频生成模型建议先准备以下基础环境操作系统Windows 10/11、macOS 或 Linux 都可以但显存需求不同。Windows 下对 CUDA 支持最省心。Python3.10 或 3.11。新版 PyTorch 对这两个版本支持较好。PyTorch根据显卡驱动安装对应 CUDA 版本。NVIDIA 显卡安装 cu121 或 cu124 的版本即可。FFmpeg用于后续音视频合成。macOS 可以用brew install ffmpegUbuntu 可以sudo apt install ffmpeg。模型运行时可以根据自己熟悉的工具选择 ComfyUI、Stable Diffusion WebUI 或 Diffusers。如果只是学习不建议一开始就追求大显存。16GB 显存可以运行大部分图生图和中等分辨率视频生成模型8GB 显存需要选择轻量模型并降低视频分辨率。如果完全没有本地 GPU可以使用在线 API但需要把提示词、参数和输出文件保存到本地否则很难复现。2.2 目录结构设计一个适合 AI 动画项目的目录结构类似这样oc-animation/ ├─ assets/ │ ├─ character/ │ │ ├─ oc_character_sheet.json │ │ ├─ reference_front.png │ │ ├─ reference_side.png │ │ └─ reference_style.png │ ├─ background/ │ │ ├─ town_street.png │ │ └─ cafe_interior.png │ └─ lora/ │ └─ oc_style.safetensors ├─ prompts/ │ ├─ character_prompt_template.txt │ ├─ negative_prompt.txt │ └─ shot_prompts.csv ├─ outputs/ │ ├─ storyboard/ │ ├─ stills/ │ ├─ video_clips/ │ └─ final/ ├─ audio/ │ ├─ voice_lines/ │ ├─ sound_effects/ │ └─ music/ └─ scripts/ ├─ extract_frames.py └─ compose_video.py说明几个关键目录的用途assets/character存放角色设定和参考图是整个项目的“角色锚点”。prompts存放所有提示词模板和分镜提示词保证每个镜头引用相同的描述。outputs/storyboard存放分镜表导出的图片outputs/stills存静止画面素材outputs/video_clips存每个镜头生成的视频片段。audio/voice_lines按镜头存放配音文件文件名建议和分镜编号保持一致例如scene_001_shot_002.mp3。文件名是 AI 动画项目里最容易忽略的约束。我建议所有中间文件使用统一的命名规则场景号_镜头号_类型.扩展名。例如s01_scene_02_bg.png、s01_scene_02_clip.mp4这样 FFmpeg 合并不容易出错。2.3 用 Git 管理生成历史AI 生成具有随机性同一组提示词和参数在不同时间运行可能得到完全不同的结果。因此我强烈建议用 Git 管理所有非生成文件尤其是角色卡 JSON。提示词模板。分镜表。常用生成参数。对于体积较大的图片和视频不需要塞进 Git可以单独放到网盘或本地备份。Git 的价值在于记录提示词和角色设定的变更历史。当你发现某个镜头效果变差了可以回退到上一版角色卡和提示词。正式运行前先执行一次环境检查python --version python -c import torch; print(torch.__version__); print(torch.cuda.is_available()) ffmpeg -version | head -n 1 git status输出结果里torch.cuda.is_available()如果为False说明 PyTorch 没有安装 CUDA 版本或者显卡驱动不匹配。这时先修复环境不要急着跑生成流程。3. 角色卡和提示词让 AI 记住同一个 OCAI 模型本身并不知道谁是“你的 OC”。想让同一个角色在不同镜头中保持一致需要把角色信息结构化并写进生成模型可读取的提示词。这里最核心的文件是角色卡。3.1 角色卡 JSON 设计角色卡用来统一描述角色外观、服装和风格。下面是一个示例{ name: Mio, age: 16, gender: female, appearance: { hair: long silver hair, hair_style: twin braids, eyes: violet eyes, height: short, build: slender }, outfit: { top: white oversized hoodie, bottom: black pleated skirt, shoes: brown boots, accessory: small crescent moon hairpin }, style: { art_style: 2D anime illustration, lineart: clean lineart, color_palette: soft pastel, background_style: pastel town street, lighting: soft daylight }, negative_prompt: ugly, deformed, blurry, low quality, extra fingers, bad anatomy, watermark, text }这个 JSON 结构并不是给模型直接读的而是作为“提示词生成器”的输入。实际写提示词时把 JSON 中的关键字段拼接到句子中。不要直接把 JSON 全部塞给模型尤其是带引号和冒号的文本会影响提示词解析。在实际项目中角色卡要经过三轮迭代第一轮写粗略外观生成一张立绘。第二轮根据立绘不符合设定修改 JSON 描述。第三轮固定可接受的描述作为所有镜头共用的模板。3.2 正面提示词模板和负面提示词模板为了减少重复劳动建议把角色提示词单独存成模板文件。下面是 ComfyUI 或 WebUI 常用的一段正面提示词示例masterpiece, best quality, 2D anime illustration, 1girl, Mio, long silver hair with twin braids, violet eyes, small crescent moon hairpin, white oversized hoodie, black pleated skirt, brown boots, standing in pastel town street, soft daylight, cinematic composition, detailed background, dynamic angle负面提示词同样重要推荐从以下内容开始worst quality, low quality, bad anatomy, bad hands, extra fingers, missing fingers, extra limbs, distorted face, blurry, jpeg artifacts, watermark, signature, text, logo, frame border, bad eyes, cross-eyed, ugly, duplicate这里要特别注意“不要因为生成结果已经满意就删掉负面提示词”。负面提示词的作用不是让画面更好看而是限制模型不进入常见错误分布。角色卡里的negative_prompt字段会作为所有镜头的默认负面提示词个别镜头可以追加但不要移除基础项。3.3 LoRA 与 IP-Adapter让参考图成为角色的稳定锚点提示词能描述外观但对“同一张脸”的约束仍然不够。文字描述的是概念而参考图给出的是具体像素分布。在复杂镜头中如果想让角色不变形还需要引入额外手段LoRA 模型用一批同角色图片微调一个轻量模型。LoRA 体积通常只有几十到两百 MB生成时加载后即使提示词简洁也能保持角色特征。IP-Adapter以参考图作为图像提示让生成结果在结构、配色或构图上贴近参考图。ControlNet用姿态、深度图或线稿约束画面中的角色姿势。这三者的定位不同LoRA 约束“脸到底长什么样”IP-Adapter 约束“构图和风格要贴近某张参考图”ControlNet 约束“动作和空间关系要符合骨架”。在 my_ai_town 实践中我用角色卡统一描述用参考图保持脸部一致用 ControlNet 控制动作。如果是一张小成本 OC 动画建议至少训练一个角色 LoRA 或者收集 10 张以上高质量立绘用于 IP-Adapter 参考。只靠提示词做多镜头动画角色一致性很难保证。4. 分镜表与逐镜头生成把脚本转成可执行的拍摄清单有了角色卡下一步不是直接生成视频而是先把脚本拆成分镜表。分镜表是连接“文字故事”和“视频片段”的中间产物。AI 视频生成的镜头长度通常比较短最常见的是 2 到 5 秒一个镜头。如果脚本很长就要拆成几十个镜头每个镜头单独生成。4.1 分镜表字段分镜表不一定要画得美观但字段必须够用。建议至少包含列镜头编号场景景别远景、全景、中景、近景、特写画面内容角色动作对白字幕时长秒运镜方式固定、推近、横移参考图文件名提示词下面是一个示例分镜表shot,scene,shot_size,action,dialogue,duration,camera,character_ref 001,town_street,wide,Mio walks into frame,None,3,fixed,reference_front.png 002,town_street,medium,Mio looks at shop sign,Hmm, a new shop?,3,tilt_up,reference_front.png 003,cafe_interior,close,Mio orders coffee,One coffee please,4,slow_push,reference_side.png 004,cafe_interior,medium,barista hands over cup,Here you go,2,fixed,reference_front.png每个分镜对应一个输出文件。例如001_town_street_wide.mp4。不要把多个镜头塞进一个视频里因为 AI 生成的边界不稳定切分越细出现逻辑错误的概率越低。4.2 从静态立绘到视频片段图生图 视频生成模型分镜表准备好之后从静止画面开始生成视频片段的基本流程是先按分镜表生成关键帧静态图。筛选满足构图和表情要求的图片。把静态图作为首帧输入到视频生成模型。使用与静态图一致的提示词控制运动。生成静态图时可以用 ControlNet 固定姿态。比如要生成一个“角色低头看桌面的近景”先画一个简单的骨架图或使用现成人像姿态图再交给图生图模型。这样可以减少“角色突然做出不合逻辑动作”的概率。如果使用 Diffusers 系列工具静态图生成代码可能类似from diffusers import StableDiffusionPipeline import torch pipe StableDiffusionPipeline.from_pretrained( your_local_model_path, torch_dtypetorch.float16 ) pipe pipe.to(cuda) prompt Mio, long silver hair, violet eyes, close-up, looking down at coffee cup, cafe interior negative_prompt blurry, low quality, bad anatomy, watermark image pipe( promptprompt, negative_promptnegative_prompt, height768, width432, num_inference_steps30, guidance_scale7.0, generatortorch.Generator().manual_seed(1001) ).images[0] image.save(outputs/stills/003_cafe_interior_close.png)代码中的height768, width432是接近 16:9 的视频尺寸generator固定随机种子方便复现。实际项目里要根据视频生成模型支持的分辨率调整不要直接照搬。4.3 生成参数建议seed、steps、CFG、denoise静态图生成阶段需要关注四个参数参数含义常见范围调大影响调小影响seed随机种子任意整数同参数可复现每次结果不同steps采样步数20 到 40细节更充分但耗时更长可能生成不完整CFG提示词引导强度5 到 8更贴近提示词但容易过饱和更自由但可能偏离提示词denoise图生图重绘幅度0.4 到 0.8变化更大容易丢失原图特征更贴近原图但变化不足在角色一致性场景里denoise建议控制在 0.5 到 0.7 之间。太高会让参考图的脸型变化太低又无法让角色进入新场景。seed建议每个镜头固定一个不同值并在镜头未确定前不要修改这样方便对比不同提示词的影响。视频生成模型通常还有另外两个参数帧数和运动强度。第一个视频建议使用 3 到 5 秒长度运动强度设置在中低档。运动强度太高会让角色肢体扭曲太低又会让画面像静止图片。5. 配音、字幕与成片合成让 AI 素材变成完整短片画面素材生成完成后配音和剪辑是决定观感的关键。很多作品画面很好但声音干涩、字幕错位、音画不同步最后整体效果大打折扣。这里需要把配音、字幕、音乐和视频片段按统一时间轴合成。5.1 TTS 配音 vs 声音克隆配音有两条路线TTS 语音合成直接用现成语音合成 API 或本地 TTS 模型速度快适合普通旁白和角色对白。声音克隆用一小段目标声音训练或适配音色生成后更贴近预想声音但需要更多数据和调参。选择时可以从三个角度判断判断维度TTS声音克隆成本低较高需要数据和算力声音一致性多角色需要反复调节可以稳定音色适用场景演示片、短视频系列角色、固定人设如果只是制作一个 15 秒的测试短片直接使用 TTS 就够了。生成配音时需要保留原始文本和音频文件名例如voice_001.wav对应镜头001避免合成时对不上。5.2 用 SRT 字幕与音轨对齐字幕不是一句句手动打上去的最好是先从分镜表导出对白文本再生成 SRT 文件。下面是一个字幕示例1 00:00:00,000 -- 00:00:03,000 Hmm, a new shop? 2 00:00:03,500 -- 00:00:06,000 One coffee please. 3 00:00:06,500 -- 00:00:08,000 Here you go.SRT 的时间轴要和分镜表一致。分镜表里镜头 1 时长 3 秒字幕就放在 0 到 3 秒镜头 2 从第 3 秒开始。如果 AI 生成的视频实际长度是 3.2 秒需要先对视频做加速或减速统一到分镜时长再合成。5.3 FFmpeg 合成与导出参数将各镜头拼接成完整视频最实用的工具是 FFmpeg。先创建一个clips.txt列表file outputs/video_clips/001_town_street_wide.mp4 file outputs/video_clips/002_town_street_medium.mp4 file outputs/video_clips/003_cafe_interior_close.mp4然后执行ffmpeg -f concat -safe 0 -i clips.txt -c copy outputs/final/raw_merge.mp4这一步只是拼接视频不处理音轨。加上配音和字幕可以继续执行ffmpeg -i outputs/final/raw_merge.mp4 \ -i audio/final_mix.mp3 \ -c:v libx264 -c:a aac -b:a 192k \ -vf subtitlessubtitle.srt \ -shortest \ outputs/final/oc_animation_part2.mp4关键参数的含义-c:v libx264使用 H.264 编码兼容性最好。-c:a aac音频使用 AAC 编码。-vf subtitlessubtitle.srt烧录字幕到画面也可以使用软字幕但发布到多数平台时烧录更稳妥。-shortest以音频或视频中较短的一方为总时长防止画面结束后还有音频。6. 制作中常见的坑和排查路径AI 动画制作中问题不会只在生成阶段出现。以下是我在实践中遇到频率最高、最有代表性的四类问题每条都会给出现象、原因、检查方式和解决办法。6.1 角色脸部不一致现象同一个角色在不同镜头里五官差异明显甚至同一段视频中间几帧换了脸。可能原因角色卡内容不够具体只写了“银色长发、紫色眼睛”没有限定脸型、刘海、眉毛形态。每个镜头都使用不同随机种子且没有使用参考图或 LoRA。视频生成模型的运动强度设置过高。检查方式对比每个镜头的首帧和角色参考图确认脸部关键特征是否一致。检查镜头提示词是否都包含角色名和基础特征。检查是否加载了 LoRA 或 IP-Adapter。解决方式固化角色卡 JSON 中的外观字段不要在每个镜头里改写外观描述。固定一个训练好的 LoRA或者至少用同一张参考图作为 IP-Adapter 输入。运动强度降低一档重新生成问题镜头。6.2 画面闪烁和跳变现象静态图单独看没问题但生成视频后画面边缘闪烁角色身体时有时无背景连续跳动。可能原因视频生成模型对输入静态图的解析不稳定。首帧不是由最终使用的模型生成的有跨模型风格差异。视频帧率太低运动幅度和帧间隔不匹配。检查方式把视频逐帧导出观察闪烁频率和位置。确认首帧图片是由当前视频模型能够接受的固定尺寸生成。确认输出分辨率没有在生成后被缩放。解决方式使用同一模型生成首帧和视频避免跨模型拼接。将分辨率设置到模型推荐的固定档位比如 768x432 或 512x288不要随意拉伸。如果视频生成模型提供 temporal 相关参数可以调高时间一致性权重。6.3 音视频不同步现象角色说话时嘴型还没动声音已经出来了或者字幕已经播放完配音还差两句。可能原因配音音频时长和分镜时长不一致。拼接视频时没考虑画面实际长度。SRT 字幕时间轴没有跟随镜头时长调整。检查方式在剪辑软件中打开音频波形和分镜表的镜头边界进行对比。查看每个视频片段的真实时长执行ffprobe -show_entries formatduration -v error -of csvp0 input.mp4。解决方式在生成配音之前先确定每个镜头的最终时长。如果配音音频偏长按音频波形切分或做适度变速不要强行删除气口。如果画面偏长可以在后期中用视频缩放或补帧方式对齐。6.4 生成镜头放不进剪辑软件现象生成出的文件可能是 WebM、GIF 或带透明通道的格式导入剪辑软件后黑屏、声音丢失或无法导出。可能原因输出容器格式不是剪辑软件支持的通用格式。视频编码不是 H.264而是 VP9 或 AV1。音频轨道采样率不为 48kHz。检查方式用ffprobe查看编码信息ffprobe -v error -show_streams input.mp4解决方式统一转码为 H.264 AAC 的 MP4 文件ffmpeg -i input.webm -c:v libx264 -c:a aac -pix_fmt yuv420p output.mp4-pix_fmt yuv420p很重要很多剪辑软件不支持其他像素格式的 H.264 视频。7. 发布前检查清单从本地生成到可公开的短片短视频成片后不要急着发布。下面这份检查清单来自我的实践适用于短 OC 动画、AI 漫剧和品牌短片。每一列都有一个明确可验证的动作。7.1 内容一致性检查每个镜头的角色脸部、发型、服装和参考图一致。场景之间的色调没有明显冲突。对白人设符合角色设定情绪和口吻统一。字幕无错别字标点符号符合阅读习惯。逐镜头回放一遍。如果看到某个镜头有轻微变形可以进入“生成参数”阶段重做该镜头尽量不要在成片中保留模糊帧。7.2 技术参数检查视频总分辨率一致不要出现 1920x1080 和 1280x720 混用。视频帧率统一为 24、25 或 30fps。码率不低于平台推荐值例如 1080p 下建议 8 Mbps 以上。音频采样率统一为 48kHz音量峰值在 -6dB 到 -3dB 之间。字幕烧录后仍然可读字体大小不要挡脸。导出完整成片后用 FFprobe 跑一次ffprobe -v error -show_entries formatduration,size:streamcodec_name,width,height,r_frame_rate,bit_rate -of json outputs/final/oc_animation_part2.mp4如果输出里有多种分辨率或帧率说明剪辑过程中忘记统一参数。7.3 合规与版权注意事项确认角色设定、参考图和训练素材来源于可商用或自己创作的素材。如果使用在线 AI 生成服务确认输出内容的版权和使用范围。配音、背景音乐和音效需确认授权。不要直接使用来源不明的影视原声。涉及真实人物或品牌形象时要谨慎处理避免侵权和误导。发布时可以在简介中说明使用了 AI 辅助工具。规范说明不算负面信息反而是对观众的尊重。实际项目里最容易被忽略的是背景音乐和字体版权。视频画面可以是 AI 生成的但背景音乐如果不具有商用授权仍然可能在平台被判定侵权。8. 这一篇的总结与下一步可以做什么从角色资产到成片合成目前这套流程已经可以在一个周末内跑通 15 秒到 60 秒的 AI 短片。它解决的最核心问题是把一次性的、不可控的 AI 生成变成可复用的、可检查的工程流程。8.1 当前工作流已经解决什么解决了角色一致性通过角色卡、参考图和 LoRA 限制生成范围。解决了镜头管理通过分镜表和统一命名规则让每个镜头可定位、可重做。解决了后期合成的稳定性用 FFmpeg 统一编码和合成避免“能生成但不能用”。这一个阶段的产出是稳定的角色参考图、分镜表、静态素材和第一批视频片段。如果你跟着这个流程走完你至少会得到一个可继续拼接的素材库而不是一堆散乱的生成图。8.2 下一步可以扩展的方向下一步最值得投入的方向有两个一是批量生成自动化。把角色卡和提示词模板脚本化基于分镜表 CSV 批量生成静态图再把通过检查的静态图输入视频生成模型。二是互动化。结合 AI Agent 和角色对话模型可以让每个角色在小镇场景中拥有简单的行为逻辑这正是 my_ai_town 这类项目值得延伸的地方。在实际项目中我会推荐新手从最简单的单角色、单场景、三个镜头开始完整跑通这个流程后再增加第二角色、多场景和复杂运镜。工具会更新模型会升级但“先定义角色资产、再拆镜头、再逐段生成、最后统一合成”的方法可以长期复用。制作 OC 动画最关键的不是某一次漂亮的生成结果而是你能不能在几十个镜头、几十次失败中仍然让同一个角色保持存在。把 AI 当作一条生产线而不是一个许愿机这个流程才算真正跑通。