一个开源、零后端、纯浏览器运行的 AI 视频编辑器。从 ASR 转录到 WebCodecs 导出,从 LLM 分镜规划到 GSAP 动画合成——把 9000 行 TypeScript 看透。
Pireel 不是万能剪辑工具,而是一个垂直品类加速器——专攻"单人口播短视频"场景。核心思路:编辑器是 Canvas,AI Agent 是画笔。
关键设计:studio-engine 不含任何浏览器依赖,同一套逻辑跑在三个地方——React 工作台 UI、服务端 MCP 离线执行、vitest 单元测试。
整个编辑器的状态就是一棵纯数据树——数据与渲染彻底分离。
Block 只存数据不存渲染结果。渲染时走 renderBlock(block) → 查模板注册表 → 实时生成 innerHTML + GSAP timeline。换主题 = 只改 CSS 变量,Block 不动。
重大家设计选择:视频轨 = 一个 <canvas> 元素。父页面用自己的 VideoDecoder 解码,通过 postMessage 逐帧推送画面到 iframe 内的 Canvas。这解决了经典"解码僵尸"问题——重建文档不会重建解码器。
音频 → 词级时间戳。输出带 {start, end, text} 的句子数组,后续逐词弹出字幕就靠这个。
| 分析 | 技术 | 产出 |
|---|---|---|
| 场景检测 | HSV 三通道均值差(PySceneDetect 算法) | 画面切点列表 → 决定视频裁切位置 |
| 人脸安全区 | MediaPipe MODNet 逐帧推理 | 最大空矩形 → 图形精确避开人脸 |
| 调色板 | 视频帧主色调提取 | {accent, paper, panel} → 图形颜色与画面协调 |
System prompt 核心指令:把台本句子合并成 Scene(每 Scene = 一个语义单元),给每 Scene 配取景方式 + 设计图形类型。
核心函数 layoutFromPlan(plan, {video, sentences, visual}) → Composition。遍历每个 Scene:
sentences[from].start → sentences[to].end)每个占位块 → 拼装 prompt(主题变量 + 调色板 + 安全区 + 设计指令)→ LLM 生成:
然后 apply_block 走自动 lint 校验(CSS 作用域 check / 无全局选择器 / 无 setTimeout/random / 颜色用 CSS 变量 / HTML+timeline 配对完整),通过后占位块变成真实内容。
所有内容拼成一个完整的独立 HTML:
这份 HTML 是预览 iframe 和导出渲染器的同一份源码——WYSIWYG 不靠 hack,靠同一份文档在不同模式下跑。
| CSS Animation | GSAP Timeline | |
|---|---|---|
| 精确 seek 到任意秒 | ❌ 只能 play/pause | ✅ tl.seek(5.3) |
| 多元素统一编排 | ❌ 各自独立 | ✅ 一条 timeline 管所有 |
| LLM 可生成 | ⚠️ 复杂 keyframe | ✅ 纯文本一行搞定 |
| 容错隔离 | ❌ 全局污染 | ✅ new Function 沙箱 |
MediaPipe MODNet(父页面)→ 生成蒙版 → postMessage 推送 iframe → Canvas destination-in 合成 → 背景替换层在蒙版下方 → marching squares 轮廓追迹做外描边。
Pireel 通过 streamable HTTP JSON-RPC 暴露全套编辑工具:
| 功能 | 状态 | 备注 |
|---|---|---|
| 拖入视频、编辑、时间轴、预览 | ✅ | 纯浏览器 |
| 20+ 设计主题、素材上传、草稿持久化 | ✅ | localStorage + OPFS |
| WebCodecs 导出 mp4 | ✅ | 需 Chromium |
| ASR 转录、LLM 分镜、AI 图形生成 | ❌ | 改 src/providers.ts 接 API |
| 人像抠图 | ⚠️ | 需 ONNX 模型文件 |
五个 Provider 接口(composer / planner / transcriber / vault / projects),每个就一两个方法,合同很薄。改 apps/studio-oss/src/providers.ts 就能接自己的后端。
| 适合 | 原因 |
|---|---|
| 抖音/小红书口播 | 9:16 竖屏 + 逐词弹幕 + 数据大字报 |
| 产品介绍/测评 | 人物讲参数 → 自动抽数字叠 metric 卡 |
| 知识科普 | 自动生成对比卡/流程图/要点列表 |
| 直播切片二创 | 30 分钟直播 → 剪 highlight 自动配图形 |
| 播客/音频可视化 | 一张封面 + 音频 → 章节标题卡+关键词弹出 |
终极总结:Pireel 是把"一个人对着镜头讲话"变成"设计感内容"的加速器。适合每天要出多条口播短视频的人——把重复的设计劳动自动化了。
| 层级 | 技术 | 用途 |
|---|---|---|
| 构建 | pnpm workspace + Vite 8 + TypeScript 5 | monorepo 管理 |
| 前端 | React 19 + Tailwind CSS 4 | 编辑器 UI |
| 动画 | GSAP (GreenSock) | 精准时间线 + LLM 可生成 |
| 视频解码 | WebCodecs (mediabunny) | 浏览器端解码/编码/导出 |
| AI 推理 | MediaPipe (MODNet) + ONNX Runtime Web | 人像抠图、人脸检测 |
| AI 生成 | Vercel AI SDK (ai + @ai-sdk/react) | LLM 调用(compose/plan) |
| 协议 | MCP (Model Context Protocol) | 外部 Agent 驱动接口 |
| 语法高亮 | Shiki | 代码块展示 |
| Markdown | Streamdown | 文档渲染 |
| 转场 | gl-transitions (WebGL) | 10 种像素级画面转场 |
| 状态管理 | fast-json-patch + jsondiffpatch | 增量同步 & 版本管理 |