Files

22 KiB
Raw Permalink Blame History

1.我希望这3个是独立的但又可以关联使用的,听说和短剧都是在小说的基础上的;3个不能相互影响,我可以配置是否开启听说/短剧,或者 听书和短剧后续单独选择小说启动生成(目前的短剧系统就是在这样) 2.CURRENT_ARCHITECTURE.md 已经上传,目前的项目进度;

你这个要求是对的:小说、听书、短剧必须独立,但要能从同一个小说源关联启动

根据你上传的 CURRENT_ARCHITECTURE.md,你现在的系统基础已经比较接近了:后端已经有 NovelsModuleStoryBiblesModuleCharactersModuleMemoriesModuleEpisodesModuleScriptsModuleLiveActionModuleMediaModuleProvidersModuleQueuesModule,而且当前小说主流程已经支持 NovelSource -> NovelChapter -> Reader,并且预留了“选择小说生成短剧”的路径。真人短剧侧也已经具备分镜、关键帧、视频片段、候选选择、FFmpeg 合成等流程。

所以结论是:

你现在的架构不需要推倒重做,只需要把“小说原创生产流水线”补进去,并把小说、听书、短剧设计成三个独立产品线,通过 NovelSource / NovelChapter / 内容快照关联。


一、你的新要求应该这样定架构

你要的不是一个“三合一强绑定系统”,而是:

小说系统 Novel
  ↓ 可选派生
听书系统 Audiobook
短剧系统 ShortDrama / LiveAction

三个系统关系:

NovelSource / NovelChapter 是源头
AudioBookProject 从 NovelSource 派生
ShortDramaProject 从 NovelSource 派生

但是:

听书生成失败,不影响小说
短剧生成失败,不影响小说
小说后续修改,不自动覆盖已生成听书/短剧
听书/短剧可以随时从某个小说版本重新生成

这个设计非常重要。


二、现在的架构满足多少?

已经满足的部分

你当前项目已经有这些能力:

  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. 小说修改后,是否同步影响听书/短剧的版本控制策略

其中最关键的是:

短剧和听书都不能直接依赖“当前小说正文”,必须依赖“某个小说版本快照”。


三、正确的数据关系

你现在已有:

NovelSource
NovelChapter
Project
StoryBible
Character
Episode
EpisodeScript
StoryboardShot
VideoClip
Asset
RenderTask

建议不要重复造 novel_projects 这种新表。你应该在现有体系上补:

NovelSource
  ├── NovelChapter
  ├── NovelGenerationPlan        原创小说生成计划
  ├── NovelChapterDraft          AI 原创章节草稿/终稿
  ├── NovelContextMemory         小说上下文记忆
  ├── NovelForeshadow            伏笔管理
  ├── NovelQualityReport         小说质量报告
  ├── NovelVersionSnapshot       小说版本快照
  ├── AudioBookProject           听书派生项目
  └── ShortDramaProject / Project 短剧派生项目

四、必须加“小说版本快照”

这是整个设计的核心。

为什么?

比如小说第 1 章写完后,你用它生成了听书和短剧。 后来你又修改了第 1 章。

这时不能自动把听书和短剧覆盖掉。

否则会出现:

小说改了; 听书还是旧剧情; 短剧已经生成视频; 人物台词对不上; 字幕对不上; 用户不知道哪个版本是准的。

所以必须有:

NovelVersionSnapshot

每次启动听书或短剧生成时,系统先创建一个快照。

小说当前版本 V3
  ↓
创建快照 Snapshot V3
  ↓
听书基于 Snapshot V3 生成
短剧基于 Snapshot V3 生成

以后小说变成 V4,也不影响已经生成的听书和短剧。

如果用户想重新生成:

选择小说最新版本 V4
重新生成听书
重新生成短剧

五、三条线应该这样独立

1. 小说线

负责:

小说原创生成; 章节正文; 章节润色; 上下文记忆; 人物状态; 伏笔; 质量评分; 发布到小说阅读器。

状态独立:

draft
writing
reviewing
published
paused
failed

2. 听书线

听书线只读取小说快照,不反写小说正文。

负责:

小说章节转听书稿; 旁白稿; 角色对白拆分; TTS 配音; 音效 / BGM 标记; 音频合成; 字幕或文稿同步。

状态独立:

not_started
generating_script
generating_voice
mixing
completed
failed
paused

3. 短剧线

短剧线也只读取小说快照,不反写小说正文。

负责:

小说章节转剧本; 剧本转分镜; 角色抽取 / 角色绑定; 定妆锚点; 关键帧; 视频片段; 候选选择; 合成成片。

状态独立:

not_started
script_ready
storyboard_ready
keyframe_ready
video_generating
clip_selecting
rendering
completed
failed
paused

六、开关配置怎么设计

你说“可以配置是否开启听书/短剧”,这个要放在小说项目配置里。

建议在 NovelSource 或单独配置表加:

{
  "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:只生成小说

novel_generation_enabled = true
audiobook_enabled = false
short_drama_enabled = false

只写小说,听书和短剧不动。


模式 B:小说发布后自动生成听书

audiobook_enabled = true
auto_generate_audiobook_after_chapter_publish = true
short_drama_enabled = false

适合小说听书同步平台。


模式 C:小说发布后自动生成短剧

short_drama_enabled = true
auto_generate_short_drama_after_chapter_publish = true

成本高,不建议默认开启。


模式 D:小说先写,后续手动选择生成听书/短剧

这是你现在最适合的模式:

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、真人分镜准备、关键帧、视频、合成流程。这个方向是正确的。

现在不要把短剧系统改成“小说系统的一部分”。

应该增加一个适配层:

NovelToDramaAdapter

它只负责:

读取 NovelSnapshot
  ↓
选择章节范围
  ↓
生成短剧 Project
  ↓
生成 StoryBible / Character / Episode / Script / Storyboard
  ↓
交给现有 LiveActionModule

短剧系统继续保持独立。


八、听书系统也不要塞进小说系统

听书也应该是独立派生。

建议新增:

AudioBookModule

它依赖:

NovelsModule
MediaModule
ProvidersModule
QueuesModule
AssetsModule

但不要反向影响 NovelsModule

也就是:

NovelsModule 不知道听书怎么生成
AudioBookModule 知道怎么读取 NovelSource / NovelChapter

这样耦合最低。


九、推荐模块关系

你现在项目可以调整成这样:

NovelsModule
  - 小说导入
  - 小说阅读
  - 原创小说生成
  - 章节管理
  - 上下文记忆
  - 伏笔
  - 小说质量检查
  - 小说版本快照

AudioBookModule
  - 从 NovelSnapshot 创建听书项目
  - 生成听书稿
  - 生成配音分段
  - 调用 VoiceProvider
  - 调用 MediaModule 合成音频

DramaAdaptationModule
  - 从 NovelSnapshot 创建短剧项目
  - 小说转剧本
  - 剧本转分集
  - 剧本转分镜
  - 交给 LiveActionModule

LiveActionModule
  - 保持现有真人短剧流程
  - 只接收 StoryBible / Episode / Storyboard / Character
  - 不直接管理小说逻辑

十、数据库建议

你现有表不少,尽量少加表。 我建议新增这些即可。


1. NovelGenerationPlan

记录原创小说生成计划。

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

记录长篇上下文。

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

bible_summary
chapter_summary
character_state
relationship_state
world_update
timeline_update
location_update
style_rules

3. NovelForeshadow

伏笔表。

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

小说质检报告。

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

版本快照,最关键。

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

听书项目表。

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

听书章节表。

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

统一派生任务表。

这个表可以同时管理听书和短剧派生任务。

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. 原创小说生成流程

创建 NovelSource
  ↓
创建 NovelGenerationPlan
  ↓
生成 IP / 小说圣经
  ↓
生成人物档案
  ↓
生成卷纲
  ↓
循环生成章节:
    章节卡
    正文初稿
    润色
    质检
    修复
    保存 NovelChapter
    更新 NovelContextMemory
    更新 NovelForeshadow

小说线只管小说。


2. 手动启动听书流程

用户选择小说
  ↓
选择章节范围
  ↓
创建 NovelVersionSnapshot
  ↓
创建 AudioBookProject
  ↓
创建 NovelDerivativeJob(type=audiobook)
  ↓
逐章生成 AudioBookChapter
    小说正文转听书稿
    拆分旁白/对白
    TTS
    音频合成
    保存 Asset

听书失败只影响 AudioBookProject,不影响小说。


3. 手动启动短剧流程

用户选择小说
  ↓
选择章节范围
  ↓
创建 NovelVersionSnapshot
  ↓
创建 NovelDerivativeJob(type=short_drama)
  ↓
NovelToDramaAdapter
    提取故事圣经
    提取人物
    提取场景
    生成短剧 Project
    生成 Episode
    生成 EpisodeScript
    生成 StoryboardShot
  ↓
交给 LiveActionModule
    角色锚点
    关键帧
    视频片段
    候选选择
    FFmpeg 合成

短剧失败只影响短剧 Project,不影响小说。


十二、前台 / 后台页面怎么改

小说管理页

增加三个 Tab

正文
听书
短剧

但它们只是关联展示,不是强绑定。


正文 Tab

显示:

章节列表; 生成状态; 质量评分; 伏笔状态; 上下文记忆; 重写 / 润色 / 发布。


听书 Tab

显示:

是否开启听书; 是否自动生成; 选择章节生成; 听书项目列表; 每章音频状态; 试听; 重新生成。


短剧 Tab

显示:

是否开启短剧; 是否自动生成; 选择章节生成短剧; 已派生短剧项目; 跳转真人短剧工作台; 生成状态; 成片预览。


十三、你现在最应该补的不是视频,而是“小说原创引擎”

你的视频流水线已经在测试中,而且基础不差。 现在最缺的是:

OriginalNovelEngine

建议新增:

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

你现有文件里已经有:

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

NovelPromptBuilderService

负责:

小说圣经 Prompt 章节卡 Prompt 正文写作 Prompt 润色 Prompt 质检 Prompt 记忆更新 Prompt 伏笔更新 Prompt 听书改写 Prompt 小说转短剧 Prompt。

不要把这些全塞进 live-action/prompt-builder.service.ts

最终结构:

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 必须做

这是长篇小说不乱的关键。

新增:

NovelContextBuilderService

每次写第 N 章,不要把全文塞给模型,而是拼:

小说圣经摘要
+ 当前卷纲
+ 本章章节卡
+ 最近 3-5 章摘要
+ 本章出场人物状态
+ 相关伏笔
+ 时间线
+ 禁止改动项
+ 文风规则

这部分应该从这些表取:

NovelSource
NovelChapter
NovelGenerationPlan
NovelContextMemory
NovelForeshadow
Character / CharacterMemory / CharacterState
StoryBible / WorldBible

十六、短剧适配时要注意一点

你希望短剧“在小说基础上生成”,但短剧不是逐字复刻小说。

所以 NovelToDramaAdapter 要有一个规则:

小说章节是原料,不是剧本。
短剧要提取:
1. 本章核心冲突
2. 本章可视化场景
3. 本章关键对白
4. 本章结尾钩子
5. 出场角色
6. 场景资产
7. 道具资产
8. 情绪曲线

然后生成短剧 Episode。

不要让它直接把小说旁白大量塞进视频字幕。

你当前文档里也提到,字幕默认策略应该更轻,只显示短标题或用户指定字幕;后期对白、BGM、SFX 应当前端可选。这个原则继续保留。


十七、优先级建议

第一阶段:补小说原创流水线

目标:

输入 Brief
→ 生成小说圣经
→ 生成前 30 章细纲
→ 自动写第 1 章
→ 质检
→ 保存 NovelChapter
→ 更新 Memory / Foreshadow

先别急着做听书和短剧自动联动。


第二阶段:补小说版本快照

目标:

选择小说章节范围
→ 创建 Snapshot
→ 后续听书/短剧基于 Snapshot

这是派生系统的地基。


第三阶段:补听书派生

目标:

选择小说章节
→ 生成听书稿
→ TTS
→ 保存音频 Asset

因为你已有 VoiceProvider 和 MediaModule,听书线应该比短剧线更快落地。


第四阶段:补短剧派生适配层

目标:

选择小说章节
→ NovelToDramaAdapter
→ 创建 Project / Episode / StoryBible / Character / Script / Storyboard
→ 进入现有 LiveActionModule

第五阶段:做自动模式

最后再加:

小说每发布 1 章,自动生成听书
小说每发布 3-5 章,自动生成 1 集短剧

短剧成本高,不建议一开始默认自动。


十八、是否还需要你提供代码?

目前你提供的 CURRENT_ARCHITECTURE.md 已经足够做系统级设计。

如果下一步要让我给你写“可直接丢给 Codex 的开发文档”,建议你再提供这 5 个文件,越具体越好:

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

如果只能先给一个,优先给:

backend/prisma/schema.prisma

因为我需要基于你现有 Prisma 模型补表,避免设计出和你当前字段冲突的表。


十九、给你的最终架构判断

你现在应该这样改:

不要推翻现有短剧系统。
不要让听书、短剧强绑定小说实时正文。
不要让小说生成任务直接调用视频生成任务。

正确方式是:

NovelSource 作为内容源
NovelVersionSnapshot 作为派生依据
AudioBookProject 独立生成听书
ShortDrama Project 独立生成短剧
NovelDerivativeJob 负责派生任务关联
LiveActionModule 保持独立
MediaModule 负责音频/字幕/视频合成

一句话总结:

小说是母体,听书和短剧是派生作品;派生作品读取小说快照,但不反向污染小说正文。

这个设计符合你说的“三个独立,但又可以关联使用”。而且它能最大程度复用你现有的 Provider、Character、StoryBible、Episode、Script、Storyboard、LiveAction、Media、RenderTask、BullMQ 架构。