From 561d74e16d9a95053504af985497d1cff05c3902 Mon Sep 17 00:00:00 2001 From: Kevin Wong Date: Fri, 23 Jan 2026 10:07:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/DEPLOY_MANUAL.md | 231 ++++++++++++++++++++++-------------- Docs/DevLogs/Day8.md | 113 ++++++++++++++++++ Docs/DevLogs/Day9.md | 119 +++++++++++++++++++ Docs/implementation_plan.md | 32 ++++- Docs/task_complete.md | 42 ++++++- 5 files changed, 442 insertions(+), 95 deletions(-) create mode 100644 Docs/DevLogs/Day8.md create mode 100644 Docs/DevLogs/Day9.md diff --git a/Docs/DEPLOY_MANUAL.md b/Docs/DEPLOY_MANUAL.md index 371e9d8..c1caad7 100644 --- a/Docs/DEPLOY_MANUAL.md +++ b/Docs/DEPLOY_MANUAL.md @@ -27,12 +27,18 @@ node --version # 检查 FFmpeg ffmpeg -version + +# 检查 pm2 (用于服务管理) +pm2 --version ``` -如果缺少 FFmpeg: +如果缺少依赖: ```bash sudo apt update sudo apt install ffmpeg + +# 安装 pm2 +npm install -g pm2 ``` --- @@ -48,7 +54,30 @@ cd /home/rongye/ProgramFiles/ViGent2 --- -## 步骤 3: 安装后端依赖 +## 步骤 3: 部署 AI 模型 (LatentSync 1.6) + +> ⚠️ **重要**:LatentSync 需要独立的 Conda 环境和 **~18GB VRAM**。请**不要**直接安装在后端环境中。 + +请参考详细的独立部署指南: +**[LatentSync 部署指南](../models/LatentSync/DEPLOY.md)** + +该指南包含以下关键步骤,请务必严格按照文档操作: +1. 创建独立的 `latentsync` Conda 环境 +2. 安装 PyTorch 2.5.1 和相关依赖 +3. 下载模型权重 (HuggingFace CLI) +4. 复制核心推理代码 +5. 验证推理脚本 + +**验证 LatentSync 部署**: +```bash +cd /home/rongye/ProgramFiles/ViGent2/models/LatentSync +conda activate latentsync +python -m scripts.server # 测试能否启动,Ctrl+C 退出 +``` + +--- + +## 步骤 4: 安装后端依赖 ```bash cd /home/rongye/ProgramFiles/ViGent2/backend @@ -69,47 +98,16 @@ playwright install chromium --- -## 步骤 4: 部署 AI 模型 (LatentSync 1.6) - -> ⚠️ **重要**:LatentSync 需要独立的 Conda 环境和 **~18GB VRAM**。请**不要**直接安装在后端环境中。 - -请参考详细的独立部署指南: -**[LatentSync 部署指南](../models/LatentSync/DEPLOY.md)** - -该指南包含以下关键步骤,请务必严格按照文档操作: -1. 创建独立的 `latentsync` Conda 环境 -2. 安装 PyTorch 2.5.1 和相关依赖 -3. 下载模型权重 (HuggingFace CLI) -4. 复制核心推理代码 -5. 验证推理脚本 - -确保 LatentSync 部署成功后,再继续后续步骤。 - ---- - -## 步骤 5: 启动 LatentSync 常驻加速服务 (可选) - -为了消除每次生成视频时的 30-40秒 模型加载时间,建议启动常驻服务: - -```bash -cd /home/rongye/ProgramFiles/ViGent2/models/LatentSync - -# 后台启动服务 (自动读取 backend/.env 中的 GPU 配置) -nohup python -m scripts.server > server.log 2>&1 & -``` - ---- - -## 步骤 7: 配置环境变量 +## 步骤 5: 配置环境变量 ```bash cd /home/rongye/ProgramFiles/ViGent2/backend -# 复制配置模板 (默认配置已经就绪) +# 复制配置模板 cp .env.example .env ``` -> 💡 **说明**:`.env.example` 已包含正确的 LatentSync 默认配置,直接复制即可使用。 +> 💡 **说明**:`.env.example` 已包含正确的默认配置,直接复制即可使用。 > 如需自定义,可编辑 `.env` 修改以下参数: | 配置项 | 默认值 | 说明 | @@ -122,20 +120,25 @@ cp .env.example .env --- -## 步骤 8: 安装前端依赖 +## 步骤 6: 安装前端依赖 ```bash cd /home/rongye/ProgramFiles/ViGent2/frontend # 安装依赖 npm install + +# 生产环境构建 (可选) +npm run build ``` --- -## 步骤 9: 测试运行 +## 步骤 7: 测试运行 -### 启动后端 +> 💡 先手动启动测试,确认一切正常后再配置 pm2 常驻服务。 + +### 启动后端 (终端 1) ```bash cd /home/rongye/ProgramFiles/ViGent2/backend @@ -143,16 +146,22 @@ source venv/bin/activate uvicorn app.main:app --host 0.0.0.0 --port 8006 ``` -### 启动前端 (新开终端) +### 启动前端 (终端 2) ```bash cd /home/rongye/ProgramFiles/ViGent2/frontend npm run dev -- -H 0.0.0.0 --port 3002 ``` ---- +### 启动 LatentSync (终端 3, 可选加速) -## 步骤 10: 验证 +```bash +cd /home/rongye/ProgramFiles/ViGent2/models/LatentSync +conda activate latentsync +python -m scripts.server +``` + +### 验证 1. 访问 http://服务器IP:3002 查看前端 2. 访问 http://服务器IP:8006/docs 查看 API 文档 @@ -160,53 +169,72 @@ npm run dev -- -H 0.0.0.0 --port 3002 --- -## 使用 systemd 管理服务 (可选) +## 步骤 8: 使用 pm2 管理常驻服务 -### 后端服务 +> 推荐使用 pm2 管理所有服务,支持自动重启和日志管理。 -创建 `/etc/systemd/system/vigent2-backend.service`: -```ini -[Unit] -Description=ViGent2 Backend API -After=network.target +### 创建 pm2 配置文件 -[Service] -Type=simple -User=rongye -WorkingDirectory=/home/rongye/ProgramFiles/ViGent2/backend -Environment="PATH=/home/rongye/ProgramFiles/ViGent2/backend/venv/bin" -ExecStart=/home/rongye/ProgramFiles/ViGent2/backend/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8006 -Restart=always +创建 `/home/rongye/ProgramFiles/ViGent2/ecosystem.config.js`: -[Install] -WantedBy=multi-user.target +```javascript +module.exports = { + apps: [ + { + name: 'vigent2-backend', + cwd: '/home/rongye/ProgramFiles/ViGent2/backend', + script: 'venv/bin/uvicorn', + args: 'app.main:app --host 0.0.0.0 --port 8006', + interpreter: 'none', + env: { + PATH: '/home/rongye/ProgramFiles/ViGent2/backend/venv/bin:' + process.env.PATH + } + }, + { + name: 'vigent2-frontend', + cwd: '/home/rongye/ProgramFiles/ViGent2/frontend', + script: 'npm', + args: 'run start', + env: { + PORT: 3002 + } + }, + { + name: 'vigent2-latentsync', + cwd: '/home/rongye/ProgramFiles/ViGent2/models/LatentSync', + script: 'python', + args: '-m scripts.server', + interpreter: '/home/rongye/miniconda3/envs/latentsync/bin/python' + } + ] +}; ``` -### 前端服务 - -创建 `/etc/systemd/system/vigent2-frontend.service`: -```ini -[Unit] -Description=ViGent2 Frontend -After=network.target - -[Service] -Type=simple -User=rongye -WorkingDirectory=/home/rongye/ProgramFiles/ViGent2/frontend -ExecStart=/usr/bin/npm run start -Restart=always - -[Install] -WantedBy=multi-user.target -``` - -### 启用服务 +### 启动服务 ```bash -sudo systemctl daemon-reload -sudo systemctl enable vigent2-backend vigent2-frontend -sudo systemctl start vigent2-backend vigent2-frontend +cd /home/rongye/ProgramFiles/ViGent2 + +# 启动所有服务 +pm2 start ecosystem.config.js + +# 查看状态 +pm2 status + +# 设置开机自启 +pm2 save +pm2 startup # 按提示执行生成的命令 +``` + +### pm2 常用命令 + +```bash +pm2 status # 查看所有服务状态 +pm2 logs # 查看所有日志 +pm2 logs vigent2-backend # 查看后端日志 +pm2 restart all # 重启所有服务 +pm2 stop vigent2-latentsync # 停止 LatentSync 服务 +pm2 delete all # 删除所有服务 ``` --- @@ -227,14 +255,45 @@ python3 -c "import torch; print(torch.cuda.is_available())" # 查看端口占用 sudo lsof -i :8006 sudo lsof -i :3002 +sudo lsof -i :8007 ``` ### 查看日志 ```bash -# 后端日志 -journalctl -u vigent2-backend -f - -# 前端日志 -journalctl -u vigent2-frontend -f +# pm2 日志 +pm2 logs vigent2-backend +pm2 logs vigent2-frontend +pm2 logs vigent2-latentsync ``` + +--- + +## 依赖清单 + +### 后端关键依赖 + +| 依赖 | 用途 | +|------|------| +| `fastapi` | Web API 框架 | +| `uvicorn` | ASGI 服务器 | +| `edge-tts` | 微软 TTS 配音 | +| `playwright` | 社交媒体自动发布 | +| `biliup` | B站视频上传 | +| `loguru` | 日志管理 | + +### 前端关键依赖 + +| 依赖 | 用途 | +|------|------| +| `next` | React 框架 | +| `swr` | 数据请求与缓存 | +| `tailwindcss` | CSS 样式 | + +### LatentSync 关键依赖 + +| 依赖 | 用途 | +|------|------| +| `torch` 2.5.1 | PyTorch GPU 推理 | +| `diffusers` | Latent Diffusion 模型 | +| `accelerate` | 模型加速 | diff --git a/Docs/DevLogs/Day8.md b/Docs/DevLogs/Day8.md new file mode 100644 index 0000000..cdd4fc1 --- /dev/null +++ b/Docs/DevLogs/Day8.md @@ -0,0 +1,113 @@ +# Day 8: 用户体验优化 + +**日期**: 2026-01-22 +**目标**: 文件名保留 + 视频持久化 + 界面优化 + +--- + +## 📋 任务概览 + +| 任务 | 状态 | +|------|------| +| 文件名保留 | ✅ 完成 | +| 视频持久化 | ✅ 完成 | +| 历史视频列表 | ✅ 完成 | +| 删除功能 | ✅ 完成 | + +--- + +## 🎉 实施成果 + +### 后端改动 + +**修改文件**: +- `backend/app/api/materials.py` + - ✅ `sanitize_filename()` 文件名安全化 + - ✅ 时间戳前缀避免冲突 (`{timestamp}_{原始文件名}`) + - ✅ `list_materials` 显示原始文件名 + - ✅ `DELETE /api/materials/{id}` 删除素材 + +- `backend/app/api/videos.py` + - ✅ `GET /api/videos/generated` 历史视频列表 + - ✅ `DELETE /api/videos/generated/{id}` 删除视频 + +### 前端改动 + +**修改文件**: +- `frontend/src/app/page.tsx` + - ✅ `GeneratedVideo` 类型定义 + - ✅ `generatedVideos` 状态管理 + - ✅ `fetchGeneratedVideos()` 获取历史 + - ✅ `deleteMaterial()` / `deleteVideo()` 删除功能 + - ✅ 素材卡片添加删除按钮 (hover 显示) + - ✅ 历史视频列表组件 (右侧预览区下方) + - ✅ 生成完成后自动刷新历史列表 + +--- + +## 🔧 API 变更 + +### 新增端点 + +| 方法 | 路径 | 说明 | +|------|------|------| +| GET | `/api/videos/generated` | 获取生成视频列表 | +| DELETE | `/api/videos/generated/{id}` | 删除生成视频 | +| DELETE | `/api/materials/{id}` | 删除素材 | + +### 文件命名规则 + +``` +原始: 测试视频.mp4 +保存: 1737518400_测试视频.mp4 +显示: 测试视频.mp4 (前端自动去除时间戳前缀) +``` + +--- + +## ✅ 完成总结 + +1. **文件名保留** - 上传保留原始名称,时间戳前缀避免冲突 +2. **视频持久化** - 从文件系统读取,刷新不丢失 +3. **历史列表** - 右侧显示历史视频,点击切换播放 +4. **删除功能** - 素材和视频均支持删除 + +--- + +## 📊 测试清单 + +- [x] 上传视频后检查素材列表显示原始文件名 +- [x] 刷新页面后检查历史视频列表持久化 +- [x] 测试删除素材功能 +- [x] 测试删除生成视频功能 +- [x] 测试历史视频列表点击切换播放 + +--- + +## 🔧 发布功能修复 (Day 8 下半场) + +> 以下修复在用户体验优化后进行 + +### 问题 + +1. **抖音 QR 登录假成功** - 前端检测到旧 Cookie 文件就显示"登录成功",实际可能已过期 +2. **抖音上传循环卡死** - 发布后检测逻辑不完善,`while True` 无超时 +3. **前端轮询不规范** - 使用 `setInterval` 手动轮询,不符合 React 最佳实践 + +### 修复 + +**后端**: +- `publish_service.py` - 添加 `logout()` 方法、修复 `get_login_session_status()` 优先检查活跃会话 +- `api/publish.py` - 新增 `POST /api/publish/logout/{platform}` 端点 +- `douyin_uploader.py` - 添加 `import time`,修复发布按钮点击竞态条件 + +**前端**: +- `publish/page.tsx` - 使用 `useSWR` 替代 `setInterval` 轮询登录状态 +- `package.json` - 添加 `swr` 依赖 + +### 新增 API + +| 方法 | 路径 | 说明 | +|------|------|------| +| POST | `/api/publish/logout/{platform}` | 注销平台登录 | + diff --git a/Docs/DevLogs/Day9.md b/Docs/DevLogs/Day9.md new file mode 100644 index 0000000..e031cb9 --- /dev/null +++ b/Docs/DevLogs/Day9.md @@ -0,0 +1,119 @@ +# Day 9: 发布模块代码优化 + +**日期**: 2026-01-23 +**目标**: 代码质量优化 + 发布功能验证 + +--- + +## 📋 任务概览 + +| 任务 | 状态 | +|------|------| +| B站/抖音发布验证 | ✅ 完成 | +| 资源清理保障 (try-finally) | ✅ 完成 | +| 超时保护 (消除无限循环) | ✅ 完成 | +| 小红书 headless 模式修复 | ✅ 完成 | +| API 输入验证 | ✅ 完成 | +| 类型提示完善 | ✅ 完成 | +| 服务层代码优化 | ✅ 完成 | + +--- + +## 🎉 发布验证结果 + +### 登录功能 +- ✅ **B站登录成功** - 策略3(Text)匹配,Cookie已保存 +- ✅ **抖音登录成功** - 策略3(Text)匹配,Cookie已保存 + +### 发布功能 +- ✅ **抖音发布成功** - 自动关闭弹窗、跳转管理页面 +- ✅ **B站发布成功** - API返回 `bvid: BV14izPBQEbd` + +--- + +## 🔧 代码优化 + +### 1. 资源清理保障 + +**问题**:Playwright 浏览器在异常路径可能未关闭 + +**修复**:`try-finally` 模式确保资源释放 +```python +browser = None +context = None +try: + browser = await playwright.chromium.launch(headless=True) + context = await browser.new_context(...) + # ... 业务逻辑 ... +finally: + if context: + try: await context.close() + except Exception: pass + if browser: + try: await browser.close() + except Exception: pass +``` + +### 2. 超时保护 + +**问题**:`while True` 循环可能导致任务卡死 + +**修复**:添加类级别超时常量 +```python +class DouyinUploader(BaseUploader): + UPLOAD_TIMEOUT = 300 # 视频上传超时 + PUBLISH_TIMEOUT = 180 # 发布检测超时 + PAGE_REDIRECT_TIMEOUT = 60 # 页面跳转超时 +``` + +### 3. B站 bvid 提取修复 + +**问题**:API 返回的 bvid 在 `data` 字段内 + +**修复**:同时检查多个位置 +```python +bvid = ret.get('data', {}).get('bvid') or ret.get('bvid', '') +aid = ret.get('data', {}).get('aid') or ret.get('aid', '') +``` + +### 4. API 输入验证 + +**修复**:所有端点添加平台验证 +```python +SUPPORTED_PLATFORMS = {"bilibili", "douyin", "xiaohongshu"} + +if platform not in SUPPORTED_PLATFORMS: + raise HTTPException(status_code=400, detail=f"不支持的平台: {platform}") +``` + +--- + +## 📁 修改文件列表 + +### 后端 + +| 文件 | 修改内容 | +|------|----------| +| `app/api/publish.py` | 输入验证、平台常量、文档改进 | +| `app/services/publish_service.py` | 类型提示、平台 enabled 标记 | +| `app/services/qr_login_service.py` | 类型提示、修复裸 except、超时常量 | +| `app/services/uploader/base_uploader.py` | 类型提示 | +| `app/services/uploader/bilibili_uploader.py` | bvid提取修复、类型提示 | +| `app/services/uploader/douyin_uploader.py` | 资源清理、超时保护、类型提示 | +| `app/services/uploader/xiaohongshu_uploader.py` | headless模式、资源清理、超时保护 | + +--- + +## ✅ 完成总结 + +1. **发布功能验证通过** - B站/抖音登录和发布均正常 +2. **代码健壮性提升** - 资源清理、超时保护、异常处理 +3. **代码可维护性** - 完整类型提示、常量化配置 +4. **服务器兼容性** - 小红书 headless 模式修复 + +--- + +## 🔗 相关文档 + +- [代码审核报告](file:///C:/Users/danny/.gemini/antigravity/brain/a28bb1a6-2929-4c55-b837-c989943844e1/walkthrough.md) +- [部署手册](file:///d:/CodingProjects/Antigravity/ViGent2/Docs/DEPLOY_MANUAL.md) diff --git a/Docs/implementation_plan.md b/Docs/implementation_plan.md index b0e2354..c8358ea 100644 --- a/Docs/implementation_plan.md +++ b/Docs/implementation_plan.md @@ -22,7 +22,7 @@ ┌─────────────────────────────────────────────────────────┐ │ 后端 (FastAPI) │ ├─────────────────────────────────────────────────────────┤ -│ Celery 任务队列 (Redis) │ +│ 异步任务队列 (asyncio) │ │ ├── 视频生成任务 │ │ ├── TTS 配音任务 │ │ └── 自动发布任务 │ @@ -30,7 +30,7 @@ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ - │ MuseTalk │ │ FFmpeg │ │Playwright│ + │LatentSync│ │ FFmpeg │ │Playwright│ │ 唇形同步 │ │ 视频合成 │ │ 自动发布 │ └──────────┘ └──────────┘ └──────────┘ ``` @@ -45,7 +45,7 @@ | **UI 组件库** | Tailwind + shadcn/ui | Ant Design | | **后端框架** | FastAPI | Flask | | **任务队列** | Celery + Redis | RQ / Dramatiq | -| **唇形同步** | MuseTalk | Wav2Lip / SadTalker | +| **唇形同步** | **LatentSync 1.6** | MuseTalk / Wav2Lip | | **TTS 配音** | EdgeTTS | CosyVoice | | **声音克隆** | GPT-SoVITS (可选) | - | | **视频处理** | FFmpeg | MoviePy | @@ -269,6 +269,32 @@ cp -r SuperIPAgent/social-auto-upload backend/social_upload - [x] **常驻模型服务** (Persistent Server, 0s 加载) - [x] **GPU 并发控制** (串行队列防崩溃) +### 阶段十一:社交媒体发布完善 (Day 7) ✅ + +> **目标**:实现全自动扫码登录和多平台发布 + +- [x] QR码自动登录 (Playwright headless + Stealth) +- [x] 多平台上传器架构 (B站/抖音/小红书) +- [x] Cookie 自动管理 +- [x] 定时发布功能 + +### 阶段十二:用户体验优化 (Day 8) ✅ + +> **目标**:提升文件管理和历史记录功能 + +- [x] 文件名保留 (时间戳前缀 + 原始名称) +- [x] 视频持久化 (历史视频列表 API) +- [x] 素材/视频删除功能 + +### 阶段十三:发布模块优化 (Day 9) ✅ + +> **目标**:代码质量优化 + 发布功能验证 + +- [x] B站/抖音登录+发布验证通过 +- [x] 资源清理保障 (try-finally) +- [x] 超时保护 (消除无限循环) +- [x] 完整类型提示 + --- ## 项目目录结构 (最终) diff --git a/Docs/task_complete.md b/Docs/task_complete.md index b385e02..13361a9 100644 --- a/Docs/task_complete.md +++ b/Docs/task_complete.md @@ -2,8 +2,8 @@ **项目**:ViGent2 数字人口播视频生成系统 **服务器**:Dell R730 (2× RTX 3090 24GB) -**更新时间**:2026-01-21 -**整体进度**:100%(Day 7 社交发布完成) +**更新时间**:2026-01-23 +**整体进度**:100%(Day 9 发布模块优化完成) ## 📖 快速导航 @@ -16,7 +16,7 @@ | [时间线](#-时间线) | 开发历程 | **相关文档**: -- [Day 日志](file:///d:/CodingProjects/Antigravity/ViGent2/Docs/DevLogs/) (Day1-Day7) +- [Day 日志](file:///d:/CodingProjects/Antigravity/ViGent2/Docs/DevLogs/) (Day1-Day9) - [部署指南](file:///d:/CodingProjects/Antigravity/ViGent2/Docs/DEPLOY_MANUAL.md) --- @@ -102,6 +102,23 @@ - [x] QR登录超时修复 (Stealth模式、多选择器fallback) - [x] 文档规则优化 (智能修改标准、工具使用规范) +### 阶段十二:用户体验优化 (Day 8) +- [x] 文件名保留 (时间戳前缀 + 原始名称) +- [x] 视频持久化 (从文件系统读取历史) +- [x] 历史视频列表组件 +- [x] 素材/视频删除功能 +- [x] 登出功能 (Logout API + 前端按钮) +- [x] 前端 SWR 轮询优化 +- [x] QR 登录状态检测修复 + +### 阶段十三:发布模块优化 (Day 9) +- [x] B站/抖音发布验证通过 +- [x] 资源清理保障 (try-finally) +- [x] 超时保护 (消除无限循环) +- [x] 小红书 headless 模式修复 +- [x] API 输入验证 +- [x] 完整类型提示 + --- ## 🛤️ 后续规划 @@ -109,10 +126,10 @@ ### 🔴 优先待办 - [x] 视频合成最终验证 (MP4生成) ✅ Day 4 完成 - [x] 端到端流程完整测试 ✅ Day 4 完成 -- [ ] 社交媒体发布测试 (B站/抖音已登录) +- [x] 社交媒体发布测试 ✅ Day 9 完成 (B站/抖音登录+发布) ### 🟠 功能完善 -- [ ] 定时发布功能 +- [x] 定时发布功能 ✅ Day 7 完成 - [ ] 批量视频生成 - [ ] 字幕样式编辑器 @@ -139,7 +156,7 @@ | TTS 配音 | 100% | ✅ 完成 | | 视频合成 | 100% | ✅ 完成 | | 唇形同步 | 100% | ✅ LatentSync 1.6 升级完成 | -| 社交发布 | 100% | ✅ 完成 (待验证) | +| 社交发布 | 100% | ✅ Day 9 验证通过 | | 服务器部署 | 100% | ✅ 完成 | --- @@ -224,5 +241,18 @@ Day 7: 社交媒体发布完善 ✅ 完成 - 多平台发布 (B站/抖音/小红书) - UI 一致性优化 - 文档规则体系优化 + +Day 8: 用户体验优化 ✅ 完成 + - 文件名保留 (时间戳前缀) + - 视频持久化 (历史视频API) + - 历史视频列表组件 + - 素材/视频删除功能 + +Day 9: 发布模块优化 ✅ 完成 + - B站/抖音登录+发布验证通过 + - 资源清理保障 (try-finally) + - 超时保护 (消除无限循环) + - 小红书 headless 模式修复 + - 完整类型提示 ```