一个端到端的 AI 视频生成平台:输入故事文本,自动生成分镜、图片、配音,最终合成完整视频。
StoryToVideo 是一个将文本故事自动转化为视频的 AI 创作工具。用户只需输入一段故事文本,系统将自动:
- 分镜生成 - 利用 LLM 将故事拆解为结构化分镜脚本
- 图像生成 - 使用 Stable Diffusion 为每个分镜生成关键帧
- 语音合成 - 通过 TTS 模型生成配音旁白
- 视频合成 - 将所有素材拼接为完整 MP4 视频
| 特性 | 说明 |
|---|---|
| 🚀 端到端自动化 | 从文本到视频,全流程 AI 驱动 |
| 🎨 多风格支持 | 电影风、二次元、写实等多种预设风格 |
| ✏️ 可编辑分镜 | 支持手动调整 Prompt、旁白、转场效果 |
| 💻 跨平台客户端 | 基于 Qt/QML 的桌面应用,支持 Windows/macOS |
| 🔧 模块化架构 | 前后端分离,模型服务可独立部署 |
┌─────────────────────────────────────────────────────────────────────────┐
│ 用户层 │
│ PC 客户端 (Qt 6.5 / QML / C++) │
└───────────────────────────────┬─────────────────────────────────────────┘
│ REST API / WebSocket
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 后端服务层 (云端) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Go/Gin │ │ PostgreSQL │ │ Redis+Asynq │ │ MinIO │ │
│ │ API 服务 │ │ 数据库 │ │ 任务队列 │ │ 对象存储 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────────────────┬─────────────────────────────────────────┘
│ FRP 内网穿透
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 模型服务层 (本地 GPU) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ LLM │ │ SD Turbo │ │ SVD │ │ CosyVoice │ │
│ │ Qwen2.5-0.5B│ │ 文生图 │ │ 图生视频 │ │ TTS 语音 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ Python FastAPI Gateway │
└─────────────────────────────────────────────────────────────────────────┘
用户输入故事 → LLM 生成分镜 → SD 生成图片 → TTS 生成配音 → FFmpeg 合成视频 → 导出 MP4
| 功能 | 描述 |
|---|---|
| 新建故事 | 输入文本(≤500字),选择风格,一键生成分镜 |
| 分镜看板 | 横向卡片流展示,状态可视化(等待/生成中/完成/失败) |
| 分镜编辑 | 编辑 Prompt、旁白文本、选择转场效果 |
| 图片生成 | 基于 SD Turbo 的快速文生图 |
| 视频预览 | 内置播放器,支持播放/暂停/进度控制 |
| 视频导出 | 导出为 MP4 文件 |
| 项目管理 | 历史项目查看、删除 |
- 图生视频 (SVD Img2Vid)
- 背景音乐合成
- 多语言 TTS
- 批量导出
- 云端项目同步
StoryToVideo/
├── 📂 client/ # 客户端代码 (Qt/QML)
│ ├── 📂 12.2StoryToVideo/ # Qt/QML 主项目
│ │ ├── main.cpp # 程序入口
│ │ ├── main.qml # 主界面 (StackView 导航)
│ │ ├── NetworkManager.cpp/h # 网络请求封装
│ │ ├── ViewModel.cpp/h # 视图模型层
│ │ ├── datamanager.cpp/h # 本地数据管理
│ │ ├── videoexporter.cpp/h # 视频导出 (FFmpeg)
│ │ ├── AssetsPage.qml # 资产库/首页
│ │ ├── CreatePage.qml # 新建故事页
│ │ ├── StoryboardPage.qml # 分镜看板页
│ │ ├── ShotDetailPage.qml # 分镜详情页
│ │ ├── PreviewPage.qml # 预览导出页
│ │ └── Assets/ # 静态资源
│ └── README.md # 客户端说明
│
├── 📂 server/ # 服务端代码 (Go/Gin)
│ ├── main.go # 服务入口
│ ├── 📂 config/ # 配置
│ ├── 📂 models/ # 数据模型 (Project/Shot/Task)
│ ├── 📂 routers/ # API 路由
│ └── 📂 service/ # 业务逻辑 (队列/OSS/处理器)
│
├── 📂 gateway/ # 模型网关 (Python/FastAPI)
│ └── main.py # 聚合 LLM/SD/TTS 调用
│
├── 📂 model/ # 模型服务 (Python)
│ ├── 📂 services/ # 各模型服务
│ │ ├── llm.py # LLM 分镜生成 (Qwen2.5)
│ │ ├── txt2img.py # 文生图 (SD Turbo)
│ │ ├── img2vid.py # 图生视频 (SVD)
│ │ └── tts.py # 语音合成 (CosyVoice)
│ ├── 📂 scripts/ # 启动脚本
│ └── requirements.txt
│
├── 📂 frp/ # FRP 内网穿透配置
│ ├── frpc.toml # 本地客户端配置
│ └── frps.ini.sample # 云端服务配置示例
│
├── 📂 docs/ # 项目文档
│ ├── 飞书文档汇总.md # 完整项目文档
│ └── 项目说明文档.md # 详细说明
│
├── 📄 environment.yml # Conda 环境配置
├── 📄 start.sh # 快速启动脚本
└── 📄 README.md # 本文件
| 组件 | 版本要求 |
|---|---|
| 操作系统 | Windows 10+ / macOS 12+ / Ubuntu 20.04+ |
| Qt | 6.5+ (with Qt Quick) |
| Go | 1.21+ |
| Python | 3.10+ |
| CUDA | 12.x (GPU 推理) |
| GPU 显存 | ≥ 8GB (推荐 16GB+) |
# 1. 克隆仓库
git clone https://github.com/JadeSnow7/StoryToVideo.git
cd StoryToVideo
# 2. 启动服务端 (需要配置好 config.yaml)
cd server
go run main.go
# 3. 启动模型网关 (另开终端)
cd gateway
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000
# 4. 构建并运行客户端 (另开终端)
cd client/12.2StoryToVideo
mkdir build && cd build
cmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt/6.5.0/macos
cmake --build .
./StoryToVideoGenerator.app/Contents/MacOS/StoryToVideoGenerator# 安装依赖
cd server
go mod tidy
# 配置数据库和 Redis
cp config/config.yaml.example config/config.yaml
vim config/config.yaml
# 运行
go run main.go
# 或构建后运行
go build -o server && ./serverconfig.yaml 示例:
server:
port: ":8081"
database:
host: "localhost"
port: 5432
user: "postgres"
password: "your_password"
dbname: "storytovideo"
redis:
addr: "localhost:6379"
password: ""
minio:
endpoint: "localhost:9000"
access_key: "minioadmin"
secret_key: "minioadmin"
bucket: "storytovideo"
use_ssl: false
worker:
endpoint: "http://localhost:8000" # Gateway 地址cd gateway
pip install -r requirements.txt
# 配置环境变量
export LLM_URL="http://localhost:11434/api/chat"
export TXT2IMG_URL="http://localhost:8002/generate"
export IMG2VID_URL="http://localhost:8003/generate"
export TTS_URL="http://localhost:8004/narration"
# 启动
uvicorn main:app --host 0.0.0.0 --port 8000# 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 拉取模型
ollama pull qwen2.5:0.5b-instruct
# 启动服务
ollama servecd model
pip install diffusers transformers accelerate torch
# 启动服务
uvicorn services.txt2img:app --host 0.0.0.0 --port 8002git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git
cd CosyVoice
pip install -r requirements.txt
# 启动服务
cd runtime/python/fastapi
python server.py --model_dir ../../pretrained_models/CosyVoice2-0.5B --port 8004云端 (frps):
[common]
bind_port = 7000本地 (frpc.toml):
serverAddr = "your.server.ip"
serverPort = 7000
[[proxies]]
name = "gateway"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8000
remotePort = 8000cd client/12.2StoryToVideo
mkdir build && cd build
# macOS
cmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt/6.5.0/macos
cmake --build .
# Windows (使用 Qt Creator 或 CMake)
cmake .. -G "Visual Studio 17 2022" -DCMAKE_PREFIX_PATH=C:/Qt/6.5.0/msvc2019_64
cmake --build . --config Release| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/v1/api/projects |
创建项目并生成分镜 |
GET |
/v1/api/projects/:id |
获取项目详情 |
GET |
/v1/api/projects/:id/shots |
获取分镜列表 |
POST |
/v1/api/projects/:id/shots/:shot_id |
更新分镜 |
POST |
/v1/api/projects/:id/video |
触发视频合成 |
GET |
/v1/api/tasks/:task_id |
查询任务状态 |
DELETE |
/v1/api/projects/:id |
删除项目 |
创建项目:
curl -X POST "http://localhost:8081/v1/api/projects?Title=测试故事&StoryText=从前有一只小猫&Style=cinematic&ShotCount=4"响应:
{
"project_id": "proj-xxxxx",
"text_task_id": "task-text-xxxxx",
"shot_task_ids": ["task-shot-001", "task-shot-002", "task-shot-003", "task-shot-004"]
}查询任务状态:
curl "http://localhost:8081/v1/api/tasks/task-text-xxxxx"响应:
{
"task": {
"id": "task-text-xxxxx",
"status": "finished",
"progress": 100,
"result": {
"resource_type": "storyboard",
"resource_url": "https://minio.xxx/storyboards/xxx.json"
}
}
}| 层级 | 技术 | 说明 |
|---|---|---|
| 客户端 | Qt 6.5+ / QML / C++ | 跨平台桌面应用 |
| 服务端 | Go 1.21+ / Gin | RESTful API 服务 |
| 数据库 | PostgreSQL | 关系型数据存储 |
| 任务队列 | Redis + Asynq | 异步任务处理 |
| 对象存储 | MinIO | 图片/视频资源存储 |
| 模型网关 | Python / FastAPI | AI 模型编排 |
| LLM | Qwen2.5-0.5B (Ollama) | 分镜脚本生成 |
| 文生图 | SD Turbo (diffusers) | 快速图像生成 |
| TTS | CosyVoice | 语音合成 |
| 内网穿透 | FRP | 本地 GPU 远程调用 |
A: 检查以下几点:
- 确认 MinIO 服务正常运行
- 检查
image_path是否为完整 URL(MinIO 返回的是签名 URL) - 客户端网络是否能访问 MinIO 地址
A:
- 检查 Redis 服务是否正常
- 查看 server 日志是否有任务入队
- 确认 Gateway 服务可访问
A:
- 检查 GPU 显存是否充足(建议 8GB+)
- 确认 SD Turbo 模型已下载
- 查看 txt2img 服务日志
A: 修改 client/12.2StoryToVideo/NetworkManager.h 中的常量:
const QUrl PROJECT_API_URL = QUrl("http://your-server:8081/v1/api/projects");欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本项目采用 MIT 协议开源,详见 LICENSE 文件。
| 角色 | 职责 |
|---|---|
| 客户端开发 | Qt/QML 界面、网络封装、本地存储 |
| 服务端开发 | Go API、任务队列、数据库设计 |
| AI 工程师 | 模型部署、Prompt 优化、效果调优 |
📌 最后更新: 2025.12.06 | 版本: v1.0.0