AI手书创作全流程:关键帧、图生视频与TTS配音实战
这次我们来看一个同人手书创作流程,目标作品是《残虹》,副标题里那句“鉴定师,我会一直看着你”,基本就是整支片子的剧情锚点。和传统手绘动画不同,这套流程不靠逐帧手绘,而是用 AI 图像生成铺关键帧,用图生视频把静态画面动起来,再用 TTS 和剪辑工具把配音、字幕、成片收口。整个链路打通后,一个人也能完成一支带剧情、带配音、带镜头节奏的短片。
这个方向最大的痛点不是某个模型不会用,而是流程太碎。今天出角色图,明天做动态化,后天配音,每一步都换一个工具,最后发现角色长得不一样、配音对不上嘴、分辨率混乱,所有素材都无法拼接。所以这篇文章的核心不是单纯推荐某个绘图模型,而是把“分镜 → 关键帧 → 动态化 → 配音 → 字幕 → 合成”拆成一条可落地的生产流水线,并给出每一步的验证方法和排查思路。
先给读者一个判断依据:如果你已经有 NVIDIA 显卡,想用 AI 辅助做剧情向同人动画或游戏二创短片,这篇文章可以直接收藏;如果你只是做单张插画,不需要视频化,也建议看关键帧生成和角色一致性这两节,能减少大量返工。下面内容不绑定某个具体开源仓库,而是按通用工具链展开,所有版本、路径、接口参数都以你实际部署的环境为准。
1. 手书项目定位与核心能力速览
从标题看,这个创作目标可以拆成几个关键要素:《残虹》是作品名,“鉴定师”是核心角色身份,“我会一直看着你”是关键台词。整支手书的画面、配音、字幕都应该围绕这几个锚点展开。虽然这不是一个能被git clone的开源项目,但完全可以用一套开源工具组合来落地。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 同人动画手书创作(AI 辅助生产流程) |
| 核心环节 | 角色设定、分镜脚本、关键帧生成、动态化、TTS 配音、字幕、剪辑合成 |
| 主要工具 | 图像生成 WebUI / ComfyUI、图生视频工具、补帧工具、TTS 服务、剪辑软件 |
| 推荐硬件 | NVIDIA GPU 优先,显存大小决定可测试的分辨率范围 |
| CPU 可用性 | 字幕、时间轴、部分 TTS 可跑 CPU;图像生成和视频生成建议 GPU |
| 启动方式 | 图像生成工具走 WebUI / ComfyUI,TTS 可走本地 API 服务 |
| API 能力 | 多数本地图像生成工具提供 HTTP API,可做批量调用 |
| 批量任务 | 按分镜编号批量出关键帧、批量生成配音、批量导出片段 |
| 输出形式 | 视频成片(mp4/mov)+ 工程文件 + 提示词文本 |
| 适合场景 | 剧情向同人动画、游戏二创、视觉小说演出、动态封面 |
这里要特别说明一个认知:手书不是“点一下生成视频”就能完成的,它是多阶段生产。越早把流程固定下来,后面返工成本越低。建议从第一步开始就建立统一的目录结构和命名规则,后面所有批量任务都会依赖这套规则。
2. 适用场景与使用边界
这组技术适合的创作者很明确:想做剧情向短片、但手绘能力不足或时间有限;需要大量角色差分图,但不想每张都从零画;需要配音但找不到合适声优;希望用 API 把图像生成、TTS 接进自己的自动化流程里。
它不适合的场景也要说清楚。如果你需要的是传统手绘动画那种精细逐帧张数,AI 生成的中间帧还需要大量手工修正;如果你要直接把某个角色的官方立绘拿来做训练或直接叠图,就必须先确认授权边界。标题里的“异环”如果对应的是已有游戏或动画的世界观,同人创作前要去查对应作品的二次创作政策。绝大多数游戏厂商允许非商业同人,但允许范围和禁止项各不相同,不能想当然。
使用边界部分必须重点关注三件事:第一,不要用 AI 生成画面冒充官方原画或官方预告;第二,不要用未经授权的真人肖像、真实声纹做角色或配音;第三,BGM、音效、字幕字体都要检查授权,尤其是要公开发布或参与活动时。还有一点容易被忽略:如果你的手书会用到“某角色声音”,而你是用真实声优的音频去克隆,这基本属于侵权,绝对不能用于公开传播。
合规不是这篇文章的附加项,而是流程设计的一部分。在搭建环境之前,先确认你的创作素材来源,能省掉后面很多不必要的麻烦。
3. 环境准备与前置条件
先做环境检查。手书生产链路里最吃硬件的环节是图像生成和图生视频,所以第一步是确认机器状态。
python --version git --version nvidia-smipython --version用于确认 Python 环境,图像生成工具一般建议 Python 3.10 或 3.11,具体以工具官方要求为准;nvidia-smi用来查看驱动和当前显存占用,也能确认 GPU 驱动是否正常。没有 NVIDIA 显卡也能做部分环节,但出图速度会明显受限,尤其是视频动态化阶段。
磁盘空间要提前规划。图像模型文件动辄几个 GB,视频片段也是占空间大户。建议使用下面这种目录结构,把提示词、角色设定、关键帧、视频片段、配音、字幕、最终输出全部分开。
project/ ├── 00_prompts/ │ ├── character_prompt.md │ └── shot_list.csv ├── 01_character/ │ ├── 01_ref_front.png │ ├── 02_ref_side.png │ └── lora/ ├── 02_keyframes/ │ ├── shot_001/ │ └── shot_002/ ├── 03_video_clips/ │ ├── shot_001.mp4 │ └── shot_002.mp4 ├── 04_voice/ │ ├── line_001.wav │ └── line_002.wav ├── 05_subtitles/ │ ├── shot_001.srt │ └── shot_002.srt └── 06_output/ └── final_cut.mp4依赖安装阶段最容易出问题的不是某一个库装不上,而是多个 AI 工具之间 Python 环境冲突。比如图像生成工具需要 PyTorch 的 CUDA 版本,图生视频工具可能依赖另一个 Python 版本,如果全部装在同一个环境里,经常出现依赖被覆盖的情况。更稳妥的方式是给不同阶段分别创建虚拟环境,或者直接使用带独立运行时的整合包。
端口规划也要提前做。图像生成 WebUI 和 TTS 服务可能同时在本机监听端口,常见端口冲突点有7860、5000、8000。启动前可以先检查端口占用:
# Windows netstat -ano | findstr 7860 # macOS / Linux lsof -i :7860如果端口被占用,就给服务指定新端口,不要两个服务抢占同一个端口。后面做 API 批量调用时,端口写错或服务没启动是最常见的连接失败原因。
4. 制作流程总览:从分镜到成片
手书生产不是从“画图”开始的,而是从“脚本”开始的。没有分镜就直接出图,大概率会陷入反复返工。完整流程建议按下面这条链路走。
第一步写分镜。把《残虹》这支短片按镜头拆开,每个镜头包括画面内容、景别、动作、台词、时长。比如开头镜头可能是“鉴定师站在残虹遗迹前,缓慢抬起头”,对应台词“我会一直看着你”。分镜脚本不需要画得多好看,文字能说清楚画面就行,但一定要给每个镜头编号,后面所有文件都用这个编号。
第二步做角色设定。先确定“鉴定师”这个角色的外观关键词:发色、发型、服装、配饰、道具、整体色调。这一步产出角色参考图和固定提示词,目的是让后续所有关键帧都长得一致。
第三步生成关键帧。按分镜编号批量出图,一个镜头至少生成 4 到 8 张候选图,选最符合分镜的一张作为动态化输入。太多人在这里急着进入视频生成,结果角色崩了,后面整个镜头都废掉。
第四步做动态化。把选中的关键帧交给图生视频工具,让静态画面产生运动。这个阶段重点看运动幅度是否合理,画面是否会闪。如果画面闪,可以在工具里增加帧数或降低运动强度,也可以通过补帧工具让镜头更流畅。
第五步配音和字幕。先写台词文本,再用 TTS 批量生成音频,回填到对应分镜。字幕文件按镜头时间轴生成 SRT 或 ASS。
第六步剪辑合成。把视频片段、配音、字幕拖进剪辑软件,调整每个镜头的先后顺序和时间长度,加入转场和音效,最终导出成片。
这条链路每往后走一步,返工成本都会翻倍。所以不要在还没验证角色一致性时,就急着生成 100 张图;不要在没有跑通一个镜头的情况下,就批量处理整支片子。先跑通单镜头,再复制到全片。
5. 关键帧生成与角色一致性验证
关键帧是整个手书的画面地基。这里要注意,文生图直接生成的画面很难保证角色一致,必须把角色参考图、固定提示词、LoRA 或 ControlNet 组合起来用。
最基础的做法是固定角色描述词。比如“鉴定师”这个角色,你可以把下面这组词写入每一张图的提示词,形成角色卡。
character: jian_ding_shi, short dark blue hair, gold eyes, black coat, silver badge, calm expression每次生成时都带上这组词,配合负面提示词过滤常见崩坏:
negative_prompt: lowres, bad anatomy, bad hands, extra fingers, missing fingers, watermark, text, logo这样只能减少随机性,不能保证完全一致。更强的做法是先生成一张角色正面参考图,然后用图生图模式让模型围绕参考图继续生成其他角度。再进阶一步是训练一个角色 LoRA,从多张同一角色的图片中学习特征,后续出图时加载 LoRA,角色一致性会明显提升。LoRA 需要准备 10 到 30 张同一角色的图片,训练参数需要按显卡显存来调,不建议新手一上来就训练。
如果用图像生成 WebUI,可以通过接口批量出图。下面是一个通用调用示例,端口、接口路径和参数会根据你部署的 WebUI 版本有差异,执行前先确认本机服务已启动。
import requests url = "http://127.0.0.1:7860/sdapi/v1/txt2img" payload = { "prompt": "masterpiece, best quality, jian_ding_shi, short dark blue hair, gold eyes, black coat, silver badge, looking at viewer, ruins background", "negative_prompt": "lowres, bad anatomy, bad hands, extra fingers, watermark, text, logo", "steps": 25, "width": 640, "height": 960, "batch_size": 4, "cfg_scale": 7.0, } resp = requests.post(url, json=payload, timeout=300) if resp.status_code == 200: print("生成成功") else: print(resp.status_code, resp.text)出图后一定要做一致性验证。先看角色脸型是否一致,再看服装配色有没有漂移,最后看手部、眼睛、发梢这些细节是否崩坏。如果几张图角色长得完全不像,优先检查提示词是否统一、参考图是否生效、LoRA 权重是否合适。如果只是个别张手崩了,可以用局部重绘修一下,不需要重跑整批。
关键帧阶段还有一个容易忽略的问题:分辨率。手书最终是视频,所以关键帧不能只用低分辨率。常见做法是先出低分辨率找构图,确定后再放大重绘输出高分辨率关键帧。直接一上来生成超高分辨率,可能出现构图变形、细节丢失,而且显存占用会明显增加。
6. 动态化:图生视频、补帧与批量输出
关键帧确认后,进入动态化阶段。这一步把静态画面变成短视频片段,比如“鉴定师抬头”这个动作,就是从一张抬头前的关键帧生成一个持续数秒的镜头。
图生视频工具的操作逻辑基本类似:输入一张参考图,设置运动幅度、帧数、分辨率,然后让模型在画面内部生成运动。运动幅度不能盲目拉高,幅度越大,画面结构越不稳定,人物越容易扭曲。比较好的做法是先用小幅度测试,确认人物不变形,再加动作细节。
如果视频画面出现闪烁、跳变,有两个调整方向。一是降低运动幅度,让变化更平缓;二是增加帧数,让运动衔接更细腻。部分图生视频工具支持补帧功能,补帧后画面会更流畅,但渲染时间会变长,对显存和内存的要求也会提高。
这个阶段可以做批量任务,但建议按分镜编号逐批处理,而不是一个脚本把所有镜头全部丢进去。批量处理时,输入目录结构要清晰,比如02_keyframes/shot_001.png对应输出03_video_clips/shot_001.mp4。处理完一个镜头,先检查这个镜头,再处理下一个。批量任务中断后,也要能够跳过已完成的分镜,从上次失败的位置继续。
批量动态化里最容易出问题的不是模型,而是输入文件命名。如果分镜编号有冲突,或者输入图片尺寸不统一,视频输出很容易对不上号。建议在批量脚本里做三件事:检查输入图片是否存在、检查输出文件是否已存在、记录失败日志。
# 伪代码,用于说明批量任务的基本结构,具体命令按实际工具调整 for img in 02_keyframes/shot_*.png; do name=$(basename "$img" .png) if [ -f "03_video_clips/$name.mp4" ]; then echo "skip $name" continue fi echo "process $name" # 此处调用图生视频命令 done动态化阶段还需要考虑镜头语言。整支手书不能所有镜头都是“图片轻微动两下”,要有推、拉、摇、固定景别的变化。不同景别和运动方式的镜头交错出现,节奏感才会出来。如果你对镜头调度不熟,可以先把分镜脚本里的景别要求写清楚,动态化时再按镜头的情绪选择运动幅度。
7. TTS 配音、字幕与剪辑合成
画面动态化跑通后,先把配音做出来。标题里的台词“我会一直看着你”是全片的核心,不要只在最后出现一次,可以把它放在开头或高潮位置,让台词和“鉴定师抬头看镜头”这个画面形成呼应。
TTS 工具选型看两个点:角色音色是否稳定、是否支持批量调用。先把台本整理成纯文本,按行拆开,每行对应一个配音片段。如果你需要固定的“鉴定师”音色,测试阶段就锁定一个声音配置,不要每段台词换一个音色。TTS 服务通常支持参考音频,用一段目标音色音频让模型学习音色特征,之后批量生成的音频就会保持一致。
下面是一个通用 TTS 批量调用示例,服务地址、鉴权方式和请求字段需要按你本机 TTS 服务实际接口调整。
import requests tts_url = "http://127.0.0.1:5000/tts" lines = [ {"text": "我会一直看着你。", "voice": "jian_ding_shi"}, {"text": "残虹,这就是你的选择吗。", "voice": "jian_ding_shi"}, {"text": "鉴定师,别走。", "voice": "other_role"}, ] for idx, line in enumerate(lines): resp = requests.post(tts_url, json=line, timeout=120) if resp.status_code == 200: file_path = f"04_voice/line_{idx:03d}.wav" with open(file_path, "wb") as f: f.write(resp.content) print("saved", file_path) else: print("failed", idx, resp.status_code, resp.text)配音生成后不要直接合成,先按分镜顺序试听一遍。重点检查台词节奏是否符合画面。TTS 生成的语音往往比较平,如果台词需要强烈情绪,需要在文本端加标点或者在上游工具里调整语速、情感。逐字逐句生成音频的最大好处是可以对单句重生成,不需要整段重新跑。
字幕建议单独生成 SRT 文件,不要直接烧死在视频里,这样后期修改错别字或调整时间轴都不需要重新导出视频。字幕的时间轴可以按配音音频的实际时长对齐。机器自动对齐不一定准确,发布前需要人工过一遍,特别是标点、断句和“多音字”错读问题。
剪辑合成阶段,把视频片段、配音、字幕、音效和 BGM 按分镜顺序拖入时间轴。剪辑时不要只做拼接,要处理镜头的转场。转场越简洁越好,黑场过渡适合情绪转折,硬切适合动作戏,闪白适合回忆或冲击性画面。如果视频片段之间有跳变,可以通过微调每个视频片段的起点和终点来平滑衔接。
8. 资源占用与性能观察
手书生产链路里,图像生成和图生视频是资源消耗最大的两个环节,显存不足、生成变慢、进程崩溃都集中在这两个阶段。先学习观察资源占用,再决定参数怎么调。
观察显存和 GPU 占用最简单的方式是每隔一段时间刷新一次nvidia-smi,也可以让它持续刷新:
nvidia-smi -l 2这个命令每 2 秒刷新一次,能实时看到显存占用、GPU 利用率和进程列表。如果你在 Windows 上,可以用任务管理器里的 GPU 面板观察。
显存占用会随分辨率和 batch 数明显变化。分辨率越高,显存占用越大;批量生成张数越多,显存占用也越大。显存不足时,优先降低分辨率和 batch size,不要一次性丢太多任务。还有一个常见优化是把batch_size调成 1,配合批量脚本逐张生成,这样慢但稳定。
如果做动态化时内存持续走高,常见原因是视频帧数据在内存里堆积。建议单镜头处理完就释放当前进程,不要在一个进程里跑几千帧。输出视频的帧率和分辨率也要和实际发布平台匹配,盲目输出 4K 长视频,渲染时间会成倍增加,而且不一定用得上。
CPU 和 GPU 的差异也要注意。图像生成、视频生成和补帧这类计算密集型任务,GPU 提升非常明显;但 TTS 和字幕对齐这类轻量任务,CPU 也能完成。所以合理做法是:GPU 专注出图和动态化,CPU 跑配音和字幕生成,两条线并行处理,能明显缩短整体制作时间。
9. 常见问题与排查方法
这组问题在手书制作里非常典型,第一次跑流程可以直接对照排查。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 角色脸型每张都不一致 | 提示词不统一、没有使用角色参考图或 LoRA | 检查提示词是否固定;确认参考图功能开启 | 建立角色卡;使用图生图或训练角色 LoRA |
| 手部、眼睛崩坏 | 模型能力或提示词权重不足 | 单独生成特写测试 | 使用负面提示词;局部重绘修正 |
| 生成时提示显存不足 | 分辨率或批量数过高 | 运行 nvidia-smi 查看显存占用 | 降低分辨率、batch size;关闭后台占用显存的进程 |
| 视频画面闪烁、跳变 | 运动幅度过大、帧数不足 | 输出片段后逐帧检查 | 降低运动幅度;增加帧数或补帧 |
| 配音和画面不同步 | 配音时长和分镜时长不匹配 | 检查音频波形和视频片段长度 | 调整片段入出点;重新生成对应台词 |
| TTS 接口调用失败 | 服务未启动、端口不对、请求体字段不匹配 | 检查服务日志,落盘测试请求 | 按实际接口文档调整 URL、鉴权和字段 |
| 批量任务中断后重复处理 | 脚本没有跳过已完成文件 | 查看输出目录已有文件 | 在批量脚本中增加已存在输出则跳过的逻辑 |
| WebUI 页面打不开 | 端口被占用或服务启动失败 | 查看启动日志、检查端口 | 换端口启动或关闭占用端口的进程 |
除了表格里的这些问题,还有一个很常见的“隐性失败”:图像生成服务虽然成功返回了结果,人眼检查后却不符合剧情要求。所以每个环节都要保留人工检查点。生成关键帧后先看一遍,动态化片段生成后先看一遍,配音合成前先试听一遍。自动化流程负责提效,人工负责判断质量。
10. 最佳实践、合规要求与下一步验证
最后把这套流程的工程化建议整理一遍。
第一,先小步跑通单镜头。不要一上来做整支手书,挑选《残虹》里最核心的一个镜头,比如“鉴定师看着镜头说出‘我会一直看着你’”,把从关键帧到合成视频的整条链路跑通。这个镜头如果能完成,整支片子就完成了百分之八十。
第二,建立提示词和参数版本记录。角色提示词、负面提示词、采样步数、分辨率、运动幅度,这些参数都要存进00_prompts目录。没有参数记录,换个电脑再打开,你根本不知道自己当时怎么生成这张图的。
第三,使用增量输出。每个分镜单独输出,不要把所有结果覆盖到同一个文件。批量脚本要写成“已完成跳过、失败记录日志”的形式,方便断点续跑。
第四,注意合规边界。如果你要公开分享或参加活动,先确认《异环》或对应作品的二创政策;AI 生成画面建议做明确标注;配音演员的声音、BGM、音效、字体都要使用已授权素材;不要用真人声纹做未经授权的角色配音。
第五,效果复核后再发布。AI 生成的内容难免有异常帧、错误文字、多音字误读,发布前把成片完整播放一遍,至少要检查字幕错别字、口型对齐、语音情感、转场是否合理。
后续可以从两个方向继续扩展。一个是增加更多自动化:把关键帧批量生成、动态化、语音合成接入同一个任务队列,做成一个独立的批量渲染脚本;另一个是提升表现力:为“鉴定师”角色训练更精细的 LoRA,加入可控姿势和镜头调度,让镜头语言更接近真正的动画分镜。建议先把这一版的流程跑通,再决定往哪个方向投入时间。
做手书和写代码一样,先跑通最小闭环,再谈复杂优化。
