会说话的手绘人物视频
一张定妆图,派生出整套人物状态,让固定角色在画面里说话、眨眼、讲话时头和身体分开动。成本几乎为零(不用视频大模型),每期都是同一张脸,画面永不崩。
成品两种形态:
- 独立短片(15–60 秒竖屏,可直接发布或置顶)
- 叠加到已有视频(在片尾或某一屏的空档处弹出,讲几句引导话)
三条铁律,破一条就得返工
- 不做 AI 对口型。 中文唇形同步在零点几秒内必穿帮,越做越假,比没有人还伤;这类模型还贵。走老动画的三态嘴型帧替换:闭 / 微张 / 大开,跟着配音的能量换。
- 一张脸锁死。 每次派生状态帧都必须从同一张锚点图图生图,提示词写明"其他一个像素都不许动"。同一角色出现两套脸,观众一眼就乱。
- 手不入画。 AI 画手必崩。定妆时就裁到胸口或让手在画外,后期任何姿态都不要试图让手入画。
流程
第 1 步 定妆:出锚点图
按 references/character-sheet.md 的提示词要素出 2 版候选给用户挑,挑定一版锁为锚点图,之后所有派生都从它来。图上不要有人造水印文字(工具自动加的"AI 生成"标识别裁,发布要标)。
第 2 步 派生状态帧
从锚点图图生图派生 4 张:闭嘴(基底)、微张、大开、闭眼。input_fidelity 取 0.95–0.96,提示词必须逐项列举"要保留什么"。
派生后整幅会有约 1.2% 的重绘差异,绝不能整张对切,只能按 ROI 局部贴。
统一命名放进 character/:shut.png、half.png、open.png、blink.png。
坐标在 1024×1536 基准图上量(references/character-sheet.md 有实测值和量法)。
第 3 步 配音
scripts/01_build_voice.py:edge-tts 逐句合成、ffmpeg 实测每句时长、写 配音时长.json。
时长必须实测,不能按字数估——后面每一帧的嘴型、字幕、姿态全靠它对齐。
台词语速压到 +6% 左右,句间留 0.26–0.30s 气口,开头 0.35s、结尾 0.55s。
第 4 步 合成
两条产线,脚本都在实战中跑通过,复制到工程目录后只改文件顶部的 CONFIG 常量(尺寸、坐标、摆位),逻辑别动:
| 产线 | 脚本 | 做什么 |
|---|---|---|
| A 独立短片 | scripts/02_make_short.py |
构图抬升 + 头身扭动 + 嘴型 + 眨眼 + 呼吸推拉 + 字幕 + 图形引导 |
| B 叠加片尾 | scripts/03_make_tail.py |
渐暗调色 + 人物滑入 + 说话 + 字幕 + 与原片拼接 |
关键技术分别在 references/motion-and-compose.md(形变与构图)和 references/tail-overlay.md(叠加、纸底、调色、拼接)。
第 5 步 验收
必须逐项过,别凭感觉说"好了":
- 帧间差自检——抽连续帧算灰度差,突变 >3 就是有抽搐(见
references/pitfalls.md第 1 条) - 抽关键帧看图:嘴型三态、眨眼帧、人物边缘有无方块、字幕有无被裁
- ffmpeg 查规格与音量:竖屏 1080×1920、时长、
mean_volume/max_volume - 让用户在手机上播一遍听声音——音量滑块这类事故只有耳朵能验
- 输出目录里只放一个能发的片子,旧版移进
旧版/
环境
pip install edge-tts pillow numpy
# ffmpeg:装系统 ffmpeg,或 pip install imageio-ffmpeg(脚本会自动找)
脚本不写死任何路径:TIV_ROOT 环境变量或脚本所在目录即工程目录。
工程目录约定
工程目录/
character/
shut.png half.png open.png blink.png # 状态帧,命名固定
配音/1.mp3 ... # 01 生成
配音时长.json # 01 生成
src.mp4 # 仅产线 B 需要
frames/ frames_out/ # 中间帧,脚本自建
跑法:
python 01_build_voice.py --root .
python 02_make_short.py # 或 03_make_tail.py
常见五个坑(详见 references/pitfalls.md)
- 画面抽搐 → 每帧用整数尺寸缩放,倍数进位时整幅横跳 1px。改用浮点窗口
Image.EXTENT一次采样。 - 人物像张照片 → 靠能量阈值判闭嘴,段内低能量帧太多。改成"只在实际开口区间内开合"。
- 字幕比声音慢半拍 → 句尾拖尾把下一句盖住了。拖尾不许越过后一句开口。
- 贴上去露方块 → 人物图自带纸纹淡花。按颜色距离把近纸色像素统一压平。
- 只剩一个头 → 遮罩用了椭圆。改用行/列渐变,下沿单独控制。
随附资源
| 路径 | 内容 |
|---|---|
references/character-sheet.md |
定妆提示词要素表、状态帧派生模板、嘴/眼坐标、眨眼做法 |
references/motion-and-compose.md |
头身解耦公式、解剖位参数、姿态表、微动、贴顶裁切与浮点采样 |
references/tail-overlay.md |
量版面找空位、纸底压平、遮罩、调色、拼接、音量、字幕对齐 |
references/pitfalls.md |
按症状查原因与修法,动手前先扫一遍 |
scripts/01_build_voice.py |
edge-tts 分段配音 + 实测时长 |
scripts/02_make_short.py |
独立短片产线(跑通过的版本,改顶部 CONFIG 即可) |
scripts/03_make_tail.py |
叠加片尾产线(跑通过的版本,改顶部 CONFIG 即可) |
assets/character-sample.jpg |
已完成角色的风格参照(手绘绘本 + 宣纸底 + 朱红点缀) |
复用范围
定妆图、三态帧、嘴型/眼位坐标属于角色资产,换角色就得整条重做;配音、构图、形变、叠加逻辑与角色无关,直接复用。给同一角色改台词时,只需改 LINES 重跑,不必重新出图。
一句话原理
人眼判断"这是个人"靠的不是嘴形精准,而是嘴在动、眼会眨、头有微动这三件事同时成立。所以宁可用三态嘴型这种"假得很老实"的做法,也不要用唇形同步这种"假得很努力"的做法。