1110 lines
22 KiB
Markdown
1110 lines
22 KiB
Markdown
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 架构。
|