基于AI agent的童话编剧与绘本生成器(一)环境搭建与SD生成图像初步实现

张开发
2026/4/13 21:35:09 15 分钟阅读

分享文章

基于AI agent的童话编剧与绘本生成器(一)环境搭建与SD生成图像初步实现
环境搭建1. 安装Stable Diffusion WebUI我通过拉取github里的SD仓库并运行完成了Stable Diffsuion本地的初步部署。2. 下载模型和ControlNet在图像生成的模型选择上我选择了ToonYou模型原因是这个项目做的是童话绘本不是写实照片也不是二次元动漫。ToonYou的风格介于迪士尼和儿童绘本之间——色彩温暖、线条柔和、角色表情丰富非常适合这个场景。如果选写实模型生成的“小男孩”可能会像真人照片不符合绘本的预期风格。如果选动漫模型又太“日系”少了绘本的质感。、除此之外我安装了controlnet的插件controlnet可以在不破坏原有SD模型能力的前提下给它加一个“额外的输入通道”让SD模型在生成图像是会参考controlnet传入的图片。ControlNet模型ip-adapter-plus_sd15这里因为ToonYou是基于SD1,5的模型所以IP-adapter也要相应版本用于保持角色一致性这是实现同一个主角的关键3. 启动API服务在WebUI启动时添加--api参数python launch.py --api --listen这样就完成了本地的部署并能够调用相应api了初步生成图像完成环境搭建后接下来就是如何调用SD的API来生成图像。我把代码分成四个文件各司其职文件职责config.py集中管理所有配置参数generator.py核心生成器类封装SD API调用Image_generator.py对外接口层提供简洁的调用函数test.py测试脚本验证功能一、配置文件config.pyconfig.py是整个模块的“控制面板”。因为我会生成各种不同的角色所以提示词不能写死具体特征而是要从“风格”和“质量”两个维度来约束1. 通用风格提示词GENERIC_STYLE high quality, detailed, beautiful composition, vibrant colors, clear subject, well-lit, appealing characters 这个风格提示词的核心作用是定调。它告诉SD我要的是高质量、细节丰富、色彩鲜艳、构图美观的图片。无论生成什么角色、什么场景这个“画风基线”都要保持。为什么不用“childrens book illustration style”这类具体风格因为后续可能生成不同风格的绘本把风格写死在config里反而限制了扩展性。所以我只保留了通用画质要求具体的风格描述由调用时的prompt传入。2. 通用负向提示词GENERIC_NEGATIVE blurry, low quality, ugly, distorted, bad anatomy, watermark, text, cropped, out of frame, extra fingers, mutated hands, missing fingers, extra limbs, bad proportions, duplicate, weird colors 负向提示词的作用是排除常见缺陷。SD在生成图像时经常出现畸形手指、多余肢体、模糊、水印等问题把这些统统写进负向提示词可以大幅提高生成质量。这里面有几个关键项bad anatomy, extra fingers, mutated hands针对SD最著名的“画手难题”watermark, text避免生成带有版权标记或乱码文字的图blurry, low quality强制要求清晰度二、核心生成器generator.pygenerator.py里的ImageGenerator类负责所有与SD API的交互。其中最关键的就是ControlNet的集成。调用ControlNet的核心步骤在generate方法中如果调用时传入了character_id就去读取对应的参考图然后构建一个ControlNet单元读取参考图并转base64SD API要求图片以base64字符串形式传递不能直接传文件路径。指定module和modelip-adapter_auto是预处理模块ip-adapter-plus_sd15是具体模型。注意模型版本要和SD主模型匹配——ToonYou基于SD1.5所以IP-Adapter也要用sd15版本。设置weight权重控制参考图的影响力。weight1.0表示正常参考调高会让角色更像参考图但可能动作僵硬调低则角色容易变形。设置guidance_start和guidance_end都设为0.0和1.0表示ControlNet在整个生成过程中全程生效。三、对外接口Image_generator.py 的封装Image_generator.py是对外提供的调用入口采用单例模式——整个应用只有一个Generator实例避免重复初始化SD连接。它对外暴露的函数都很简洁调用方不需要知道ImageGenerator类的内部细节。这里重点说一下提示词的封装思路。如果让调用方直接拼接完整的prompt字符串会带来两个问题调用方必须了解SD提示词的写法规范比如哪些词在前、权重怎么加角色动作和场景描述的拼接逻辑会散落在各个调用处难以统一修改所以我设计了两层封装第一层将生成参数结构化对外提供的generate_image函数不接收完整的prompt而是接收两个独立参数action和scene。def generate_image(action: str, scene: str, character_id: str None, ...): prompt f{action}, {scene} # 再自动追加通用风格提示词 full_prompt f{prompt}, {config.GENERIC_STYLE} ...调用方只需要说“做什么动作”和“在什么场景”比如action a cute cat sittingscene on a chair, cartoon style函数内部会自动拼接成完整的prompt并追加配置中的通用风格。这样做的好处调用方不需要学习提示词工程只需要描述画面内容风格控制集中在配置文件中换风格不用改业务代码动作和场景分离后续如果要从AI Agent生成的剧本中自动提取解析起来也更方便第二层批量生成的结构化输入批量生成函数generate_batch接收一个pages列表每个元素是一个字典pages [ {action: a little boy standing, scene: in a magical forest}, {action: the same boy running, scene: through a flower field}, ]这种结构化的输入格式天然对接后续AI Agent的输出——大语言模型生成的剧本可以直接转换成这个格式无需额外解析。单例模式的考虑_get_generator()函数确保全局只有一个ImageGenerator实例。这是因为SD API的连接和模型切换有一定开销重复初始化没有必要。同时角色参考图保存在实例的目录属性中单例可以保证多次调用之间参考图路径一致。至于test脚本是目前测试用故不作介绍。总结与后续计划当前成果回顾到这一步为止我已经完成了绘本生成器的图像模块基础建设环境搭建Stable Diffusion WebUI 本地部署ToonYou 模型配置ControlNet IP-Adapter 安装API 服务启动代码架构config配置管理、generator核心生成逻辑、Image_generator对外接口、test测试验证四个模块分层清晰基础功能单张图像生成、角色参考图上传与管理、ControlNet 初步集成、批量生成接口目前已经可以实现给定一段提示词生成一张质量尚可的图片如果上传了角色参考图同一角色的多张生成结果在长相上有一定的相似度。但这个“一定的相似度”离真正的角色一致性还有距离。后续需要在三个方向上深入优化。一、角色控制的优化当前问题虽然 ControlNet 已经接入了但同一个角色在不同画面中仍然会出现特征飘移——比如这一页的男孩头发偏棕下一页偏黑这一页眼睛大而圆下一页眼睛细长。二、提示词架构的优化当前问题目前的提示词是“通用风格 用户传入的动作和场景”简单拼接。这种方式的缺点是不同场景需要重复写相同的画质要求难以针对不同角色类型动态调整提示词提示词过长可能稀释关键信息

更多文章