22 KiB
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 / 内容快照关联。
一、你的新要求应该这样定架构
你要的不是一个“三合一强绑定系统”,而是:
小说系统 Novel
↓ 可选派生
听书系统 Audiobook
短剧系统 ShortDrama / LiveAction
三个系统关系:
NovelSource / NovelChapter 是源头
AudioBookProject 从 NovelSource 派生
ShortDramaProject 从 NovelSource 派生
但是:
听书生成失败,不影响小说
短剧生成失败,不影响小说
小说后续修改,不自动覆盖已生成听书/短剧
听书/短剧可以随时从某个小说版本重新生成
这个设计非常重要。
二、现在的架构满足多少?
已经满足的部分
你当前项目已经有这些能力:
- 小说导入、章节切割、章节管理、阅读器;
- 从小说选择生成短剧的入口;
- StoryBible / WorldBible / Character / Episode / Script / Storyboard 基础结构;
- 真人短剧生成链路:角色抽取、分镜准备、锚点图、关键帧、视频片段、候选片段、FFmpeg 合成;
- Provider 层已经支持文本、小说、图片、视频、语音、向量、审核等类型;
- BullMQ / RenderTask / Worker 基础已经有;
- Prompt Builder 在真人视频侧已经成型;
- Character Library 已经区分“我的真人脸包”和“项目角色库”。
这些是非常好的基础。你不需要另起一个全新项目。
还缺的关键部分
现在还缺的是这几个:
- 原创小说自动生成流水线;
- 小说上下文记忆 / 伏笔 / 人物状态的严格结构化管理;
- 小说版本快照机制;
- 听书独立项目表与任务队列;
- 小说转听书 Agent;
- 小说转短剧时的“适配层”,不是直接把小说章节丢给现有短剧系统;
- 三条线的开关配置;
- 派生任务状态隔离;
- 小说修改后,是否同步影响听书/短剧的版本控制策略。
其中最关键的是:
短剧和听书都不能直接依赖“当前小说正文”,必须依赖“某个小说版本快照”。
三、正确的数据关系
你现在已有:
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 架构。