1.我希望这3个是独立的但又可以关联使用的,听说和短剧都是在小说的基础上的;3个不能相互影响,我可以配置是否开启听说/短剧,或者 听书和短剧后续单独选择小说启动生成(目前的短剧系统就是在这样) 2.CURRENT_ARCHITECTURE.md 已经上传,目前的项目进度; 你这个要求是对的:**小说、听书、短剧必须独立,但要能从同一个小说源关联启动**。 根据你上传的 `CURRENT_ARCHITECTURE.md`,你现在的系统基础已经比较接近了:后端已经有 `NovelsModule`、`StoryBiblesModule`、`CharactersModule`、`MemoriesModule`、`EpisodesModule`、`ScriptsModule`、`LiveActionModule`、`MediaModule`、`ProvidersModule`、`QueuesModule`,而且当前小说主流程已经支持 `NovelSource -> NovelChapter -> Reader`,并且预留了“选择小说生成短剧”的路径。真人短剧侧也已经具备分镜、关键帧、视频片段、候选选择、FFmpeg 合成等流程。 所以结论是: > **你现在的架构不需要推倒重做,只需要把“小说原创生产流水线”补进去,并把小说、听书、短剧设计成三个独立产品线,通过 NovelSource / NovelChapter / 内容快照关联。** --- # 一、你的新要求应该这样定架构 你要的不是一个“三合一强绑定系统”,而是: ```text 小说系统 Novel ↓ 可选派生 听书系统 Audiobook 短剧系统 ShortDrama / LiveAction ``` 三个系统关系: ```text NovelSource / NovelChapter 是源头 AudioBookProject 从 NovelSource 派生 ShortDramaProject 从 NovelSource 派生 ``` 但是: ```text 听书生成失败,不影响小说 短剧生成失败,不影响小说 小说后续修改,不自动覆盖已生成听书/短剧 听书/短剧可以随时从某个小说版本重新生成 ``` 这个设计非常重要。 --- # 二、现在的架构满足多少? ## 已经满足的部分 你当前项目已经有这些能力: 1. 小说导入、章节切割、章节管理、阅读器; 2. 从小说选择生成短剧的入口; 3. StoryBible / WorldBible / Character / Episode / Script / Storyboard 基础结构; 4. 真人短剧生成链路:角色抽取、分镜准备、锚点图、关键帧、视频片段、候选片段、FFmpeg 合成; 5. Provider 层已经支持文本、小说、图片、视频、语音、向量、审核等类型; 6. BullMQ / RenderTask / Worker 基础已经有; 7. Prompt Builder 在真人视频侧已经成型; 8. Character Library 已经区分“我的真人脸包”和“项目角色库”。 这些是非常好的基础。你不需要另起一个全新项目。 --- ## 还缺的关键部分 现在还缺的是这几个: 1. **原创小说自动生成流水线**; 2. **小说上下文记忆 / 伏笔 / 人物状态的严格结构化管理**; 3. **小说版本快照机制**; 4. **听书独立项目表与任务队列**; 5. **小说转听书 Agent**; 6. **小说转短剧时的“适配层”**,不是直接把小说章节丢给现有短剧系统; 7. **三条线的开关配置**; 8. **派生任务状态隔离**; 9. **小说修改后,是否同步影响听书/短剧的版本控制策略**。 其中最关键的是: > **短剧和听书都不能直接依赖“当前小说正文”,必须依赖“某个小说版本快照”。** --- # 三、正确的数据关系 你现在已有: ```text NovelSource NovelChapter Project StoryBible Character Episode EpisodeScript StoryboardShot VideoClip Asset RenderTask ``` 建议不要重复造 `novel_projects` 这种新表。你应该在现有体系上补: ```text NovelSource ├── NovelChapter ├── NovelGenerationPlan 原创小说生成计划 ├── NovelChapterDraft AI 原创章节草稿/终稿 ├── NovelContextMemory 小说上下文记忆 ├── NovelForeshadow 伏笔管理 ├── NovelQualityReport 小说质量报告 ├── NovelVersionSnapshot 小说版本快照 ├── AudioBookProject 听书派生项目 └── ShortDramaProject / Project 短剧派生项目 ``` --- # 四、必须加“小说版本快照” 这是整个设计的核心。 为什么? 比如小说第 1 章写完后,你用它生成了听书和短剧。 后来你又修改了第 1 章。 这时不能自动把听书和短剧覆盖掉。 否则会出现: 小说改了; 听书还是旧剧情; 短剧已经生成视频; 人物台词对不上; 字幕对不上; 用户不知道哪个版本是准的。 所以必须有: ```text NovelVersionSnapshot ``` 每次启动听书或短剧生成时,系统先创建一个快照。 ```text 小说当前版本 V3 ↓ 创建快照 Snapshot V3 ↓ 听书基于 Snapshot V3 生成 短剧基于 Snapshot V3 生成 ``` 以后小说变成 V4,也不影响已经生成的听书和短剧。 如果用户想重新生成: ```text 选择小说最新版本 V4 重新生成听书 重新生成短剧 ``` --- # 五、三条线应该这样独立 ## 1. 小说线 负责: 小说原创生成; 章节正文; 章节润色; 上下文记忆; 人物状态; 伏笔; 质量评分; 发布到小说阅读器。 状态独立: ```text draft writing reviewing published paused failed ``` --- ## 2. 听书线 听书线只读取小说快照,不反写小说正文。 负责: 小说章节转听书稿; 旁白稿; 角色对白拆分; TTS 配音; 音效 / BGM 标记; 音频合成; 字幕或文稿同步。 状态独立: ```text not_started generating_script generating_voice mixing completed failed paused ``` --- ## 3. 短剧线 短剧线也只读取小说快照,不反写小说正文。 负责: 小说章节转剧本; 剧本转分镜; 角色抽取 / 角色绑定; 定妆锚点; 关键帧; 视频片段; 候选选择; 合成成片。 状态独立: ```text not_started script_ready storyboard_ready keyframe_ready video_generating clip_selecting rendering completed failed paused ``` --- # 六、开关配置怎么设计 你说“可以配置是否开启听书/短剧”,这个要放在小说项目配置里。 建议在 `NovelSource` 或单独配置表加: ```json { "pipeline_config": { "novel_generation_enabled": true, "audiobook_enabled": false, "short_drama_enabled": false, "auto_generate_audiobook_after_chapter_publish": false, "auto_generate_short_drama_after_chapter_publish": false, "allow_manual_audiobook_generation": true, "allow_manual_short_drama_generation": true } } ``` 这样就支持三种模式。 --- ## 模式 A:只生成小说 ```text novel_generation_enabled = true audiobook_enabled = false short_drama_enabled = false ``` 只写小说,听书和短剧不动。 --- ## 模式 B:小说发布后自动生成听书 ```text audiobook_enabled = true auto_generate_audiobook_after_chapter_publish = true short_drama_enabled = false ``` 适合小说听书同步平台。 --- ## 模式 C:小说发布后自动生成短剧 ```text short_drama_enabled = true auto_generate_short_drama_after_chapter_publish = true ``` 成本高,不建议默认开启。 --- ## 模式 D:小说先写,后续手动选择生成听书/短剧 这是你现在最适合的模式: ```text audiobook_enabled = true short_drama_enabled = true auto_generate_audiobook_after_chapter_publish = false auto_generate_short_drama_after_chapter_publish = false allow_manual_audiobook_generation = true allow_manual_short_drama_generation = true ``` 也就是: 小说先稳定生成; 用户在后台选择某几章生成听书; 用户在后台选择某几章生成短剧; 短剧仍走你目前已有的真人短剧系统。 --- # 七、你现有短剧系统不要改成依赖小说 你现在短剧系统已经可以从“外部提示词 / 小说章节 / 项目设定”进入分镜草稿,再进入 Project / Episode / StoryBible、真人分镜准备、关键帧、视频、合成流程。这个方向是正确的。 现在不要把短剧系统改成“小说系统的一部分”。 应该增加一个适配层: ```text NovelToDramaAdapter ``` 它只负责: ```text 读取 NovelSnapshot ↓ 选择章节范围 ↓ 生成短剧 Project ↓ 生成 StoryBible / Character / Episode / Script / Storyboard ↓ 交给现有 LiveActionModule ``` 短剧系统继续保持独立。 --- # 八、听书系统也不要塞进小说系统 听书也应该是独立派生。 建议新增: ```text AudioBookModule ``` 它依赖: ```text NovelsModule MediaModule ProvidersModule QueuesModule AssetsModule ``` 但不要反向影响 `NovelsModule`。 也就是: ```text NovelsModule 不知道听书怎么生成 AudioBookModule 知道怎么读取 NovelSource / NovelChapter ``` 这样耦合最低。 --- # 九、推荐模块关系 你现在项目可以调整成这样: ```text NovelsModule - 小说导入 - 小说阅读 - 原创小说生成 - 章节管理 - 上下文记忆 - 伏笔 - 小说质量检查 - 小说版本快照 AudioBookModule - 从 NovelSnapshot 创建听书项目 - 生成听书稿 - 生成配音分段 - 调用 VoiceProvider - 调用 MediaModule 合成音频 DramaAdaptationModule - 从 NovelSnapshot 创建短剧项目 - 小说转剧本 - 剧本转分集 - 剧本转分镜 - 交给 LiveActionModule LiveActionModule - 保持现有真人短剧流程 - 只接收 StoryBible / Episode / Storyboard / Character - 不直接管理小说逻辑 ``` --- # 十、数据库建议 你现有表不少,尽量少加表。 我建议新增这些即可。 --- ## 1. NovelGenerationPlan 记录原创小说生成计划。 ```prisma model NovelGenerationPlan { id String @id @default(cuid()) novel_source_id String user_id String target_words Int? target_chapters Int? genre String? style String? brief_json Json? bible_json Json? volume_plan_json Json? pipeline_config Json? status String @default("draft") current_chapter Int @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@index([novel_source_id]) @@index([user_id]) @@index([status]) } ``` --- ## 2. NovelContextMemory 记录长篇上下文。 ```prisma model NovelContextMemory { id String @id @default(cuid()) novel_source_id String chapter_no Int? memory_type String memory_json Json? memory_text String? @db.LongText created_at DateTime @default(now()) @@index([novel_source_id]) @@index([chapter_no]) @@index([memory_type]) } ``` `memory_type`: ```text bible_summary chapter_summary character_state relationship_state world_update timeline_update location_update style_rules ``` --- ## 3. NovelForeshadow 伏笔表。 ```prisma model NovelForeshadow { id String @id @default(cuid()) novel_source_id String code String title String? first_chapter_no Int? expected_reveal_chapter_no Int? actual_reveal_chapter_no Int? surface_text String? @db.Text hidden_truth String? @db.Text status String @default("planned") related_characters Json? created_at DateTime @default(now()) updated_at DateTime @updatedAt @@unique([novel_source_id, code]) @@index([novel_source_id]) @@index([status]) } ``` --- ## 4. NovelQualityReport 小说质检报告。 ```prisma model NovelQualityReport { id String @id @default(cuid()) novel_source_id String chapter_id String? chapter_no Int? report_type String total_score Int? score_json Json? problems_json Json? suggestions_json Json? pass_status Boolean @default(false) created_at DateTime @default(now()) @@index([novel_source_id]) @@index([chapter_no]) @@index([pass_status]) } ``` --- ## 5. NovelVersionSnapshot 版本快照,最关键。 ```prisma model NovelVersionSnapshot { id String @id @default(cuid()) novel_source_id String version_no Int title String? snapshot_scope String // full_novel / chapter_range / single_chapter chapter_start Int? chapter_end Int? source_hash String? snapshot_json Json? snapshot_text String? @db.LongText created_for String? // audiobook / short_drama / export / manual created_at DateTime @default(now()) @@unique([novel_source_id, version_no]) @@index([novel_source_id]) @@index([created_for]) } ``` --- ## 6. AudioBookProject 听书项目表。 ```prisma model AudioBookProject { id String @id @default(cuid()) novel_source_id String snapshot_id String user_id String title String status String @default("draft") voice_config_json Json? audio_style_json Json? progress_json Json? created_at DateTime @default(now()) updated_at DateTime @updatedAt @@index([novel_source_id]) @@index([snapshot_id]) @@index([user_id]) @@index([status]) } ``` --- ## 7. AudioBookChapter 听书章节表。 ```prisma model AudioBookChapter { id String @id @default(cuid()) audiobook_project_id String novel_chapter_id String? chapter_no Int audio_script_text String? @db.LongText segment_json Json? subtitle_json Json? estimated_duration_sec Int? audio_asset_id String? status String @default("pending") error_message String? @db.Text created_at DateTime @default(now()) updated_at DateTime @updatedAt @@unique([audiobook_project_id, chapter_no]) @@index([audiobook_project_id]) @@index([status]) } ``` --- ## 8. NovelDerivativeJob 统一派生任务表。 这个表可以同时管理听书和短剧派生任务。 ```prisma model NovelDerivativeJob { id String @id @default(cuid()) novel_source_id String snapshot_id String? user_id String derivative_type String // audiobook / short_drama target_ref_id String? // AudioBookProject.id / Project.id chapter_start Int? chapter_end Int? config_json Json? status String @default("pending") progress_json Json? error_message String? @db.Text created_at DateTime @default(now()) updated_at DateTime @updatedAt @@index([novel_source_id]) @@index([snapshot_id]) @@index([derivative_type]) @@index([status]) } ``` 这个表负责“小说派生任务”,不要和视频系统里的 `RenderTask` 混在一起。 `RenderTask` 继续负责图片、视频、合成等实际耗时任务。 --- # 十一、工作流怎么跑 ## 1. 原创小说生成流程 ```text 创建 NovelSource ↓ 创建 NovelGenerationPlan ↓ 生成 IP / 小说圣经 ↓ 生成人物档案 ↓ 生成卷纲 ↓ 循环生成章节: 章节卡 正文初稿 润色 质检 修复 保存 NovelChapter 更新 NovelContextMemory 更新 NovelForeshadow ``` 小说线只管小说。 --- ## 2. 手动启动听书流程 ```text 用户选择小说 ↓ 选择章节范围 ↓ 创建 NovelVersionSnapshot ↓ 创建 AudioBookProject ↓ 创建 NovelDerivativeJob(type=audiobook) ↓ 逐章生成 AudioBookChapter: 小说正文转听书稿 拆分旁白/对白 TTS 音频合成 保存 Asset ``` 听书失败只影响 `AudioBookProject`,不影响小说。 --- ## 3. 手动启动短剧流程 ```text 用户选择小说 ↓ 选择章节范围 ↓ 创建 NovelVersionSnapshot ↓ 创建 NovelDerivativeJob(type=short_drama) ↓ NovelToDramaAdapter: 提取故事圣经 提取人物 提取场景 生成短剧 Project 生成 Episode 生成 EpisodeScript 生成 StoryboardShot ↓ 交给 LiveActionModule: 角色锚点 关键帧 视频片段 候选选择 FFmpeg 合成 ``` 短剧失败只影响短剧 Project,不影响小说。 --- # 十二、前台 / 后台页面怎么改 ## 小说管理页 增加三个 Tab: ```text 正文 听书 短剧 ``` 但它们只是关联展示,不是强绑定。 --- ## 正文 Tab 显示: 章节列表; 生成状态; 质量评分; 伏笔状态; 上下文记忆; 重写 / 润色 / 发布。 --- ## 听书 Tab 显示: 是否开启听书; 是否自动生成; 选择章节生成; 听书项目列表; 每章音频状态; 试听; 重新生成。 --- ## 短剧 Tab 显示: 是否开启短剧; 是否自动生成; 选择章节生成短剧; 已派生短剧项目; 跳转真人短剧工作台; 生成状态; 成片预览。 --- # 十三、你现在最应该补的不是视频,而是“小说原创引擎” 你的视频流水线已经在测试中,而且基础不差。 现在最缺的是: ```text OriginalNovelEngine ``` 建议新增: ```text backend/src/novels/original/ original-novel-workflow.service.ts original-novel-agent.service.ts original-novel-context-builder.service.ts original-novel-quality.service.ts original-novel-memory.service.ts original-novel-foreshadow.service.ts original-novel.dto.ts original-novel.types.ts ``` 你现有文件里已经有: ```text backend/src/novels/original-novel-mock.service.ts backend/src/novels/original-novel.dto.ts backend/src/novels/original-novel.types.ts ``` 说明你已经开始预留原创小说能力了。下一步就是把 mock 升级成真实 Agent 流水线。 --- # 十四、Prompt Builder 要扩展,但不要和真人视频混用 你现在的 `PromptBuilderService` 主要服务真人视频,而且已经有 Provider Profile、scene type、角色一致性、镜头、灯光、负面词等输出,这部分应该保留给视频。 建议新增一个文本侧 Prompt Builder: ```text NovelPromptBuilderService ``` 负责: 小说圣经 Prompt; 章节卡 Prompt; 正文写作 Prompt; 润色 Prompt; 质检 Prompt; 记忆更新 Prompt; 伏笔更新 Prompt; 听书改写 Prompt; 小说转短剧 Prompt。 不要把这些全塞进 `live-action/prompt-builder.service.ts`。 最终结构: ```text backend/src/novels/prompt-builders/novel-prompt-builder.service.ts backend/src/audiobook/prompt-builders/audio-prompt-builder.service.ts backend/src/drama-adaptation/prompt-builders/drama-adaptation-prompt-builder.service.ts backend/src/live-action/prompt-builder.service.ts ``` 这样清晰。 --- # 十五、Context Builder 必须做 这是长篇小说不乱的关键。 新增: ```text NovelContextBuilderService ``` 每次写第 N 章,不要把全文塞给模型,而是拼: ```text 小说圣经摘要 + 当前卷纲 + 本章章节卡 + 最近 3-5 章摘要 + 本章出场人物状态 + 相关伏笔 + 时间线 + 禁止改动项 + 文风规则 ``` 这部分应该从这些表取: ```text NovelSource NovelChapter NovelGenerationPlan NovelContextMemory NovelForeshadow Character / CharacterMemory / CharacterState StoryBible / WorldBible ``` --- # 十六、短剧适配时要注意一点 你希望短剧“在小说基础上生成”,但短剧不是逐字复刻小说。 所以 `NovelToDramaAdapter` 要有一个规则: ```text 小说章节是原料,不是剧本。 短剧要提取: 1. 本章核心冲突 2. 本章可视化场景 3. 本章关键对白 4. 本章结尾钩子 5. 出场角色 6. 场景资产 7. 道具资产 8. 情绪曲线 ``` 然后生成短剧 Episode。 不要让它直接把小说旁白大量塞进视频字幕。 你当前文档里也提到,字幕默认策略应该更轻,只显示短标题或用户指定字幕;后期对白、BGM、SFX 应当前端可选。这个原则继续保留。 --- # 十七、优先级建议 ## 第一阶段:补小说原创流水线 目标: ```text 输入 Brief → 生成小说圣经 → 生成前 30 章细纲 → 自动写第 1 章 → 质检 → 保存 NovelChapter → 更新 Memory / Foreshadow ``` 先别急着做听书和短剧自动联动。 --- ## 第二阶段:补小说版本快照 目标: ```text 选择小说章节范围 → 创建 Snapshot → 后续听书/短剧基于 Snapshot ``` 这是派生系统的地基。 --- ## 第三阶段:补听书派生 目标: ```text 选择小说章节 → 生成听书稿 → TTS → 保存音频 Asset ``` 因为你已有 VoiceProvider 和 MediaModule,听书线应该比短剧线更快落地。 --- ## 第四阶段:补短剧派生适配层 目标: ```text 选择小说章节 → NovelToDramaAdapter → 创建 Project / Episode / StoryBible / Character / Script / Storyboard → 进入现有 LiveActionModule ``` --- ## 第五阶段:做自动模式 最后再加: ```text 小说每发布 1 章,自动生成听书 小说每发布 3-5 章,自动生成 1 集短剧 ``` 短剧成本高,不建议一开始默认自动。 --- # 十八、是否还需要你提供代码? **目前你提供的 `CURRENT_ARCHITECTURE.md` 已经足够做系统级设计。** 如果下一步要让我给你写“可直接丢给 Codex 的开发文档”,建议你再提供这 5 个文件,越具体越好: ```text backend/prisma/schema.prisma backend/src/novels/novels.service.ts backend/src/novels/original-novel-mock.service.ts backend/src/live-action/live-action.service.ts backend/src/scripts/scripts.service.ts ``` 如果只能先给一个,优先给: ```text backend/prisma/schema.prisma ``` 因为我需要基于你现有 Prisma 模型补表,避免设计出和你当前字段冲突的表。 --- # 十九、给你的最终架构判断 你现在应该这样改: ```text 不要推翻现有短剧系统。 不要让听书、短剧强绑定小说实时正文。 不要让小说生成任务直接调用视频生成任务。 ``` 正确方式是: ```text NovelSource 作为内容源 NovelVersionSnapshot 作为派生依据 AudioBookProject 独立生成听书 ShortDrama Project 独立生成短剧 NovelDerivativeJob 负责派生任务关联 LiveActionModule 保持独立 MediaModule 负责音频/字幕/视频合成 ``` 一句话总结: > **小说是母体,听书和短剧是派生作品;派生作品读取小说快照,但不反向污染小说正文。** 这个设计符合你说的“三个独立,但又可以关联使用”。而且它能最大程度复用你现有的 Provider、Character、StoryBible、Episode、Script、Storyboard、LiveAction、Media、RenderTask、BullMQ 架构。