视频 → 简介.md 智能总结 · 多用户自部署版
把一段视频自动变成一份图文速览 Markdown —— 整体框架、关键时间轴、关键画面截图、语音转写,一次生成,随时回看
简体中文 | English
把一段视频(本地文件或 抖音/B站/YouTube/直链 网址)自动变成一份图文速览 Markdown: 整体框架、关键时间轴、关键画面截图、语音转写,一次生成,随时回看。
本项目是可自部署的多用户 Web 应用:下载后自己配 API Key、自己跑,注册账号登录, 每个账号都有独立的历史记录(历史里的每一份总结都能在线查看 / 下载 / 删除)。 你的视频只经过你自己的机器,数据不出门。
- 🎞️ 本地视频拖拽上传,或粘贴视频网址(抖音零配置解析、B站、YouTube、直链)
- 🧠 三级智能流水线:FunASR 中文转写 → 豆包视觉看图 → DeepSeek 成稿
- 📚 账号密码登录(开放注册),每用户独立历史记录,SQLite 持久化、重启不丢
- 🔒 文件按用户隔离,所有接口做属主校验,跨账号访问一律 403
- 📄 结果支持:在线预览(左源码右渲染)、下载 .md、下载 zip 打包(含截图,离线可看)
- 💬 对视频 AI 提问:生成后可直接问「男主有没有唱歌?」「男女主最后亲吻了吗?」—— 以转写稿+截图作上下文,默认走你自带的 Key(DeepSeek 文本 / 豆包看图),智谱免费模型兜底,问答历史可回看
- 🐳 Docker 一条命令跑通;也可原生 Python 直接跑
需要先装 Docker。
完全没装过 Docker 的 Windows 用户,请先看 docs/Docker部署教程.md(从装 Docker 到跑通,逐步图解)。
git clone https://github.com/tobyberry666/Broccoli
cd Broccoli
cp .env.example .env # 然后编辑 .env 填入你的 API Key(见下节)
docker compose up -d --build🇨🇳 国内网络加速:默认 pip 直连 pypi.org 很慢。在
.env加一行PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple再用清华源构建,能省一大半时间。 项目会挂载宿主机modelscope_cache/、hf_cache/复用已下载的模型,不会在容器里重复下载。
浏览器打开 http://localhost:8000 → 注册账号 → 开用。
数据保存在 ./data,容器重建/升级不丢。
- 需要 Python 3.10 ~ 3.14,Windows / Linux / macOS 均可
- ffmpeg 无需单独安装(
imageio-ffmpeg自带二进制)
git clone https://github.com/tobyberry666/Broccoli
cd Broccoli
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # 编辑填入 API Key
python -m uvicorn main:app --host 0.0.0.0 --port 8000Windows 也可以直接双击 start.bat;Linux/macOS 可 ./start.sh。
⚠️ 首次运行会自动下载 ASR 模型(FunASR 约 2.1G,faster-whisper 备用约 240M), 之后命中缓存不再下载。模型缓存目录:modelscope_cache/、hf_cache/。
填 Key 有两种方式(通用,下面拿 Key 的步骤两种填法都一样):
- 方式 A ·
.env(全局默认):把 Key 写进.env,所有账号在网页没单独配时自动共用。 适合运维给一台服务器统一配好、全员开箱即用。 - 方式 B · 网页「⚙️ 设置」页(每用户独立):登录后给自己填 Key,仅对自己生效、多人互不干扰。
个人玩家完全可以不碰
.env,注册登录后直接去设置页填,填完立即生效、无需重启。
| 用途 | 服务 | 是否必填 | 说明 |
|---|---|---|---|
| 写总结文档 | DeepSeek | ✅ 必填 | https://platform.deepseek.com 创建 Key |
| 看画面截图 | 火山方舟·豆包 | 建议 | 不配则产出无截图版 md |
| 语音转写兜底 | OpenAI Whisper API | 可选 | 本地模型下载失败时自动回退 |
DeepSeek(必填)
- 注册 https://platform.deepseek.com → API Keys → 创建
- 填入
.env的DEEPSEEK_API_KEY
火山方舟·豆包视觉(强烈建议)
- 打开火山方舟控制台 https://console.volcengine.com/ark
- 「API Key 管理」创建 Key → 填
ARK_API_KEY - 「在线推理 → 创建推理端点」,选
doubao-seed-2-1系列模型,得到ep-开头的端点 ID - 填
ARK_VISION_MODEL=ep-xxxx(⚠️ 必须填端点 ID,直接填模型名会 404)
智谱 · AI 问答兜底(可选,免费)
- 打开 https://open.bigmodel.cn 注册并实名认证 → 「API Keys」创建 Key
- 填入
.env的ZHIPU_API_KEY - 这是兜底模型:文本问答默认走 DeepSeek、看图默认走豆包;它们没配时才用智谱免费模型 (文本 GLM-4.7-Flash、看图 GLM-4V-Flash;免费档高峰期限流会逐个降级,最后仍失败会明确报错)
- 不配也完全能用:提问直接走 DeepSeek(文本)+ 豆包(看图)
不想动手改 .env?登录后直接在网页里填自己的 Key 就行,每个账号独立、互不干扰:
- 登录后点右上角 ⚙️ 设置(或直接访问
/settings)。 - 页面顶部状态条实时显示 DeepSeek / 豆包视觉 / 智谱问答 / OpenAI 兜底 各自是否「已就绪」(绿)/「未配置」(红)。
- 每组卡片填对应字段(如火山方舟的
ARK_API_KEY+ARK_VISION_MODEL端点 ID、 DeepSeek 的DEEPSEEK_API_KEY),点「👁」可临时显示/隐藏明文;改完点 保存全部改动,立即生效、无需重启。 - 每张卡有 测试连接 按钮:会真实发一个极小的探针请求验证 Key 是否有效 (用一张 14×14 的测试图,不消耗真实额度),结果直接回显在卡片上。
- 单字段 清除 只清当前账号该字段的自定义值、回退到
.env; 清空我的全部自定义配置 一键还原到全局默认。
优先级(高 → 低):用户设置页填的 > .env 全局默认 > 内置默认。
也就是说:你填了就用自己的,没填就用服务器 .env 的,.env 也没有就提示去设置页。
落库安全:用户级 Key 用标准库实现的对称加密(secretbox,
Encrypt-then-MAC + SHA256-CTR)存储,数据库文件里搜不到明文 Key;
非敏感字段(如端点 ID)明文存,便于排查。主密钥取 APP_SECRET_KEY,
没设则首次启动自动生成 data/.secret_key。
-
注册/登录:打开页面即见登录框,注册后自动登录
-
配置 API Key(可选):若服务器没配
.env,首次点「开始总结」会提示去 「⚙️ 设置」填自己的 DeepSeek / 火山方舟 Key(详见上节),填完立即可用。 服务器已配.env则跳过这步。 -
生成总结:拖入视频文件,或粘贴视频网址 → 点「开始总结」
- 页面实时显示各阶段进度(下载→分析→抽帧→转写→看图→成稿)
- 抖音链接:自动解析无水印直链下载,无需登录
- 腾讯会议回放需登录态,请先用浏览器下载 mp4 再上传
-
历史记录:每次生成自动归档。可在线查看、下载 .md、下载 zip 打包、删除
-
AI 问答:任务完成后,在结果区或历史详情页输入问题(如「中国人到底会不会飞?」「小帅到底是不是凶手?」) → 回车即得基于转写稿+截图的回答。问答记录自动保存,随时回看。
| 变量 | 默认 | 说明 |
|---|---|---|
DEEPSEEK_API_KEY |
- | DeepSeek Key(必填) |
ARK_API_KEY / ARK_VISION_MODEL |
- | 豆包视觉 Key / 推理端点 ID |
ASR_ENGINE |
funasr |
转写引擎:funasr / whisper |
ZHIPU_API_KEY |
- | 智谱免费 Key,问答兜底(DeepSeek/豆包没配时用) |
QA_TEXT_MODEL |
glm-4.7-flash |
文本问答兜底模型(智谱免费;主路径是 DeepSeek) |
QA_VISION_MODEL |
glm-4v-flash |
画面问答兜底模型(智谱免费;主路径是豆包) |
REGISTER_OPEN |
true |
是否开放注册,公网部署建议 false |
MAX_UPLOAD_MB |
0 |
上传大小上限(MB),0 = 不限 |
MAX_CONCURRENT_JOBS |
2 |
同时处理的任务数 |
MAX_JOBS_PER_USER |
100 |
每用户历史条数上限,超出自动删最旧 |
KEEP_SOURCE_VIDEO |
false |
处理完自动删源视频/音频(省磁盘);true 则保留 |
BLOCK_PRIVATE_URLS |
true |
网址下载屏蔽内网地址(SSRF 防护) |
启动报端口占用([Errno 10048])
旧进程没退。Windows:PowerShell 执行
Get-Process -Id (Get-NetTCPConnection -LocalPort 8000).OwningProcess | Stop-Process -Force 再启动。
模型下载报 SSL 证书错误
代码已默认关闭证书校验([SSL-FIX-v3] 日志)。若仍失败,确认 HF_ENDPOINT 指向
https://hf-mirror.com 且 HF_HUB_DISABLE_XET=1;彻底绕开的办法是配 OPENAI_API_KEY 走 API 回退。
抖音链接解析失败
抖音反爬策略会变。稍后重试;仍失败就从
Evil0ctal/Douyin_TikTok_Download_API
同步 douyin_api/crawlers 目录;终极兜底:手机 App 下载 mp4 后拖入上传。
视觉显示「未启用」
检查 .env 的 ARK_VISION_MODEL 是否为 ep- 开头的推理端点 ID(不是模型名);
确认方舟控制台该模型已开通。
- 默认开放注册:仅建议在内网/可信环境使用。若部署到公网,请设
REGISTER_OPEN=false并自行加访问白名单(如反代鉴权),且保持BLOCK_PRIVATE_URLS=true防 SSRF。 - 用户级 Key 加密存储:在网页设置页填的 Key 经
secretbox(标准库对称加密 + Encrypt-then-MAC)落库,明文不进 SQLite;主密钥来自APP_SECRET_KEY,未设则自动生成data/.secret_key。.env里的 Key 仍按原样读取,建议.env文件权限收紧、不要外泄。 - 上传视频、生成截图与总结会占用磁盘,超出
MAX_JOBS_PER_USER会自动清理最旧记录, 也可在历史记录里手动删除。
FastAPI (main.py)
├── auth.py 账号密码 + HttpOnly Cookie 会话(pbkdf2 哈希,纯标准库)
├── db.py SQLite 持久化:users / sessions / jobs(标准库 sqlite3)
├── pipeline.py 流水线:ffmpeg 抽音频+抽帧 → FunASR(→whisper→OpenAI 回退)
│ → 豆包视觉逐帧辨认(可降级) → DeepSeek 成稿
│ 并发上限信号量;网址下载带 SSRF 防护
└── static/ 纯 HTML/JS 前端(零构建):登录页 / 新建总结 / 历史记录
数据目录 data/:app.db、uploads/、frames/、output/(按用户隔离)
产物路径规则:data/frames/{user_id}/{job_id}/frame_NNNN.jpg,
总结全文同时入库(历史记录不依赖文件是否被清理)。
- 本项目所有大模型调用均走外部 API(DeepSeek / 火山方舟),本地只做转码、抽帧与编排。
- 密钥只存在于你自己的
.env,已被 gitignore,不会进仓库。 - 仅供学习与个人使用,请遵守各视频平台条款与相关法律法规。
简体中文 | English
用爱发电 ❤️ 觉得好用就 Star 一下