基于 Next.js + FastAPI 构建的全栈 AI 小说转视频生成平台,支持从小说文本自动生成带有图像、配音和字幕的动漫视频。
- ✅ 小说解析:支持多种格式(TXT、EPUB、PDF、DOCX)
- ✅ 场景分割:智能识别章节和场景边界
- ✅ 角色管理:自动提取角色信息并保持视觉一致性
- ✅ 图像生成:基于七牛云 AI API 生成动漫风格图像
- ✅ 配音合成:支持多角色语音区分和情感控制
- ✅ 视频合成:自动生成MP4视频,支持字幕和背景音乐
- ✅ Web界面:现代化的前端界面,支持实时预览
- 框架: Next.js 14 (App Router)
- 语言: TypeScript
- UI 库: shadcn/ui + Tailwind CSS
- 状态管理: Zustand
- HTTP 客户端: Axios
- 视频播放: react-player
- 框架: FastAPI
- 图像生成: 七牛云 AI API (gemini-2.5-flash-image)
- TTS引擎: Edge TTS / OpenAI TTS
- 视频处理: MoviePy、FFmpeg
- 数据库: SQLite
agent-sdk/
├── frontend/ # 前端应用
│ ├── src/
│ │ ├── app/ # Next.js App Router 页面
│ │ │ ├── layout.tsx # 根布局
│ │ │ ├── page.tsx # 首页
│ │ │ ├── upload/ # 上传页面
│ │ │ ├── characters/ # 角色管理页面
│ │ │ ├── styles/ # 风格配置页面
│ │ │ ├── tasks/ # 任务列表页面
│ │ │ ├── preview/[taskId]/ # 预览页面
│ │ │ └── api/ # API 路由
│ │ ├── components/
│ │ │ ├── ui/ # 基础 UI 组件
│ │ │ └── features/ # 功能组件
│ │ ├── lib/ # 工具函数
│ │ ├── stores/ # Zustand 状态管理
│ │ ├── types/ # TypeScript 类型定义
│ │ └── styles/ # 全局样式
│ ├── package.json # 前端依赖配置
│ ├── next.config.js # Next.js 配置
│ ├── tailwind.config.ts # Tailwind CSS 配置
│ ├── postcss.config.js # PostCSS 配置
│ └── tsconfig.json # TypeScript 配置
├── backend/ # 后端代码目录
│ ├── api/ # API接口层
│ │ ├── main.py # FastAPI应用入口
│ │ └── routes/ # API路由
│ ├── services/ # 核心服务模块
│ │ ├── novel_processing/ # 小说处理
│ │ ├── character_management/ # 角色管理
│ │ ├── image_generation/ # 图像生成
│ │ ├── voice/ # 配音服务
│ │ └── video_composition/ # 视频合成
│ ├── models/ # 数据模型
│ ├── config/ # 配置管理
│ └── requirements.txt # Python依赖
├── docker-compose.yml # Docker编排
├── Dockerfile # Docker镜像定义
├── package.json # 根项目配置
└── README.md # 项目文档
- Node.js 18+
- Python 3.10+
- Docker & Docker Compose (可选)
- FFmpeg
- 克隆仓库
git clone https://github.com/qbox/agent-sdk.git
cd agent-sdk- 安装依赖
# 安装根项目依赖
npm install
# 安装前端依赖
npm run install:frontend
# 安装后端依赖
pip install -r backend/requirements.txt- 配置环境变量
cp .env.example .env
# 编辑 .env 文件,填入必要的API密钥主要配置项(.env文件):
# 七牛云 AI 配置
OPENAI_BASE_URL=https://openai.qiniu.com/v1
OPENAI_API_KEY=your_qiniu_ai_api_key
# 数据库配置
DATABASE_URL=sqlite:///./novel_anime.db
# TTS配置(可选)
TTS_API_URL=
TTS_API_KEY=
# Volcengine TTS 配置(可选)
VOLCENGINE_APP_ID=
VOLCENGINE_ACCESS_TOKEN=
VOLCENGINE_RESOURCE_ID=- 启动服务
# 启动后端API服务
python -m uvicorn backend.api.main:app --reload
# 启动前端开发服务器
npm run dev详细操作说明视频(处理速度比较慢,视频做了适当的加速处理):http://s3um1yxzg.bkt.clouddn.com/novel2anime/xinwenlianbo.mov 视频中测试小说在:/test_novel/q.txt
访问:
- 前端界面: http://localhost:3000
- API文档: http://localhost:8000/docs
# 设置环境变量
export OPENAI_BASE_URL="https://openai.qiniu.com/v1"
export OPENAI_API_KEY="<七牛云 AI API KEY>"
# 调用文生图 API
curl "$OPENAI_BASE_URL/images/generations" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gemini-2.5-flash-image",
"prompt": "一只可爱的橘猫坐在窗台上看着夕阳,照片风格,高清画质"
}'import requests
import os
# 配置API
OPENAI_BASE_URL = "https://openai.qiniu.com/v1"
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# 生成图像
def generate_image(prompt: str):
response = requests.post(
f"{OPENAI_BASE_URL}/images/generations",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
},
json={
"model": "gemini-2.5-flash-image",
"prompt": prompt
}
)
return response.json()
# 使用示例
result = generate_image("一个美丽的动漫女孩,长发飘逸,站在樱花树下,动漫风格,高清画质")
print(result)# 从根目录运行前端开发服务器
npm run dev
# 或者直接进入前端目录运行
cd frontend && npm run dev# 启动后端API服务
python -m uvicorn backend.api.main:app --reload# 前端代码规范
npm run lint
npm run format
# 后端代码规范
cd backend && black .
cd backend && flake8 .- 支持多格式文本解析
- 智能场景分割
- 角色自动识别
- 对话与旁白分离
- 角色信息管理
- 参考图管理
- 角色照片保存
- 七牛云 AI API 集成
- Prompt 智能优化
- 角色一致性控制
- 批量生成支持
- 多TTS引擎支持(Edge TTS、OpenAI TTS)
- 角色语音自动分配
- 情感语调控制
- 批量音频生成
- 图像序列编排
- 音视频同步
- 字幕自动添加
- 转场效果
- 背景音乐混音
启动后端服务后访问:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
import requests
# 上传小说文件
with open("novel.txt", "rb") as f:
response = requests.post(
"http://localhost:8000/api/v1/project/create",
json={
"novel_file": "/path/to/novel.txt",
"title": "我的小说",
"style": "japanese",
"max_scenes": 20,
"enable_voice": True,
"enable_bgm": False,
}
)
project_id = response.json()["project_id"]
# 查询生成状态
status_response = requests.get(
f"http://localhost:8000/api/v1/project/{project_id}/status"
)
print(status_response.json())- 支持更多小说格式
- 增强角色一致性算法
- 支持自定义动漫风格
- 优化处理速度
- 添加更多转场效果
- 支持实时预览
- 批量任务管理
- 用户认证与权限管理
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交变更 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
MIT