我用 AI 把一个普通人「塞进」了《玩具总动员》
在短视频平台刷到一类效果:《玩具总动员》里的角色被换成一个真人,动作和场景全都保留,像这个人住进了动画里。评论区一片「这怎么做的」,我决定从零复刻一条。动手前踩的第一个坑是认知上的:Seedance 是「参考生成」,不是抠图换脸——它会重新生成整段视频。想清楚这一点,剩下的就是围绕 15 秒上限、只出 16:9、以及版权过滤这三个约束去设计流程。
起因:刷到一条视频
前几天我在短视频平台刷到一类视频:把《玩具总动员》里的某个角色,换成一个真人(做成同样的卡通风格),角色的动作、场景全都保留,看起来就像这个人「住进」了动画里。评论区一片「这怎么做的」,我也很好奇——于是决定自己从零复刻一条。
我挑的素材是网上找到的一条二创视频(Ken 从柜子里跳出来跳舞,41 秒),不是《玩具总动员》的官方片段。下文提到的「原片」都指它:
🎬 素材视频:Ken 从柜子里跳出来跳舞,41 秒
目标:把里面的 Ken 全程换成我准备的一个真人照片,其余(场景、旁边的翠丝和马、旁白)尽量不动。
一个关键认知:这不是「抠图换脸」
动手前我踩的第一个认知坑,值得先说清楚:
我用的视频模型是 Seedance 2.0,它是「参考生成」——你给它一段参考视频 + 一张参考图 + 一段提示词,它会重新生成一段新视频,而不是「只把某个人抠出来替换、其它像素原封不动」。
所以整套流程都是围绕这个事实设计的:
- 需要保留的镜头(没有目标角色的),直接用原片,不进模型;
- 需要替换的镜头,逐段重新生成,最后再拼回去。
如果你要的是「原视频一帧不改、只换一个人」,那是另一种技术(视频 inpainting),这套流程做不到。
Step 1:先把真人变成卡通角色(gpt-image)
真人照片直接丢进视频模型,会和卡通场景「打架」——一张真实的脸贴在卡通身体上,很违和。所以第一步,先用 gpt-image 把真人重画成和原片一致的 3D 皮克斯画风。
我的做法是同时喂两张参考图:
- 一张目标人物的真人照片(负责「长得像谁」);
- 一张从原片里截下来的画面(负责「什么画风」)。
提示词让它输出全身、正面、纯色背景的「角色设定图」——这张图后面每个镜头都能复用。
我实际用的 prompt 和命令(两张参考图:真人照片定长相、原片一帧定画风):
python3 gpt-image/generate.py \
-i image.jpg -i ken_style_ref.jpg \
--size 1024x1536 --quality high \
"Redraw the woman from the FIRST reference photo as a full-body 3D Pixar / Toy-Story-style cartoon character, matching the art style, glossy CG shading and soft warm lighting of the SECOND reference render. Stylized 3D look: smooth plastic-like skin, large expressive eyes, slightly exaggerated friendly proportions. Keep her recognizable: round face with glasses, dark shoulder-length hair with bangs, her outfit of a khaki short-sleeve tee, khaki cargo pants, grey sneakers, and a small crossbody bag. Standing, neutral front-facing pose, arms relaxed at her sides, full body head-to-toe in frame. Plain neutral light-grey studio background, no scenery. Clean character-sheet look."
小提示:如果特别在意「像不像本人」,可以用
gpt-image-1开--input-fidelity high;如果更在意「融进画风」,默认模型就够了。我这次选的是「画风优先」。
Step 2:拆解原视频,找到要换的镜头
不能一股脑把 41 秒全丢进模型(后面会讲为什么),得先看清结构。我用 ffmpeg 做了两件事:
- 抽帧拼成一张「联系表」,一眼看清谁在第几秒、什么镜头;
- 检测转场切点,让后面分段的接缝正好落在原片真实剪辑处(这样拼起来最不突兀)。
# 找转场切点
ffmpeg -i video.mp4 -filter:v "select='gt(scene,0.15)',metadata=print" \
-f null - 2>&1 | grep -oE "pts_time:[0-9.]+"拆完得到一张「分镜处理表」:哪几段有 Ken(要重生成)、哪几段没有(原片保留)。
Step 3:切片 + 传到公网(R2)
Seedance 的参考素材必须是公网 URL(它自己去下载),所以本地文件要先上传。我用的是 Cloudflare R2:
- 把每个「有 Ken 的镜头」按切点切出来、去掉音轨;
- 连同 Step 1 的卡通角色图,一起传到 R2,拿到链接。
Step 4:逐段替换(Seedance 参考生成)
对每个要换的镜头:
参考视频= 原片那一段(决定动作、运镜、时长);参考图= 卡通角色设定图(决定长相);提示词= 「把画面里出现的人替换成这个角色,动作保持一致,保持 XX 画风」。
我实际用的 prompt(每段都带上同一段角色描述,保证前后一致):
# 复用的角色描述,拼进每段提示词
GIRL="a friendly 3D Pixar-style girl with round glasses, dark shoulder-length hair \
with bangs, a khaki short-sleeve tee, khaki cargo pants, grey sneakers and a small \
crossbody bag"
# 例①:开门亮相那段
--prompt "Use the reference video as the main guide for camera, timing and motion. \
A tall wardrobe/box door is open and a character is revealed inside striking playful \
poses. Replace that revealed character with $GIRL. She performs the exact same reveal \
and posing motion, same body movements and timing, medium shot. Keep the warm indoor \
lighting and glossy Toy Story 3D cartoon rendering, consistent character."
# 例②:结尾三人同框——注意「去品牌化」措辞,绕开版权过滤
--prompt "... A hooded/other character interacts with a small cowgirl toy figure and a \
toy horse figure. Replace ONLY that character with $GIRL; keep the two toy figures \
EXACTLY as in the reference video, unchanged. Same movements and timing. ..."
# 每段调用的骨架都一样,只换 ref-video / duration
seedance --model seedance-2.0 \
--ref-video <该段的公网URL> --ref-image <角色图公网URL> \
--ratio 16:9 --duration <4-15> --resolution 1080p --no-audio多段可以并行提交、一起等,省时间。没有 Ken 的镜头(片头翠丝喊人、中间的过渡)直接跳过,用原片。
Step 5:合成(ffmpeg)
模型只能出 16:9,而原片是 4:3,所以每段生成完还要:
- 中心裁剪 16:9 → 4:3,恢复原始构图;
- 微调时长,让每段和原镜头槽位对齐(这样音画不会错位);
- 按顺序拼接:
原片片头 + 生成段 + … + 原片过渡 + 生成结尾; - 最后把原片的整段音频贴回去。
成品就出来了:
✅ 最终成品:换完人的完整 41 秒
踩过的坑(这几条最费时间)
- 15 秒上限:Seedance 单次最长 15 秒,41 秒的片子必须分段,长镜头还得对半切。
- 只出 16:9:4:3 直接转会裁掉上下(人物容易被裁掉脚)。解法是把 4:3 先 pillarbox 补成 16:9(左右加黑边、人物居中)再生成,最后裁回来。
- 版权过滤:结尾有翠丝和马(皮克斯角色太好认),输出好几次被模型的版权检测拦下来。它是非确定性的——提示词去品牌化(说「一个牛仔玩偶」而不点名)+ 自动重试几次通常能过。
- 神似而非本人:真人→卡通→视频,经过两次生成,最终角色是「认得出是她」,但不是精确本人。这是「画风优先」的取舍。
- 分段接缝:同一个长镜头被拆成两段独立生成,背景会有轻微跳变;把切点放在原片真实剪辑处能最大程度掩盖。
小结
整条链路其实就五步:gpt-image 卡通化 → 拆分镜 → 切片上传 → Seedance 逐段换人 → ffmpeg 拼接配音。
真正的难点不在某个工具,而在认知:想清楚「它是重新生成、不是抠图替换」,剩下的就是围绕 15 秒上限、比例、版权过滤这些约束去设计流程。
第一次跑通花了点功夫,但流程沉淀下来之后,换个角色、换个原片再做一条,就很快了(我后来又用同样的流程做了一条 Alan Walker 版的)。
⚠️ 说明:这里用作素材的是网上找到的一条二创视频,并非《玩具总动员》的官方片段;片中出现的角色版权归迪士尼 / 皮克斯所有。本文只作个人学习与技术分享用途,请勿商用。
工具清单:gpt-image(卡通化)、Seedance 2.0(参考生成视频)、Cloudflare R2(公网托管)、ffmpeg(切片与合成)。