本文档汇总了 Tik-tok 项目内已落地的全部 AI 视频生成模式。整个系统借鉴 Pixelle-Video 的多流水线架构,前后端均通过插件式 Pipeline 注册中心实现解耦:每新增一种模式 ≈ 1 个 Angular 独立组件 + 1 行注册元数据,无需改动主应用。
┌─────────────────────────────────────────────────────────┐
│ 生成模式中心(Hub) │
│ /src/app/pipelines/pipeline-registry.ts │
└────────────────────┬────────────────────────────────────┘
↓ *ngFor 动态渲染
┌─────────────────────────────────────────────────────────┐
│ 侧栏 / Hub 卡片网格 │
└────────────────────┬────────────────────────────────────┘
↓ setCurrentTab(route)
┌─────────────────────────────────────────────────────────┐
│ 6 个独立 Standalone Angular 组件(按 currentTab 切换) │
│ │
│ ┌──────────┬──────────┬──────────┬──────────┐ │
│ │ 数字人 │ 标准重塑 │ 图生视频 │ 动作迁移 │ ... │
│ └──────────┴──────────┴──────────┴──────────┘ │
└────────────────────┬────────────────────────────────────┘
↓ 共享服务层
┌─────────────────────────────────────────────────────────┐
│ JimengService / LlmService / ResultsService / │
│ composeVideoStream (SSE) / Volc TTS │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ server.js (Express + ffmpeg + Qiniu) │
│ /api/remix/upload-asset (Qiniu 七牛上传) │
│ /api/video/composite (ffmpeg 同步合成) │
│ /api/video/composite/stream (ffmpeg SSE 流式合成) │
└─────────────────────────────────────────────────────────┘
关键文件:
| 文件 | 作用 |
|---|---|
src/app/pipelines/pipeline-registry.ts |
Pipeline 元数据注册中心,决定侧栏与 Hub 卡片 |
src/app/pipelines/composite-sse.ts |
fetch + SSE 客户端 helper |
src/app/services/jimeng.service.ts |
即梦 API 封装(视频/图像/数字人/动作迁移) |
src/app/services/llm.service.ts |
LLM 对话封装 |
src/app/services/results.service.ts |
结果库/历史持久化(带 pipelineId) |
src/app/pages/pipelines/<id>/*.component.ts |
每种模式的独立 Angular 组件 |
digital_human) — stable上传形象图/参考视频 + 脚本,生成数字人口播视频。
getOhIdentifyMain → getOmniHumanapp.html 主组件中(后续可抽出为独立组件)video_generation) — beta上传原视频,AI 转录 + 改写 + 重新配音 + 配图后重新合成。
vg-* 流程,与新版生成模式并存app.html 主组件image_to_video) — beta单张图(首帧)/ 双张图(首尾帧)/ 单图 + 运镜模板 → 动态视频。
getVideoV3_720p / getVideoV3_1080p / getVideoV3_Promethod='2'):720P / 1080P / Promethod='3'):仅 720P / 1080Pmethod='4'):仅 720P,11 种官方模板:JimengService.generateImageToVideo(params)image_url + 整数 aspect_ratio 1-6(与 720P/1080P 入参不同),已通过 generateVideoPro 适配src/app/pages/pipelines/image-to-video/action_transfer) — beta角色图 + 参考视频 → 让角色按视频中的动作 / 表情 / 口型动起来。
getActorV2(动作模仿 2.0,支持多人 / 非真人驱动)pollUntilComplete(workId, 'getActorV2') → 取 videos[0]assetUpload 上限从 50MB 提升至 200MB 以支持视频src/app/pages/pipelines/action-transfer/asset_remix) — beta多张图片 + 主题 → AI 生成口播文案 → 火山 TTS 配音 → ffmpeg 拼接成片。
/api/remix/upload-asset)LlmService.chat() 输出 JSON 文案数组concatMap)调火山 TTS /tts/unidirectional 生成每段 audioUrlcomposeVideoStream(SSE)→ ffmpeg 实时拼接src/app/pages/pipelines/asset-remix/topic_to_video) — beta一句话主题 → 全自动 4 阶段生成视频。
{scene_prompt, narration} JSONsrc/app/pages/pipelines/topic-to-video/// 统一图生视频入口,自动按 (method, quality) 路由 + 校验不兼容组合
generateImageToVideo(params: {
imageUrls: string[];
prompt: string;
method: '2' | '3' | '4';
quality: '720p' | '1080p' | 'pro';
frames?: number;
cameraTemplate?: JimengCameraTemplateId;
cameraStrength?: 'weak' | 'medium' | 'strong';
aspectRatio?: JimengAspectRatio;
}, onProgress?): Observable<{ videoUrl, workId }>
// 动作迁移
actionTransfer(imageUrl, videoUrl, { cutFirstSecond }, onProgress?): Observable<{ videoUrl, workId }>
POST /api/video/composite/stream
Content-Type: application/json
Body: { segments: [{ id, imageUrl, audioUrl }], title }
↓
事件流:
event: stage data: { stage, message }
event: progress data: { stage, current, total, percent, message }
event: done data: { videoUrl, filename, size, segments }
event: error data: { error }
前端使用:
import { composeVideoStream } from '@/app/pipelines/composite-sse';
const handle = composeVideoStream({ segments, title, onProgress, onStage });
const result = await handle.promise;
// 可随时 handle.abort()
ResultsService (src/app/services/results.service.ts) 为所有新模式提供统一的结果库 / 历史持久化:
this.results.saveResult({ type: 'video', url, title, pipelineId: 'image_to_video', ... });
this.results.saveHistory({ keyword, status: 'completed', resultUrl, pipelineId, ... });
GeneratedResult 与 HistoryRecord 接口已添加 pipelineId 字段,后续可在结果库 tab 按模式筛选。
src/app/pages/pipelines/<id>/ 新建 standalone Angular 组件注册元数据:在 pipeline-registry.ts 的 PIPELINES 数组追加一项
{
id: 'new_mode',
displayName: '新模式',
description: '...',
inputHint: '...',
iconSvg: '<...>',
route: 'new-mode',
status: 'beta',
showInSidebar: true,
}
扩展类型:pipeline-registry.ts 的 PipelineRoute 联合类型加新 route
注入主组件:app.ts import + 加入 imports 数组
接入路由:app.html 加 <app-new-mode *ngIf="currentTab === 'new-mode'">
类型联合:app.ts 的 currentTab 联合 + setCurrentTab/restoreCurrentTab 签名同步
持久化(可选):注入 ResultsService,在成功回调中 saveResult + saveHistory 带 pipelineId
# 后端(含 ffmpeg / Qiniu / SSE)
node server.js
# 前端
npm run start
打开 http://localhost:4200,侧栏点击 生成模式 进入 Hub 选择模式。
| 依赖 | 用途 |
|---|---|
| ffmpeg | 必须在系统 PATH(视频合成、音频提取) |
| 七牛云 | 公网素材存储(即梦 / 动作迁移要求公网 URL) |
| 即梦 token | 视频 / 图像 / 数字人 / 动作迁移付费 API |
| 火山 TTS token | TTS 配音 |
| LLM | DeepSeek/GPT/Claude,通过 /api/llm/chat 统一代理 |
node server.js 启动无报错ffmpeg -version 可调用ng build --configuration production 无错误| 限制 | 说明 |
|---|---|
| Pro 不支持首尾帧/运镜 | UI 已自动禁用,切换模式时回退到 720P/1080P |
| 运镜仅 720P | UI 已自动锁定 |
| TTS 串行 | 火山 API QPS 限制,串行更稳定 |
| 数字人 / 标准 AI 重塑仍嵌主组件 | 后续可抽出为独立组件以彻底解耦 |
| 结果库 UI 无模式筛选 | pipelineId 已落库,UI 筛选器可后续添加 |
本系统的多 Pipeline 架构设计借鉴 Pixelle-Video 的双层抽象(BasePipeline + PipelineUI)与生成模式分类。