尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI漫剧制作全流程:从脚本到成片的自动化流水线

AI漫剧制作全流程:从脚本到成片的自动化流水线 在实际 AI 内容生产中“AI 漫剧”并不是一个单一模型完成的工作而是一条由文本生成、图像生成、语音合成、视频剪辑串起来的制作流水线。过去做一部漫剧需要编剧写剧本、分镜师画镜头、原画师做角色、配音演员录台词、剪辑师拼成片现在借助大语言模型、扩散模型和自动化剪辑脚本一个小团队甚至一个人就能在几天内产出一条完整片段。本文以“穿成将军嫡女绑定废柴攻略系统女主摆烂躺平系统惩罚转嫁战神”这个剧情设定为示例完整演示如何从一句梗概开始把剧情拆成结构化脚本再生成角色立绘、分镜画面、配音音频最后用 ffmpeg 合成可发布的 AI 漫剧片段。这篇文章适合正在做短视频漫剧、AI 内容工具评测、或者想用 AI 完成“文字转视频”流程的开发者。阅读后会得到一条可复现的工程链路如何设计剧情 Prompt、如何控制角色一致性、如何用 Python 批量生成素材、如何排查音画不同步和画面比例不一致等问题。涉及具体工具时我只给通用的工程思路和示例代码不绑定某个平台的私有能力实际落地前需要根据你使用的模型版本和接口文档做调整。1. 先理解 AI 漫剧的生产链路拆清环节再动手很多初学者拿到一个网文梗概后第一反应是打开生图工具生成一张角色图再打开视频生成工具生成一段视频。这种做法可以在几分钟内看到“动态效果”但很难支撑一个完整的故事片段角色脸会变、场景不连续、台词和口型对不上、时长一会儿长一会儿短。问题不在于某个 AI 工具不够强而是没有把漫剧生产拆成一条可控制的流水线。1.1 AI 漫剧与传统动画、动态漫画的差别AI 漫剧在形态上更接近“带有限动作的动态漫画”而不是传统意义的 2D 动画。它用静态图像加镜头运镜、局部动态效果和配音来表现剧情因此对画面数量、角色一致性和声音同步的要求更高。维度传统 2D 动画动态漫画AI 漫剧制作主体动画公司多人协作漫画家加剪辑师单人或小团队加 AI 工具画面来源逐帧手绘漫画分镜图AI 生成静态图加局部动画动作表现全动画或有限动画平移、缩放、局部动效镜头运动、表情插值、转场动效角色稳定性有设定集与作画监督由画风保持一致靠 Prompt 约束和参考图控制工时重心原画、中间帧漫画绘制脚本结构化、素材管理和剪辑这个对比说明AI 漫剧的核心难点不在“生成单张图”而在“如何让几十张图看起来是同一个故事里的连续画面”。所以生产链路必须从脚本阶段就开始做结构化控制。1.2 一条主线上的七个环节不管使用什么工具AI 漫剧都可以拆成七个环节剧情梗概一句话或几百字的设定明确主角、冲突、结局。结构化脚本把剧情拆成场次、镜头、动作、台词、情绪。角色与场景设定定义角色外观、服饰、性格关键词以及场景风格。分镜画面生成按照镜头信息生成静态图像。语音合成为每句台词生成对白音频。字幕与时间轴根据音频生成字幕文件保证每句台词的出现时间正确。剪辑合成把图像、音频、字幕、转场拼成一个完整视频。这个顺序不能乱。如果先做画面再写台词角色动作和台词会出现明显割裂如果先配音再生成画面画面构图又很难配合语音情绪。正确做法是先锁定脚本结构再把脚本中的字段作为后续每一步的输入。1.3 为什么用“废柴攻略系统摆烂”做示例“穿成将军嫡女绑定废柴攻略系统”是一个典型的网文题材主角穿越、系统绑定、人物关系冲突强烈。这种题材对 AI 生成非常友好因为剧情里有明确的“指令”和“反指令”系统要求主角攻略战神主角选择摆烂系统惩罚被转嫁战神产生自我攻略。这样的冲突天然可以拆成短镜头和对白适合生成 60 秒左右的漫剧片段。在实际操作中不要直接让 AI“把这段故事做成漫剧”因为这种 Prompt 太笼统。正确做法是先让大模型把故事拆成导演能用的分场信息再让生图模型按分场信息出图。后面的章节会给出具体 Prompt 和代码。2. 环境准备工具选型与目录结构AI 漫剧制作会用到文本模型、图像模型、语音模型和视频处理工具。不同阶段的工具可以来自不同厂商但工程上需要统一管理输入输出格式否则会出现“模型生成的图不能用”“音频节奏对不上”等问题。2.1 工具选型表先按阶段列需求下面只列常见工具类型不针对具体商业产品做优劣排名。实际选择时要重点看三个能力是否有 API、输出格式是否标准化、是否支持批量生成。生产阶段常见工具类型主要输出关注点文本生成大语言模型 API 或开源模型结构化的 JSON、Markdown 脚本是否稳定输出指定字段是否支持长文本图像生成文生图模型、图生图模型PNG、JPG 格式角色图和场景图分辨率、角色一致性、是否支持参考图角色一致性LoRA、角色参考图、固定 Prompt 前缀同一角色的多张图片风格差异、脸部一致性音频生成语音合成 API 或开源 TTSWAV、MP3 对白音频音色稳定性、断句是否自然、是否支持多角色字幕识别语音识别工具或 AI 字幕工具SRT、VTT 字幕文件时间轴准确度、标点恢复视频处理ffmpeg 或剪辑软件MP4 成片画面比例、音频对齐、编码参数在本地开发环境中推荐先用开源或免费额度跑通一条最小链路不要一开始就接入大量付费服务。先确认单张图和单句音频的质量再决定是否批量生产。2.2 本地目录结构按镜头管理素材AI 漫剧最忌讳的是一股脑把所有图片放在同一个目录里。建议按“场次-镜头”建立文件夹保证每张图、每句音频都能和分镜表对应。ai-manhua-demo/ ├── config/ │ ├── story.yaml # 剧情梗概、角色设定、全局风格 │ └── params.yaml # 分辨率、时长、模型参数 ├── scripts/ │ ├── 01_generate_script.py # 调用大模型生成脚本 │ ├── 02_split_shots.py # 脚本转分镜表 │ ├── 03_generate_images.py # 批量生成图片 │ ├── 04_generate_tts.py # 批量生成配音 │ └── 05_compose_video.py # ffmpeg 合成成片 ├── data/ │ ├── script/ │ │ └── episode001.json # 结构化脚本 │ ├── shots/ │ │ └── shot_list.csv # 分镜表 │ ├── images/ │ │ ├── scene_01_shot_01.png │ │ ├── scene_01_shot_02.png │ │ └── ... │ ├── audio/ │ │ ├── scene_01_shot_01_line_01.wav │ │ └── ... │ └── subtitles/ │ └── episode001.srt └── output/ └── episode001.mp4这个目录结构解决两个问题一是生成脚本时可以按文件路径回填数据二是当某张图不符合要求时可以单独替换对应镜头文件不需要重新生成全部素材。2.3 环境检查清单动手前先确认四件事确认 Python 版本建议使用 3.10 或 3.11部分图像 SDK 在旧版本上会有编译问题。确认 ffmpeg 已安装在命令行执行ffmpeg -version如果提示找不到命令需要先安装。确认模型 API Key 已配置不要把 Key 写进代码仓库统一放到环境变量或本地配置文件中。确认输出格式统一图像统一 PNG音频统一 WAV字幕统一 SRT减少后续转换成本。注意不同模型 API 的调用方式差异很大。不要假设“换一个模型后代码不改也能跑”至少要把调用层封装成单独函数后面排查问题时会方便很多。3. 从剧情梗概到脚本提示词设计与结构化输出脚本阶段决定了整条流水线的质量上限。AI 生成了错误场景后期很难修补但脚本字段缺少台词配音和字幕就会断档。所以这里要做的不是让 AI 写出一篇小说而是让 AI 输出一份“生产数据”。3.1 用剧情摘要生成分场脚本以下 Prompt 用于把一句话梗概扩展成几个分场。这里的核心不是“生成更多字”而是要求模型按固定 JSON 输出。你是一名短视频漫剧编剧。请根据下面的剧情梗概为一段60秒的漫剧设计分场脚本。 剧情梗概 现代人沈云舒穿成将军嫡女绑定了一个“废柴攻略系统”。 系统要求她攻略高冷战神顾凌。沈云舒不想做任务选择直接摆烂。 系统发布惩罚但惩罚效果因绑定契约全部转嫁到战神顾凌身上。 顾凌以为沈云舒在暗中为他承受伤害开始疯狂自我攻略。 要求 1. 输出 JSON不要输出解释。 2. JSON 包含 scenes 数组每个 scene 包含 - scene_id: 数字 - location: 场景地点 - time: 时间段 - atmosphere: 情绪氛围 - shots: 镜头数组 3. 每个 shot 包含 - shot_id: 数字 - shot_size: 景别取值 closeup / medium / wide - camera: 镜头运动方式 - visual: 画面描述使用第三人称包含人物位置和动作 - line: 当前镜头中角色的台词没有台词写成空字符串 - speaker: 说话角色名 - emotion: 角色情绪 4. 一共 6 个 scene每个 scene 不少于 2 个 shot。这种 Prompt 看起来长但非常必要。大模型只有明确知道字段结构才会输出可直接解析的数据。如果只写“帮我写个剧本”得到的常是一段散文后续没法批量处理。3.2 解析模型输出把 JSON 转成分镜表模型返回的 JSON 不能直接喂给生图模型还需要转成一张分镜表。建议用 Python 把 JSON 写入 CSV原因有两个一是 CSV 适合手工检查二是后续脚本可以用 pandas 或标准库逐行读取。import json import csv with open(data/script/episode001.json, r, encodingutf-8) as f: data json.load(f) rows [] for scene in data[scenes]: for shot in scene[shots]: rows.append({ scene_id: scene[scene_id], shot_id: shot[shot_id], location: scene[location], time: scene[time], atmosphere: scene[atmosphere], shot_size: shot[shot_size], camera: shot[camera], visual: shot[visual], line: shot[line], speaker: shot[speaker], emotion: shot[emotion], }) with open(data/shots/shot_list.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesrows[0].keys()) writer.writeheader() writer.writerows(rows)这里使用utf-8-sig编码是为了让 Excel 打开 CSV 时不会出现中文乱码。如果后续程序读取 CSV改回utf-8或按实际编码处理即可。3.3 示例分场结果一个“摆烂惩罚转嫁”事件以输入梗概为例一次合理的脚本输出会包含类似下面的内容scene_idlocationtimeatmosphereshot_idshot_sizevisuallinespeaker1将军府正院日压抑1wide沈云舒坐在石阶上手里端着茶系统面板悬浮在眼前今日攻略任务邀请顾凌共进晚膳。系统1将军府正院日压抑2closeup沈云舒皱眉把茶杯放到桌上不做。沈云舒2战神书房夜冷峻1medium顾凌正在批阅军报突然按住心口唔……顾凌2战神书房夜冷峻2closeup顾凌眼神微动看向将军府方向沈云舒你身上到底发生了什么顾凌这样的分镜表已经包含了画面描述、台词和角色情绪。下一步生成图像时主要依据visual字段和角色设定生成配音时主要依据line、speaker和emotion字段。3.4 常见坑角色名字不稳定、输出结构乱现象同一角色在不同镜头里名字变成“她”“沈小姐”“云舒”导致画面描述混乱。原因Prompt 里没有明确要求角色名固定。解决在 Prompt 中加入“角色名必须严格使用沈云舒、顾凌、系统不要使用代称”。现象模型偶尔输出 Markdown 代码块不是纯 JSON。原因模型指令约束不够。解决在 Prompt 最后加“严格输出合法 JSON不要使用代码块标记不要添加注释”解析时再做一层异常处理。4. 分镜规划与视觉生成保持角色一致性分镜表生成后视觉生成的难点集中在两件事第一不同镜头里同一个角色看起来像同一个人第二场景氛围与剧情情绪匹配。AI 生图模型对“漂亮”很在行但对“连续统一”往往不在行所以需要用工程手段补偿。4.1 分镜表字段如何改为生图 Prompt生图模型不适合直接读取整段 CSV 里的visual文字。因为visual是叙事性描述模型可能把无关信息画进去。更可靠的方式是把visual和角色设定卡拼成一个固定结构的 Prompt[角色外观] 沈云舒黑发高马尾浅蓝长裙腰间玉佩眼神清醒动作随意。 顾凌玄色铠甲墨发束冠面容冷峻坐在书房中。 [场景] 古风将军府正院白天石阶茶桌。 [画面内容] 沈云舒坐在石阶上手里端着茶系统面板悬浮在眼前她表情不耐烦。 [景别] wide shot [负面提示词] lowres, bad anatomy, bad hands, extra fingers, text, watermark, low quality, jpeg artifacts注意几点角色外观要放在最前面且每个镜头都要重复而不是只在第一张图里写。负面提示词里必须包含text和watermark否则画面中很容易出现乱码文字和平台水印。景别字段要使用模型认识的标准词closeup、medium、wide不要用“近景”“远景”这种中文模糊词。4.2 统一角色外观的三种做法做法适用场景优点缺点固定 Prompt 前缀快速验证、单集试做简单直接不需要额外训练不同批次仍可能漂移参考图控制角色有成品立绘后角色面容更接近参考图依赖图生图能力画面容易抄错场景角色 LoRA连续多集、长剧集角色一致性最强需要准备数据集和训练时间在实际项目里三种方法可以组合。第一集先用固定 Prompt 前缀跑通确定角色立绘后再做参考图或 LoRA。不要一开始就追求 LoRA因为制作成本高而且分镜阶段素材不够时训练效果也差。4.3 批量生成图片的 Python 示例以下代码演示如何读取 CSV 分镜表为每一行拼接 Prompt并调用图像生成 API。这里把模型调用封装成generate_image函数便于替换成不同服务商的 SDK。import csv import os import time def generate_image(prompt, output_path, negative_prompt): 调用生图模型并保存图片。实际参数以所用 API 文档为准。 # 伪代码替换成实际模型 SDK # result model.generate(promptprompt, negative_promptnegative_prompt) # result.save(output_path) print(f生成图片: {output_path}) def build_prompt(row, character_config): character_part .join( f{name}{desc} for name, desc in character_config.items() ) scene_part f{row[location]}{row[time]}{row[atmosphere]}氛围 return ( f[角色外观]\n{character_part}\n\n f[场景]\n{scene_part}\n\n f[画面内容]\n{row[visual]}\n\n f[景别]\n{row[shot_size]} shot ) with open(data/shots/shot_list.csv, r, encodingutf-8) as f: reader csv.DictReader(f) for i, row in enumerate(reader): prompt build_prompt(row, character_config{ 沈云舒: 黑发高马尾浅蓝长裙眼神清醒动作随意, 顾凌: 玄色铠甲墨发束冠面容冷峻, }) output_path fdata/images/scene_{row[scene_id]}_shot_{row[shot_id]}.png generate_image(prompt, output_path) time.sleep(1) # 防止频繁请求触发限流这里给每张图设置 1 秒间隔只是演示限流保护。生产环境应根据 API 配额动态调整间隔或者使用异步队列。4.4 常见坑画面文字乱码、人物比例歪、脸不一致如果画面中出现“攻略任务”四个字的乱码优先在负面提示词中加入text, letters, words并在正面 Prompt 中写no text。如果人物手指或腿形异常加入bad hands, extra fingers到负面提示词并避免画面中出现过多人物。如果同一角色脸不一致优先检查是不是换了参考图或者角色描述缩写。建议所有镜头使用同一段角色外观描述不要每次改写。注意AI 生图模型天然存在随机性。不要期望同一 Prompt 每次生成完全一样的脸。生产流程里应加入人工挑选环节或者批量生成多张后按清晰度、人物完整度做过滤。5. 配音、字幕与剪辑合成图像生成完成后项目里会出现几十张静态图。要让它们变成漫剧还需要在每个镜头中填入配音并让画面停留时长与台词时长匹配。这里最核心的是时间轴计算。5.1 配音生成按字段控制每一句台词TTS 模型需要知道是谁在说话、情绪是什么。如果只是把整段文字丢给 TTS不同角色的音色无法区分。正确做法是在脚本 CSV 中为每条台词单独生成音频文件并把文件名写回分镜表。import csv import os def generate_tts(text, speaker, emotion, output_path): 调用 TTS 模型生成音频并保存。实际参数以所用 API 文档为准。 print(f生成配音: {speaker} - {emotion} - {text} - {output_path}) with open(data/shots/shot_list.csv, r, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: if not row[line].strip(): continue output_path ( fdata/audio/scene_{row[scene_id]}_shot_{row[shot_id]}_ fline_1.wav ) generate_tts( textrow[line], speakerrow[speaker], emotionrow[emotion], output_pathoutput_path, )这里在输出中带上了emotion因为 TTS 的好表现更多体现在语气上。例如系统音的“今日攻略任务”应该偏机械顾凌的“唔”应该偏克制沈云舒的“不做”应该偏冷淡。5.2 生成字幕文件用音频时长控制画面最简单的方法是把每句台词和音频时长写入 CSV再转成 SRT。但实际场景中也可以用语音识别工具反向生成字幕比如先用 Whisper 识别译音再输出 SRT 文件。whisper data/audio/scene_01_shot_01_line_1.wav \ --model small \ --language Chinese \ --output_format srt \ --output_dir data/subtitles这里给出一条命令行示例。如果你不需要字幕自动生成也可以使用 TTS 返回的“每句话时间戳”来生成字幕。更可靠的做法是让 TTS 输出每个字的起始和结束时间这样能避免语音识别带来的额外误差。5.3 用 ffmpeg 合成成片图片加音频加字幕合成并不是简单地把图片和音频拼在一起而是要处理镜头时长、转场、音频重叠和字幕压制。下面演示一段较简单的合成逻辑每个镜头只有一张静态图和一段音频图片时长等于音频时长逐镜头拼接。ffmpeg -loop 1 -i data/images/scene_1_shot_1.png \ -i data/audio/scene_1_shot_1_line_1.wav \ -frames:v 120 -c:v libx264 -pix_fmt yuv420p \ temp_shot_1_1.mp4这段命令会把一张静态图循环显示 120 帧约等于 4 秒假设 30fps。如果音频时长不足需要把-frames:v调整为-shortest避免黑屏。更精细的做法是用 ffmpeg 的 filter 一次性合成所有镜头并处理转场但命令会很长先用分镜头合成再拼接更容易排查问题。拼接所有临时视频时可以直接用 concat 协议但条件必须是所有中间视频的编码参数完全一致。ffmpeg -f concat -safe 0 -i filelist.txt -c copy output/episode001.mp4如果中间视频的宽高、编码器不一致会报错。建议在生成每个镜头时统一使用-s 1920x1080 -r 30 -c:v libx264 -pix_fmt yuv420p这类固定参数。5.4 输出检查音画同步与时长验证成片生成后不要只看一遍就发布。建议用以下命令检查视频信息ffprobe -v error -show_entries formatduration -of csvp0 output/episode001.mp4 ffprobe -v error -select_streams v:0 -show_entries streamwidth,height -of csvp0 output/episode001.mp4 ffprobe -v error -select_streams a:0 -show_entries streamcodec_type -of csvp0 output/episode001.mp4正常输出应包含时长、分辨率、音频流。如果发现时长比脚本预期短说明有镜头素材丢失如果只有视频流没有音频流说明音频拼接失败。6. 常见问题排查与生产级完善建议不管流程设计得多完整AI 漫剧在实际生产中仍然会有各种意外。大多数问题不是模型能力不够而是素材管理、提示词和参数配置出错。排查时建议按“输入是否正确、文件路径是否正确、依赖版本是否匹配、配置是否生效、日志是否出现明确异常”的顺序进行。6.1 常见问题排查表问题现象常见原因检查方式处理建议生成出来的画面没有剧情角色画面 Prompt 只写了场景没写角色外观查看拼接后的 Prompt 是否包含角色字段在 Prompt 最前面固定加入角色外观描述同一角色两集长相不同角色描述在不同镜头不一致对比两张图使用的 Prompt 是否完全相同抽取出公共角色字符串禁止手工改画面出现文字乱码负面提示词没有限制文本检查负面提示词观察是否出现 text/watermark 占位加入 text, letters, words, watermark并重新生成配音音色与角色不匹配TTS 调用时没有传 speaker 参数查看配音代码中传参使用多角色音色映射配置视频里声音和画面不同步每张图片的停留时长没有跟随音频时长查看 ffmpeg 命令是否使用-shortest根据音频时长计算每镜帧数或使用 filter 动态对齐拼接视频时报编码错误多个中间视频编码参数不一致ffprobe检查每个临时文件统一所有中间文件的 r、s、pix_fmt、编码器生成的脚本 JSON 无法解析Prompt 没有强制纯 JSON查看模型返回内容的开始和结尾增强 Prompt 约束并在代码中兼容 Markdown 标记批次生成图片时 API 限流请求间隔过短并发过高查看日志中的 HTTP 429 状态码增加退避重试降低并发数6.2 学习环境和生产环境的差异个人学习环境里可以手动修改每张图的 Prompt接受“差不多看起来像同一个人”。但生产环境必须把一致性、稳定性、可回溯放在第一位。关注点学习环境生产环境Prompt手动调试错为主配置化、版本化管理素材文件放到本目录即可按集数归档到对象存储失败重试重新执行即可需要任务队列和失败记录角色一致性固定 Prompt 够用需要参考图或 LoRA 做约束内容审核人工简单判断需要接入审核流程避免违规内容输出规范本地播放即可需要标准分辨率、码率、字幕封装生产环境还需要额外考虑日志和监控。每一张图由哪条 Prompt 生成每一条配音用了哪个音色都必须有记录。否则出现问题后无法回滚到“上一个可用版本”。6.3 可复用的发布前检查清单在发布任何一条 AI 漫剧片段前建议逐项确认脚本结构完整每个镜头都有画面描述有台词镜头都标明了说话人。角色一致性检查至少选择三个不同场景的同角色图片确认五官、服装、发型没有明显漂移。台词与画面匹配读一遍台词确认每句话对应的画面动作合理。音画同步播放成片时确认每句台词出现时画面主体没有提前跳走。字幕正确检查字幕是否有错别字、时间轴是否覆盖整句台词。编码参数统一确认输出分辨率和平台要求一致避免二次转码后画质下降。素材归档确认分镜表、图片、音频、字幕文件都按集数和镜头号存放。6.4 扩展方向从单集片段到批量工作流本文示例只完成了“一集 60 秒片段”的最小闭环。扩展到多集时可以把分镜表放到数据库或数据仓库再把“脚本生成 - 图片生成 - 配音生成 - 视频合成”拆成独立服务。这样每一集可以并行处理角色 LoRA 也能持续累积训练数据。另外镜头动态化是提升观感的关键方向。静态图加平移缩放只能算基础漫剧更高级的形态是使用图生视频模型为关键镜头生成 3 到 5 秒钟的微动态。这样在成片里衣服飘动、眼神变化、系统面板闪烁都比单纯缩放更有表现力。但这也意味着素材管理更复杂需要把视频片段与音频时间戳做更精细的对齐。对新手来说最重要的练习不是追求更多 AI 工具而是把一个 30 秒的片段完整做三遍第一遍熟悉流程第二遍解决角色一致性问题第三遍规范文件和命名。三遍之后再换剧情题材你会发现大部分生产问题都是重复出现的只要流程固定排查和优化都只是时间问题。
返回列表