Skip to content

yinxiangpingfan/NovelToScript

Repository files navigation

NovelToScript

AI 辅助剧本创作工具:把 ≥3 章的小说自动转换为结构化剧本(YAML),产出可编辑、可二次打磨的剧本初稿。 前端把它可视化成国内电视剧/短剧文本格式,并支持上传文件、实时进度、暂停续跑与导出。

设计文档:docs/DESIGN.md;剧本 Schema:docs/SCHEMA.md;接口:docs/API.md;前端:docs/FRONTEND.md

📺 演示视频https://www.bilibili.com/video/BV1ZBEt6REX2/


界面预览

生成前(上传 / 粘贴小说) 生成完成(短剧格式剧本)
生成前 生成完成

功能特性

  • 小说 → 剧本:输入整本小说(≥3 章),自动切分章节、逐章转写为结构化剧本 YAML。
  • 两种输入:粘贴原文,或上传文件.txt / .epub),自动识别编码(UTF-8 / GB18030 / GBK)。
  • 记忆驱动的一致性:跨章维护人物/关系/能力/剧情主线,姓名与设定不漂移。
  • 实时进度:SSE 流式「打字机」直播当前章生成,进度条 + 按章查看已生成剧本。
  • 暂停 / 续跑:随时暂停(真正停止生成、保留已完成章),之后从断点章继续;失败的作业同样可续跑。
  • 剧本可视化:按国内剧组通用的短剧文本格式渲染(场次/场景/时间/人物 + [画面/动作] + 角色:台词),跨章分隔。
  • 设定 + 角色:同时产出全局设定集(StoryBible)与逐章累积的角色库(CharacterKB)。
  • 任务历史:列出过往作业,随时回看或继续;刷新页面自动恢复。
  • 导出:合并「设定 + 剧本」下载为 .yaml(原样)或 .txt(可视化剧本排版)。
  • 容错:LLM 瞬时错误(429/5xx/断连/超时)指数退避自动重试;模型 JSON 小瑕疵自动修复。

架构

单进程二进制cmd/server):Gin API + 进程内队列 + Worker 合一。由于队列只记录需要完成的小说章节,任务量太少,不依赖 Redis;唯一持久化是 SQLite。事件记忆是一个可选的 Python gRPC 旁路服务。

系统架构

三阶段流水线(Worker · Eino 编排):

三阶段流水线

端到端系统流程:

系统流程图


项目实现(大致)

  • 异步前后端分离:转换是分钟级长任务,绝不放在 HTTP 请求里。API 入队即返回 jobId,Worker 后台跑,前端轮询 + SSE 看进度。队列与实时进度走进程内 channel + pub/subinternal/queue,零外部依赖)。
  • 三阶段流水线internal/pipeline):Phase 0 通读全文产出全局 StoryBible;Phase 1 逐章「召回→组装→生成→记忆更新」;Phase 2 合并所有场景为单个 screenplay.yaml 并做一致性/Schema 校验。
  • 三类记忆internal/memory,DESIGN §3):EventMemory = mem0(精确旧事实、语义召回,经 mem0svc gRPC);CharacterKB = 结构化角色库(逐章增量 diff 合并);RollingSummary = 单层滚动摘要(按全文体量动态预算)。
  • 持久化与可恢复internal/store):Store 接口 + SQLite(modernc.org/sqlite,纯 Go 免 CGO)/ 内存双实现。作业、进度、设定、摘要、角色、已生成场景都落库——进程重启或暂停后能从断点章续跑。
  • 统一 LLM 层internal/llm):包 Eino 的 OpenAI ChatModel,统一走 OpenAI 兼容 /chat/completions(可配 BaseURL);内置瞬时错误指数退避重试。
  • 文件加载pipeline/loader.go):内置正则 + AI 兜底做章节切分;LoadBytes 解码 GB18030/GBK 并用标准库 archive/zip 解析 epub。
  • 前端frontend/):React 19 + Vite,单页状态机;剧本以短剧文本格式可视化(screenplay.tsx)。

记忆子系统(三件套分工):

记忆子系统


项目结构

backend/    Go 后端(module …/backend,Go 1.26)
  cmd/server/   单进程入口:Gin API + 进程内队列 + Worker
  internal/{api,queue,pipeline,memory,store,schema,llm,config}/
  gen/          protoc 生成的 gRPC 代码(mem0.proto)
frontend/   React + TypeScript(Vite)
mem0svc/    Python gRPC 服务,封装 mem0 SDK(事件记忆)
proto/      Go ↔ Python 的 gRPC 契约(mem0.proto)
docs/       DESIGN / SCHEMA / API / FRONTEND / PLAN

Docker 一键启动(推荐)

三个服务(mem0svc / backend / frontend)一并起,无需本地装 Go/Node/Python:

cp .env.example .env          # 填入 OPENAI_API_KEY(MEM0_API_KEY 可选)
docker compose up --build
# 前端 http://localhost:5173 · 后端 http://localhost:8080
  • SQLite 持久化到本机 backend/data/(绑定挂载),作业可断点续跑;停服 docker compose down
  • 不配 MEM0_API_KEY 时事件记忆自动降级,不影响主流程。
  • 自定义后端地址:构建前设 VITE_API_BASE(默认 http://localhost:8080/api/v1)。
  • LLM 调优(.env 可选):LLM_TIMEOUT_SECONDS(单次调用超时,默认 300)、LLM_MAX_RETRIES(瞬时错误重试次数,默认 10)。

本地开发(不用 Docker)

1) 后端(Go ≥ 1.26) — 需先准备配置:

cd backend
cp configs/config.example.yaml configs/config.yaml   # 填入 LLM api_key(或设环境变量 OPENAI_API_KEY)
go run ./cmd/server            # API + 队列 + Worker,:8080(可用 API_ADDR 覆盖)
curl localhost:8080/api/v1/health   # => {"status":"ok"}

2) 前端(Node ≥ 20)

cd frontend
npm install
npm run dev                    # Vite :5173 → 浏览器打开(CORS 已放开,直连 :8080)

3) 事件记忆服务(可选,Python ≥ 3.10) — 不启动则 Go 端优雅降级(无语义召回,不影响主流程):

cd mem0svc
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env           # 填 MEM0_API_KEY
python server.py               # gRPC :50051

依赖说明

后端第三方依赖(Go)

记忆服务依赖(Python,mem0svc

前端第三方依赖

  • React + TypeScript — UI 框架与类型系统。
  • Vite — 构建/开发脚手架(react-ts 模板)。
  • serve — 仅在 Docker 前端镜像里托管打包后的静态产物(serve -s dist)。

原创部分

  • 记忆驱动的逐章转换流水线(全局预分析 → 逐章 召回/组装/生成/记忆更新 → 汇总)。
  • 三类记忆的分工设计:EventMemory(mem0) / CharacterKB(结构化角色库) / RollingSummary(动态预算单层滚动摘要)。
  • 剧本 YAML Schema 设计(docs/SCHEMA.md)与短剧文本格式可视化。
  • 暂停/续跑(每作业可取消上下文)、LLM 瞬时错误重试、epub/编码解析、断点恢复等编排与实现。
  • 上述组件的 Go 实现、Gin 接口编排与前端集成均为本项目原创。

第三方库仅用于通用能力(Web 框架、LLM 编排、记忆服务、构建工具);改编逻辑、记忆编排、Schema 与可视化为原创。

About

一款 AI 辅助剧本创作工具,降低小说改编成剧本的门槛,提升效率。

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors