Files

1110 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 架构。