feat(points): 积分系统收尾 + 充值弹窗改造 + 命名统一
后端: - 微信回调 db.commit 失败仍返回 SUCCESS,避免无限重试 - recharge() 加 order_id 幂等保护,防重复充值 - time_expire 使用北京时间(UTC+8),修复时区 bug - 充值档位后端配置化(points-config.yaml + /recharge-options API) - 代码审查 20 项修复(认证加固、扣费顺序、错误响应、状态同步等) 前端: - 充值弹窗:自动轮询 + 【我已支付】手动兜底 - 二维码倒计时显示,过期后遮罩 + 刷新按钮 - 充值档位从后端动态加载 - 去掉 select/qrcode 弹窗标题,金额红色突出显示 - 全项目命名统一(视频生成/压制成片/配音合成/声音复刻等) - Modal 关闭按钮独立于 title 显示
This commit is contained in:
@@ -67,7 +67,7 @@
|
||||
```sql
|
||||
INSERT INTO app_releases (version, release_date, notes, mandatory) VALUES
|
||||
('0.1.0', '2026-04-01 10:00:00', '初始版本发布', FALSE),
|
||||
('0.1.1', '2026-04-14 10:00:00', '新功能:视频字幕压制\n修复:导出问题', FALSE),
|
||||
('0.1.1', '2026-04-14 10:00:00', '新功能:视频字幕烧录\n修复:导出问题', FALSE),
|
||||
('0.2.0', '2026-04-20 10:00:00', '新增:批量导出功能\n优化:性能提升 30%', FALSE);
|
||||
```
|
||||
|
||||
@@ -1632,7 +1632,7 @@ if __name__ == "__main__":
|
||||
cd python-api
|
||||
python scripts/upload_release.py \
|
||||
--version 0.1.1 \
|
||||
--notes "新功能:视频字幕压制\n修复:导出问题" \
|
||||
--notes "新功能:视频字幕烧录\n修复:导出问题" \
|
||||
--path ../tauri-app/src-tauri/target/release/bundle
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,260 @@
|
||||
# 项目名词统一梳理报告
|
||||
|
||||
> 本文档梳理了美家卡智影项目中所有核心功能在用户界面和开发代码中的命名现状,识别出不一致问题,并提出统一标准方案。
|
||||
|
||||
---
|
||||
|
||||
## 一、核心功能总览(10个业务域)
|
||||
|
||||
| # | source_type | 用户界面名称 | 开发层关键命名 | 计费模式 |
|
||||
|---|-------------|-------------|---------------|---------|
|
||||
| 1 | `script` | 脚本生成 | `ScriptCreation.tsx`, `scriptApi` | 固定 5 |
|
||||
| 2 | `polish` | 文案润色 | `scriptApi.polish`, `polish_content` | 固定 1 |
|
||||
| 3 | `title` | 标题生成 | `scriptApi.generateTitle`, `generate_title` | 固定 1 |
|
||||
| 4 | `tts` | 音频合成 / 配音 | `VoiceDubbing.tsx`, `synthesizeTTS`, `voice.ts` | 按秒计费 |
|
||||
| 5 | `voice_clone` | 声音复刻 / 声音克隆 | `VoiceMaterialLibrary.tsx`, `voice.ts` 声音克隆 API | 固定 200 |
|
||||
| 6 | `video` | 视频生成 / 对口型 | `VideoGeneration.tsx`, `vidu.ts`, `lipSync` | 按秒计费 |
|
||||
| 7 | `caption` | 字幕生成 | `createTask('subtitle', ...)` | 免费 |
|
||||
| 8 | `subtitle_burn` | 字幕烧录 | `SubtitleBurning.tsx`, `subtitle_burn` | 固定 2 |
|
||||
| 9 | `cover_design` | 封面设计 / 封面制作 / 封面生成 | `CoverDesign.tsx`, `cover_design` | 固定 2 |
|
||||
| 10 | `compose` | 压制成片 / 视频合成 | `VideoComposite.tsx`, `videoComposite.ts`, `videoCompose.ts`, `video_processing.rs`, `video_compose.rs` | 固定 5 |
|
||||
|
||||
---
|
||||
|
||||
## 二、问题分类
|
||||
|
||||
### A类:后端分类映射错误(数据层污染)
|
||||
|
||||
文件:`python-api/app/services/point_service.py` 中的 `_CATEGORY_MAP`
|
||||
|
||||
| source_type | 当前映射 | 正确映射 | 影响 |
|
||||
|-------------|---------|---------|------|
|
||||
| `polish` | "脚本生成" ❌ | "文案润色" | 用户流水显示错误分类 |
|
||||
| `title` | "脚本生成" ❌ | "标题生成" | 用户流水显示错误分类 |
|
||||
| `voice_clone` | "音频合成" ❌ | "声音复刻" | 用户流水显示错误分类 |
|
||||
|
||||
> **严重程度:高**。这会导致积分明细中用户无法区分自己到底消费了什么服务。
|
||||
|
||||
---
|
||||
|
||||
### B类:同一功能多词混用(用户层混乱)
|
||||
|
||||
#### B1. TTS / 音频合成 / 配音
|
||||
|
||||
| 位置 | 用词 |
|
||||
|------|------|
|
||||
| 步骤标签(Step 2) | **音频合成** |
|
||||
| 页面文件名 | `VoiceDubbing.tsx` |
|
||||
| 页面注释 | "语音**配音**页面" |
|
||||
| 进度弹窗 | "生成**配音**"、"**配音**已就绪" |
|
||||
| 按钮文案 | "生成**配音**" |
|
||||
| 字段标签 | "**配音**文案" |
|
||||
| 错误提示 | "请返回第二步重新生成**配音**" |
|
||||
| TermsModal | "AI **配音**(TTS)" |
|
||||
| API 模块注释 | "TTS 合成" |
|
||||
| 积分明细(UsageDetail)筛选 | "**音频合成**" |
|
||||
|
||||
**问题**:步骤标签用"音频合成",但页面内全部用"配音"。用户从步骤导航点进来,看到的内容全是"配音",会产生"这是同一个功能吗?"的困惑。
|
||||
|
||||
#### B2. 封面设计 / 封面制作 / 封面生成
|
||||
|
||||
| 位置 | 用词 |
|
||||
|------|------|
|
||||
| 步骤标签(Step 5) | **封面制作** |
|
||||
| 页面文件名 | `CoverDesign.tsx` |
|
||||
| 页面注释 | "**封面制作**页面" |
|
||||
| 进度弹窗 | "**封面生成**"、"**封面生成**完成" |
|
||||
| 积分 description | "**封面设计**" |
|
||||
| 按钮文案 | "立即生成封面图" |
|
||||
| 预览区标题 | "**封面**预览" |
|
||||
|
||||
**问题**:"制作"、"设计"、"生成"三个词混用。
|
||||
|
||||
#### B3. 声音复刻 / 声音克隆
|
||||
|
||||
| 位置 | 用词 |
|
||||
|------|------|
|
||||
| 侧边栏 Sidebar | **声音克隆** |
|
||||
| 积分明细 UsageDetail | **声音复刻** |
|
||||
| API 模块注释(`voice.ts`) | "**声音克隆** API" |
|
||||
| 页面标题(`VoiceMaterialLibrary.tsx`) | "**声音克隆**" |
|
||||
|
||||
**问题**:同一功能两个不同的中文名称。
|
||||
|
||||
#### B4. 视频生成 / 对口型
|
||||
|
||||
| 位置 | 用词 |
|
||||
|------|------|
|
||||
| 步骤标签(Step 3) | **视频生成** |
|
||||
| 积分明细 | **视频生成** |
|
||||
| 技术实现注释/日志 | "**对口型**任务"、"**对口型**视频"、"**对口型**处理中..." |
|
||||
| 错误提示 | "**对口型**任务失败"、"**对口型**任务超时" |
|
||||
| 字段名 | `lipSyncTaskId`, `lipSyncVideoPath` |
|
||||
|
||||
**问题**:技术实现术语"对口型"泄露到用户可见文案中。
|
||||
|
||||
---
|
||||
|
||||
### C类:开发命名与业务命名不匹配
|
||||
|
||||
| 业务名称 | 开发命名现状 | 问题 |
|
||||
|---------|-------------|------|
|
||||
| 压制成片 | `compose` (source_type) / `composite` (API 模块名) / `videoComposite.ts` / `videoCompose.ts` / `video_processing.rs` / `video_compose.rs` / `VideoComposite.tsx` | **同一业务 5 种不同命名**,开发人员无法一眼看出这些代码对应同一个功能 |
|
||||
| 音频合成 | `tts` (source_type) / `VoiceDubbing.tsx` (页面) / `synthesizeTTS` (函数) / `voice.ts` (API 模块) | 页面文件名 `VoiceDubbing` 与步骤名"音频合成"语义不匹配 |
|
||||
| 文案润色 | `polish` (source_type/API) / `polish_content` (service) | 基本对应,但"polish"在代码中同时指"画面描述润色"和"配音文案润色" |
|
||||
|
||||
---
|
||||
|
||||
### D类:术语在注释/文案中的不统一
|
||||
|
||||
- `ScriptCreation.tsx` 中:`voiceover` 字段的注释混用"配音文案"、"画外音"
|
||||
- `VideoGeneration.tsx` 中:用户错误提示混用"返回第二步重新生成配音"和"回到第2步重新生成音频"
|
||||
- `voice.ts` 中:API 模块标题为"TTS 合成、批量合成、声音克隆",但对应的功能页面叫"音频合成"
|
||||
|
||||
---
|
||||
|
||||
## 三、统一标准方案
|
||||
|
||||
### 3.1 用户层统一名称(用户可见的所有文案)
|
||||
|
||||
| source_type | 统一名称 | 子类型/说明 |
|
||||
|-------------|---------|------------|
|
||||
| `script` | **脚本生成** | — |
|
||||
| `polish` | **文案润色** | 含画面描述润色、配音文案润色 |
|
||||
| `title` | **标题生成** | 封面主/副标题 |
|
||||
| `tts` | **配音合成** | 步骤标签、页面标题、按钮、进度统一用此 |
|
||||
| `voice_clone` | **声音复刻** | 统一用"复刻",不用"克隆" |
|
||||
| `video` | **视频生成** | 技术实现是对口型,但用户界面禁止出现"对口型" |
|
||||
| `caption` | **字幕生成** | 从视频提取字幕文本 |
|
||||
| `subtitle_burn` | **字幕烧录** | 将字幕文件烧录到视频画面中 |
|
||||
| `cover_design` | **封面设计** | 统一用"设计",不用"制作/生成" |
|
||||
| `compose` | **压制成片** | FFmpeg 拼接输出最终成品视频 |
|
||||
|
||||
**说明**:
|
||||
- **配音合成**:选择这个词是因为它比"音频合成"更贴近用户理解("我给视频配个音"),又比单独的"配音"更像一个功能名称。步骤标签从"音频合成"改为"配音合成"。
|
||||
- **声音复刻**:"复刻"比"克隆"更符合国内 AI 产品用语习惯(如剪映用"声音克隆",但通义/讯飞多用"声音复刻")。考虑到积分明细已用"复刻",统一到此。
|
||||
- **封面设计**:文件名已经是 `CoverDesign`,积分 description 也是"封面设计",步骤标签从"封面制作"改为此,形成统一。
|
||||
- **视频生成**:技术实现是 Vidu 对口型,但所有用户文案(含错误提示、进度提示)统一用"视频生成"。
|
||||
|
||||
### 3.2 开发层统一命名
|
||||
|
||||
#### source_type(数据库/API 层,已较规范,保持不变)
|
||||
|
||||
```
|
||||
script / polish / title / tts / voice_clone / video / caption / subtitle_burn / cover_design / compose
|
||||
```
|
||||
|
||||
#### 前端文件/模块命名
|
||||
|
||||
| 业务 | 当前文件名 | 建议文件名 | 理由 |
|
||||
|------|----------|----------|------|
|
||||
| 脚本生成 | `ScriptCreation.tsx` | ✅ 保持不变 | 语义清晰 |
|
||||
| 文案润色 | 无独立页面(在 ScriptCreation 内) | — | — |
|
||||
| 标题生成 | 无独立页面(在 CoverDesign/SubtitleBurning 内调用) | — | — |
|
||||
| 配音合成 | `VoiceDubbing.tsx` | `VoiceSynthesis.tsx` | `VoiceDubbing` 侧重"配音"动作,不够功能化;`Synthesis` 与 `synthesizeTTS` 对应 |
|
||||
| 声音复刻 | `VoiceMaterialLibrary.tsx` | ✅ 保持不变 | 页面本身是素材库,其中包含声音复刻功能,可以接受 |
|
||||
| 视频生成 | `VideoGeneration.tsx` | ✅ 保持不变 | 语义清晰 |
|
||||
| 字幕生成 | 无独立页面(在 VoiceDubbing 内调用) | — | — |
|
||||
| 字幕烧录 | `SubtitleBurning.tsx` | ✅ 保持不变 | 语义清晰 |
|
||||
| 封面设计 | `CoverDesign.tsx` | ✅ 保持不变 | 语义清晰 |
|
||||
| 压制成片 | `VideoComposite.tsx` | `VideoCompose.tsx` | 与 source_type `compose` 一致。注意当前已有 `videoCompose.ts`(上传模块),需先厘清两者边界 |
|
||||
|
||||
> ⚠️ **关于 `videoCompose.ts` vs `videoComposite.ts`**:
|
||||
> - `videoCompose.ts`:提供 `uploadVideoFile`(上传本地视频到后端→七牛云),文件注释写"压制成片 IPC 模块",实际做的是上传,命名混乱。
|
||||
> - `videoComposite.ts`:提供 `compositeApi.synthesis`(调用 Rust 压制成片),命名与业务对应。
|
||||
> **建议**:`videoCompose.ts` 改名为 `videoUpload.ts`(或合并到七牛上传模块),`VideoComposite.tsx` 改名为 `VideoCompose.tsx`。
|
||||
|
||||
#### 后端文件/模块命名
|
||||
|
||||
| 业务 | 当前命名 | 建议 | 理由 |
|
||||
|------|---------|------|------|
|
||||
| 压制成片 | `video_compose.rs` + `video_processing.rs` | ✅ 保持两个文件,但统一对外 command 名 | `video_processing.rs` 是业务逻辑层,`video_compose.rs` 是 command 层,分层合理。只需统一 Rust command 名和响应消息 |
|
||||
|
||||
---
|
||||
|
||||
## 四、具体修改清单
|
||||
|
||||
### 必改(数据层错误)
|
||||
|
||||
1. **`python-api/app/services/point_service.py`**
|
||||
- `_CATEGORY_MAP["polish"]` → "文案润色"
|
||||
- `_CATEGORY_MAP["title"]` → "标题生成"
|
||||
- `_CATEGORY_MAP["voice_clone"]` → "声音复刻"
|
||||
|
||||
2. **`python-api/app/api/v1/script.py`**(如果 description 硬编码了错误分类)
|
||||
- `description="【文案润色】"` ✅ 已正确
|
||||
- `title` 端点消费记录需要确认 description 格式
|
||||
|
||||
### 用户文案统一
|
||||
|
||||
3. **Step 标签(`tauri-app/src/pages/VideoCreation/index.tsx`)**
|
||||
- Step 2: "音频合成" → "配音合成"
|
||||
- Step 5: "封面制作" → "封面设计"
|
||||
|
||||
4. **配音合成页面(`tauri-app/src/pages/VideoCreation/VoiceDubbing.tsx`)**
|
||||
- 页面注释:"语音配音页面" → "配音合成页面"
|
||||
- 进度:`show('生成配音')` → `show('配音合成')`
|
||||
- 进度:`update('正在生成配音...')` → `update('正在合成配音...')`
|
||||
- 成功:`success('配音已就绪')` → `success('配音合成完成')`
|
||||
- 按钮:`生成配音` → `合成配音`
|
||||
- 右侧标题:`配音文案` → `配音文本`
|
||||
- 字段标签:`配音` → `配音文本`
|
||||
- 错误提示中所有"配音"保持不动("重新生成配音"是动作描述,不需要改)
|
||||
|
||||
5. **封面设计页面(`tauri-app/src/pages/VideoCreation/CoverDesign.tsx`)**
|
||||
- 进度:`show('封面生成')` → `show('封面设计')`
|
||||
- 成功:`success('封面生成完成')` → `success('封面设计完成')`
|
||||
- 错误:`封面生成失败` → `封面设计失败`
|
||||
- 按钮:`立即生成封面图` → `立即设计封面`
|
||||
- 积分 description:`封面设计` ✅ 已正确
|
||||
|
||||
6. **声音复刻(`tauri-app/src/components/Layout/Sidebar.tsx` + `tauri-app/src/pages/ContentManagement/VoiceMaterialLibrary.tsx` + `tauri-app/src/api/modules/voice.ts`)**
|
||||
- Sidebar: "声音克隆" → "声音复刻"
|
||||
- `voice.ts` 注释:"声音克隆" → "声音复刻"
|
||||
- `VoiceMaterialLibrary.tsx` 标题和文案
|
||||
|
||||
7. **视频生成页面(`tauri-app/src/pages/VideoCreation/VideoGeneration.tsx`)**
|
||||
- 所有用户可见的"对口型"改为"视频生成":
|
||||
- 进度:`show('视频生成')` ✅ 已正确
|
||||
- 进度:`update('正在提交对口型任务...')` → `update('正在提交视频生成任务...')`
|
||||
- 进度:`update('正在等待对口型处理...')` → `update('正在等待视频处理...')`
|
||||
- 进度:`update('对口型处理中...')` → `update('视频处理中...')`
|
||||
- 进度:`update('正在下载对口型视频...')` → `update('正在下载生成视频...')`
|
||||
- 错误:`对口型任务失败` → `视频生成失败`
|
||||
- 错误:`对口型任务超时` → `视频生成超时`
|
||||
- 日志/注释中的"对口型"可以保留(开发层)
|
||||
|
||||
8. **压制成片页面(`tauri-app/src/pages/VideoCreation/VideoComposite.tsx`)**
|
||||
- 镜头列表中的`配音`标签 → `配音文本`
|
||||
|
||||
9. **TermsModal(`tauri-app/src/components/Modal/TermsModal.tsx`)**
|
||||
- "AI 配音(TTS)" → "AI 配音合成(TTS)"
|
||||
- "声音复刻" ✅ 已正确
|
||||
|
||||
10. **积分明细(`tauri-app/src/pages/Profile/UsageDetail.tsx`)**
|
||||
- `voice_clone` 筛选标签:"声音复刻" ✅ 已正确
|
||||
- `tts` 筛选标签:"音频合成" → "配音合成"
|
||||
- `cover_design` 筛选标签:"封面设计" ✅ 已正确
|
||||
|
||||
11. **我的作品(`tauri-app/src/pages/ContentManagement/MyWorks.tsx`)**
|
||||
- 空状态文案 ✅ 已改为"压制成片"
|
||||
|
||||
### 开发层整理(建议项,不影响用户)
|
||||
|
||||
12. **`tauri-app/src/api/modules/videoCompose.ts`**
|
||||
- 文件注释写"压制成片 IPC 模块",实际做的是上传视频。建议改名或修正注释。
|
||||
|
||||
13. **`tauri-app/src/pages/VideoCreation/VideoComposite.tsx`**
|
||||
- 建议未来改名为 `VideoCompose.tsx`,与 source_type `compose` 一致。
|
||||
|
||||
---
|
||||
|
||||
## 五、确认清单
|
||||
|
||||
请确认以下决策:
|
||||
|
||||
1. **Step 2 标签**:"音频合成" → "配音合成"(还是保持"音频合成"?)
|
||||
2. **Step 5 标签**:"封面制作" → "封面设计"(是否接受?)
|
||||
3. **声音功能**:统一为"声音复刻"(放弃"声音克隆")?
|
||||
4. **视频生成**:所有用户文案中的"对口型"全部替换为"视频生成"?
|
||||
5. **文件改名**:`VoiceDubbing.tsx` → `VoiceSynthesis.tsx`、`VideoComposite.tsx` → `VideoCompose.tsx` 是否执行?
|
||||
@@ -34,7 +34,7 @@
|
||||
- 用户可无限免费使用 AI 服务,积分系统形同虚设
|
||||
|
||||
**2. 前端创作前无余额预检**
|
||||
- 脚本生成、视频合成等操作点击即触发,不检查余额
|
||||
- 脚本生成、压制成片等操作点击即触发,不检查余额
|
||||
- 后端返回 402 后前端没有统一拦截和充值引导
|
||||
|
||||
### P1 — 影响体验和数据准确性
|
||||
@@ -109,11 +109,11 @@ async def generate_tts(request, db, current_user):
|
||||
| 脚本生成 | `script` | `5` | `5` | 固定值,预估 = 实际 |
|
||||
| 润色 | `polish` | `1` | `1` | 固定值,预估 = 实际 |
|
||||
| 标题生成 | `title` | `1` | `1` | 固定值,预估 = 实际 |
|
||||
| 声音克隆 | `voice_clone` | `200` | `200` | 固定值,预估 = 实际 |
|
||||
| 声音复刻 | `voice_clone` | `200` | `200` | 固定值,预估 = 实际 |
|
||||
| TTS 配音 | `tts` | `ceil(seconds / 5)` | `ceil(字数 × 0.3 / 5)` | 按字数保守预估 |
|
||||
| 数字人视频 | `video` | `seconds * 5` | `输入素材秒数 * 5` 或 `300` | 无素材时用默认值 60 秒 |
|
||||
| 视频生成 | `video` | `seconds * 5` | `输入素材秒数 * 5` 或 `300` | 无素材时用默认值 60 秒 |
|
||||
| 字幕生成 | `caption` | `ceil(seconds / 5)` | `输入视频秒数` | 输入视频时长已知 |
|
||||
| 视频合成 | `compose` | `seconds * 5` | `分镜总秒数 * 5` | 分镜 duration 前端已知 |
|
||||
| 压制成片 | `compose` | `seconds * 5` | `分镜总秒数 * 5` | 分镜 duration 前端已知 |
|
||||
|
||||
**关键规则**:
|
||||
- 余额 >= 预估上限:放行执行业务,出结果后按实际扣费(可能欠费)
|
||||
@@ -226,7 +226,7 @@ if (error.code === 402) {
|
||||
## 五、需要确认的问题
|
||||
|
||||
1. **脚本生成固定 5 积分?** 不按场景数?
|
||||
2. **声音克隆 200 积分?**
|
||||
2. **声音复刻 200 积分?**
|
||||
3. **视频/配音秒数从哪取?** Rust 层合成完成后 FFmpeg 可以取时长,是否已有现成方法?
|
||||
4. **是否需要免费额度/体验积分?** 新用户注册是否赠送一定积分?
|
||||
5. **用户 model 是否有 role 字段?** 用于管理员充值权限检查。
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
| 新增平台接入成本 < 30 分钟 | 提供 Adapter 模板,复制粘贴后填充 4 个方法即可 |
|
||||
| 第三方故障不拖垮用户 | 单点故障时,用户 100ms 内收到明确错误,而非超时 30 秒 |
|
||||
| 多用户同时使用无冲突 | 5 个用户同时生成 TTS/脚本时,不触发第三方 429 限流 |
|
||||
| 任务状态可追踪 | 用户关闭应用后重开,能恢复进行中的对口型/字幕任务 |
|
||||
| 任务状态可追踪 | 用户关闭应用后重开,能恢复进行中的视频生成/字幕任务 |
|
||||
| 未来换平台无感知 | 换 TTS 供应商时,前端接口、存储层、用户历史记录全部无感知 |
|
||||
|
||||
---
|
||||
@@ -29,7 +29,7 @@
|
||||
│ - 回调入口:/webhooks/{platform} │
|
||||
├──────────────────────────────────────────────┤
|
||||
│ Application Service │
|
||||
│ - ScriptService:编排脚本→TTS→对口型 │
|
||||
│ - ScriptService:编排脚本→TTS→视频生成 │
|
||||
│ - VideoService:编排字幕→合成 │
|
||||
│ - 只操作领域对象,不感知平台差异 │
|
||||
├──────────────────────────────────────────────┤
|
||||
@@ -371,10 +371,10 @@ SSE 流式输出
|
||||
|
||||
**关键约束**:流式中途失败**不降级**。已输出内容保持不变,前端收到 error 事件后自行处理。
|
||||
|
||||
### 4.3 对口型任务提交(异步任务)
|
||||
### 4.3 视频生成任务提交(异步任务)
|
||||
|
||||
```
|
||||
用户点击"生成对口型"
|
||||
用户点击"生成视频"
|
||||
↓
|
||||
POST /vidu/lip-sync
|
||||
↓
|
||||
@@ -423,7 +423,7 @@ Redis 未命中或 state=processing → 穿透供应商查询 → 更新 Redis
|
||||
- 第 3 次:t=3s,blocking=0
|
||||
- 第 4 次起:t=7s, 12s, 17s...,blocking=1
|
||||
|
||||
### 4.5 回调处理(Vid 对口型完成)
|
||||
### 4.5 回调处理(Vidu 视频生成完成)
|
||||
|
||||
```
|
||||
Vidu 服务器 POST /webhooks/vidu
|
||||
@@ -453,13 +453,13 @@ Task Gateway.handle_webhook(...)
|
||||
│ 第一层:任务层(Slot Scheduler) │
|
||||
│ 控制"同时有多少个异步任务在执行" │
|
||||
│ - 火山字幕:max 5 │
|
||||
│ - 对口型:按 Vidu 配额配置 │
|
||||
│ - 视频生成:按 Vidu 配额配置 │
|
||||
│ - 脚本生成:max 10 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ 第二层:请求层(Gateway Token Bucket) │
|
||||
│ 控制"每秒向某平台发多少请求" │
|
||||
│ - Vidu TTS:20/s │
|
||||
│ - Vidu 对口型提交:5/s │
|
||||
│ - Vidu 视频生成提交:5/s │
|
||||
│ - 火山方舟:50/s │
|
||||
│ - 火山字幕提交:2/s │
|
||||
├─────────────────────────────────────────┤
|
||||
|
||||
@@ -101,7 +101,7 @@ class SyncCapable(Protocol):
|
||||
|
||||
@runtime_checkable
|
||||
class TaskCapable(Protocol):
|
||||
"""异步任务能力(对口型、字幕、视频生成等)"""
|
||||
"""异步任务能力(视频生成、字幕、TTS 等)"""
|
||||
async def submit(self, task_type: str, payload: dict, callback_url: str | None) -> AdapterResponse: ...
|
||||
async def query(self, platform_job_id: str) -> TaskStatus: ...
|
||||
|
||||
@@ -424,7 +424,7 @@ async def get_runtime_config():
|
||||
| 5.2 | Pydantic `JobResponse` Schema | `app/schemas/job.py` | 覆盖所有字段 |
|
||||
| 5.3 | `JobRegistry` 改为先写数据库、再写 Redis | `app/scheduler/registry.py` | 数据库有数据 |
|
||||
| 5.4 | `JobStatus` 扩展为 6 种状态 | `app/schemas/enums.py` | 覆盖所有场景 |
|
||||
| 5.5 | `ViduHandler` 接入 Async Engine | `app/scheduler/handlers/vidu_handler.py` | 对口型任务走 Engine |
|
||||
| 5.5 | `ViduHandler` 接入 Async Engine | `app/scheduler/handlers/vidu_handler.py` | 视频生成任务走 Engine |
|
||||
| 5.6 | `SubtitleHandler` 改为通过 Gateway 调用 | `app/scheduler/handlers/subtitle_handler.py` | 字幕任务走 Gateway |
|
||||
| 5.7 | 统一回调入口 `/webhooks/{platform}` | `app/api/v1/webhooks.py` | Vidu 回调正常 |
|
||||
| 5.8 | 删除 Router 中私设 Redis key 的代码 | `app/api/v1/vidu.py` | 无 `vidu:lipsync:` 字样 |
|
||||
@@ -433,7 +433,7 @@ async def get_runtime_config():
|
||||
| 5.11 | 删除 `/script/generate/stream` SSE 端点 | `app/api/v1/script.py` | 端点不存在 |
|
||||
|
||||
**验收标准**:
|
||||
- [ ] Vidu 对口型任务提交后,Redis 中只有 `job:{uuid}` 格式的 key
|
||||
- [ ] Vidu 视频生成任务提交后,Redis 中只有 `job:{uuid}` 格式的 key
|
||||
- [ ] 应用重启后,从数据库恢复 running 任务继续执行
|
||||
- [ ] 前端轮询 `/jobs/{id}` 获取所有异步任务状态
|
||||
|
||||
@@ -502,7 +502,7 @@ async def get_runtime_config():
|
||||
|
||||
| 风险 | 影响 | 概率 | 应对 |
|
||||
|-----|------|------|------|
|
||||
| `aiohttp` 迁移到 `httpx` 导致 Vidu 某些边缘场景行为不一致 | 功能回归 | 中 | 迁移后全量测试 Vidu TTS/对口型/克隆 |
|
||||
| `aiohttp` 迁移到 `httpx` 导致 Vidu 某些边缘场景行为不一致 | 功能回归 | 中 | 迁移后全量测试 Vidu TTS/视频生成/声音复刻 |
|
||||
| `PlatformError` 未覆盖所有异常路径,仍有裸 Exception 漏出 | 前端收到 500 无法处理 | 低 | `make lint-semantic` 强制检查 + Code Review |
|
||||
| 配置热重载导致运行时行为突变 | 线上限流突然变更 | 低 | Admin API 加操作日志,变更前确认 |
|
||||
| Phase 5 数据库改造影响现有 Async Engine | 字幕/脚本任务异常 | 中 | 数据库方案评审后再实施,分步迁移 |
|
||||
|
||||
@@ -188,7 +188,7 @@ curl -X POST https://api.vidu.cn/ent/v2/audio-clone \
|
||||
|
||||
---
|
||||
|
||||
## 六、对口型(Lip Sync)
|
||||
## 六、视频生成(Lip Sync)
|
||||
|
||||
### 端点
|
||||
|
||||
@@ -208,7 +208,7 @@ POST /ent/v2/lip-sync
|
||||
| speed | Float | 否 | 语速,默认 1.0,范围 [0.5, 2]。仅文字生成时生效 |
|
||||
| voice_id | String | 否 | 音色 ID。仅文字生成时生效 |
|
||||
| volume | Int | 否 | 音量,默认 0(正常音量),范围 [0, 10]。仅文字生成时生效 |
|
||||
| ref_photo_url | String | 否 | 人脸参考图 URL(jpg/jpeg/png/bmp/webp,192~4096px,≤10MB)。视频中有多张人脸时,用于指定对口型目标人物 |
|
||||
| ref_photo_url | String | 否 | 人脸参考图 URL(jpg/jpeg/png/bmp/webp,192~4096px,≤10MB)。视频中有多张人脸时,用于指定视频生成目标人物 |
|
||||
| callback_url | String | 否 | 回调地址,任务状态变化时 POST 回调 |
|
||||
|
||||
### 视频素材规范
|
||||
@@ -385,10 +385,10 @@ x-request-nonce:123e4567-e89b-12d3-a456-426614174000
|
||||
|
||||
## 八、接入建议
|
||||
|
||||
1. **Vidu 优势**:情绪控制、多音字标注、16 个音色(含精品版)、同步复刻、对口型
|
||||
1. **Vidu 优势**:情绪控制、多音字标注、16 个音色(含精品版)、同步复刻、视频生成
|
||||
2. **Vidu 劣势**:没有独立的"查询音色列表"API,音色通过飞书表格维护
|
||||
3. **接口类型差异**:
|
||||
- TTS / 声音复刻:**同步接口**,直接返回结果
|
||||
- 对口型:**异步接口**,需轮询 `GET /tasks/{id}/creations` 或使用 callback
|
||||
- 视频生成:**异步接口**,需轮询 `GET /tasks/{id}/creations` 或使用 callback
|
||||
4. **速度/音量/音调类型**:Vidu 的速度是 **Float**,音量和音调是 **Int**(和 MiniMax 不同,MiniMax 三者都要求 Int)
|
||||
5. **前端适配**:语速 slider 范围改为 0.5~2.0;音量改为 0~10;音调改为 -12~12
|
||||
|
||||
Reference in New Issue
Block a user