
从故事总纲到单场剧本ProjectDream 的文本生产链路这一篇继续写 ProjectDream 的上游文本链路主要包括 AI 故事总纲、场景拆解和单场剧本三个模块。一、为什么先做文本链路在漫剧和短视频生产里最先定下来的不是画面而是文本。如果总纲不稳定后面的场景、剧本、分镜都会跟着乱如果剧本不清楚后续角色、静帧和视频也很难保持一致。所以 ProjectDream 的第一条主链路就是先把故事讲明白再往下拆。这部分在系统里分成三层AI 故事总纲场景拆解单场景剧本它们的关系很清楚总纲负责定故事方向场景负责拆生产单元剧本负责把单场场景写成可执行文本。二、AI 故事总纲模块2.1 模块作用故事总纲模块负责把用户在创建项目时填写的题材、故事方向、视觉风格和目标时长转换成结构化的故事蓝图。它是后面场景拆解、单场剧本、角色提取和分镜生成的上游语境。2.2 页面流程总纲模块的流程很直接用户进入 AI 剧本页页面读取当前项目和最新总纲用户点击生成总纲后端调用文本模型生成结构化 JSON后端规范化模型返回内容写入story_outlines页面展示故事标题、logline、三幕结构和场景草案用户继续生成正式场景2.3 页面截图2.4 关键实现前端页面是src/views/AIScript.vue会同时负责项目加载、总纲加载、总纲生成和场景生成。相关接口包括getProject(projectId)getLatestOutline(projectId)generateOutline(projectId)listScenes(projectId)generateScenes(projectId)generateSceneScript(sceneId)后端接口主要是GET /api/projects/:projectId/outline POST /api/projects/:projectId/outline/generate生成流程大致是POST /api/projects/:projectId/outline/generate - authenticate - 校验项目归属 - aiGenerateOutline(project) - buildOutlinePrompts(project) - generateStructuredJson() - normalizeOutlinePayload() - 计算 version_no - 写入 story_outlines - 更新项目 status - 返回 OutlineDTO2.5 数据表核心表是story_outlines关键字段包括project_idversion_notitleloglinepremiseact1_text / act2_text / act3_textvisual_styleraw_json这里最关键的是raw_json会保留模型原始结果方便后续追溯和调试。2.6 异常处理总纲模块对异常的处理比较严格项目不存在或不属于当前用户时直接拒绝AI 未配置时走 mock 或返回配置错误模型返回非 JSON 时抛结构化解析错误生成失败时不写入无效总纲这一步的目的很明确就是保证后面的场景和剧本有一个稳定的上游输入。三、场景拆解模块3.1 模块作用场景拆解模块负责把总纲中的场景草案落成正式场景。如果说总纲是故事蓝图那场景就是实际的生产单元。每个场景都会有自己的标题、地点、时间、摘要、氛围和预估时长。3.2 页面流程场景页的操作流程如下用户进入场景拆解页页面读取项目、最新总纲和已有场景用户点击生成场景后端基于总纲中的场景列表写入script_scenes用户可以切换场景并修改标题、摘要、地点、时间和氛围保存后单场剧本模块继续读取这些场景3.3 页面截图3.4 关键实现前端页面是src/views/Scenes.vue核心状态包括当前项目当前总纲场景列表当前选中场景表单草稿是否有未保存改动重新生成确认弹窗相关接口包括getProject(projectId)getLatestOutline(projectId)listScenes(projectId)generateScenes(projectId)updateScene(sceneId, payload)后端接口主要是GET /api/projects/:projectId/scenes POST /api/projects/:projectId/scenes/generate GET /api/scenes/:sceneId PUT /api/scenes/:sceneId生成流程大致是POST /api/projects/:projectId/scenes/generate - authenticate - 校验项目归属 - 查询最新 story_outlines - 从总纲 raw_json / scenes 字段读取场景列表 - 规范化 scene_no、title、summary、location、time_of_day - 写入 script_scenes - 更新项目 status - 返回场景列表3.5 数据表核心表是script_scenes关键字段包括project_idoutline_idscene_notitlesummarycontentmoodlocationtime_of_dayestimated_durationsort_orderstatus3.6 异常处理场景拆解这一步也有比较明确的保护机制没有总纲时不能生成正式场景总纲里没有可用场景列表时返回错误场景不属于当前用户时拒绝访问非法时长会被忽略重新生成场景前前端会弹确认避免误操作这一步的重点是把故事从“抽象描述”变成“可执行的场景单元”。四、单场景剧本模块4.1 模块作用单场景剧本模块负责把一个场景扩展成完整剧本文本包括人物对白、动作、环境氛围和节奏说明。它是分镜生成的直接输入。4.2 页面流程单场景剧本的流程是用户从场景列表进入剧本编辑页页面读取项目、场景列表和当前场景详情用户点击生成剧本后端基于项目、总纲和当前场景调用文本模型生成内容写回script_scenes.content用户可以人工编辑并保存用户继续点击生成分镜4.3 页面截图4.4 关键实现前端页面是src/views/ScriptEditor.vue它要处理两个比较重要的状态剧本文本草稿是否和数据库一致切换场景时是否丢弃未保存内容相关接口包括getProject(projectId)listScenes(projectId)getScene(sceneId)generateSceneScript(sceneId)saveSceneScript(sceneId, payload)generateStoryboards(sceneId)后端接口主要是GET /api/scenes/:sceneId/script POST /api/scenes/:sceneId/script/generate PUT /api/scenes/:sceneId/script生成流程大致是POST /api/scenes/:sceneId/script/generate - authenticate - 查询场景并校验 owner - 查询项目和最新总纲 - aiGenerateSceneScript() - buildSceneScriptPrompts() - generateStructuredJson() - normalizeSceneScriptPayload() - 更新 script_scenes.content / mood / status - 返回 SceneDTO4.5 数据表这里仍然是script_scenes比较关键的字段是content单场剧本文本mood情绪和氛围status剧本阶段状态updated_at最后编辑时间生成分镜时会继续读取script_scenes.contentcharactersprojects.visual_style4.6 异常处理这一层的保护也比较直接场景不存在或不属于当前用户时拒绝场景没有内容时分镜生成会被阻止AI 失败时按配置决定是否 fallback 到 mock切换场景前有未保存内容时前端弹出确认五、这一段链路的价值总纲、场景和单场剧本不是三个孤立页面而是一个连续的文本生产链路。它们解决的不是“能不能写”而是“能不能稳定地往下传”。这也是 ProjectDream 和普通生成页最大的区别。普通页面更像结果展示而这条链路更像真正的生产线上游负责定方向中游负责拆单元下游负责扩写成可执行剧本六、总结这三块文本模块是 ProjectDream 里最基础、也是最核心的一段。故事总纲解决“讲什么”场景拆解解决“拆成什么单元”单场剧本解决“这一场怎么拍”。有了这一层后面的角色、分镜、静帧、视频和音频才有稳定的上游依据。下一篇会开始写角色库和角色一致性模块进入更下游的生产环节。