内容
# UberEditor
跨平台桌面视频编辑器(Tauri 2 + Rust + React),专为内容创作者打造,拥有 AI 超能力:**基于文本的编辑**(逐字 Whisper),**一键消除静音**,**自动生成竖屏**,**情感反应头像**,**卡拉 OK 字幕**,**从文本生成配音**,以及一个 **嵌入式 MCP 服务器**,允许代理(如 Claude)为您编辑项目。

- 全部可撤销:每个操作(包括 AI 和 MCP 操作)都是一条撤销记录
- 预览和导出使用相同的渲染引擎(共享的 ffmpeg 链):您看到的就是您得到的
---
## 要求
| 项目 | 版本 | 备注 |
|---|---|---|
| **FFmpeg + FFprobe** | ≥ 6 on the `PATH` | 渲染的核心。`brew install ffmpeg` / `apt install ffmpeg`。`UE_FFMPEG` / `UE_FFPROBE` 指向特定二进制文件 |
| **Rust** (稳定版) + **Node** ≥ 20 | — | 仅用于构建 |
```bash
npm install
npx tauri dev # 完整的桌面应用程序
```
无需安装其他软件:Whisper 模型会在首次转录时自动下载,基于 Python 的额外功能(神经降噪,Kokoro 配音)在首次使用时会自行配置虚拟环境。
---
## 时间线编辑
- **移动**:拖动剪辑;**磁铁** 会将其吸附到其他剪辑的边缘、播放头、0、I-O 范围和标记。(`Alt` 禁用它)。
- **修剪**:拖动剪辑的 **边缘** (选中时可见的句柄)。
- **多选**:在空白区域拖动 **矩形** (框选);`⇧` 添加到选择。
- **链接剪辑 🔗**:添加带有音频的视频会创建两个剪辑(视频在 `V*` ,音频在 `A*` ),它们的行为就像一个:拆分、移动、修剪、改变速度或删除会影响两者。`Inspector → Link → Unlink` 将它们分开。
- **轨道**:`+V` / `+A` 添加轨道;在标题栏:`M` 静音,`S` 独奏,🔒 锁定,**双击名称** 重命名,✕ 删除(可撤销),而在音频轨道上,**dB 被垂直拖动** (双击 → 0 dB)。
- **真正的多层**:最低的视频轨道是基础;较高轨道上的剪辑会与其位置、缩放和不透明度一起导出。
- **速度**:0.25×–4×。**语音的音调被保留**,无论是在实时(WSOLA)还是导出(atempo)时。
- **缩放**:`⌘`+滚轮 在光标处缩放,或 `Fit`。
## 键盘快捷键
| 键 | 操作 |
|---|---|
| `Space` | 播放 / 暂停 |
| `J` / `K` / `L` | 快进:后退 / 暂停 / 前进(重复翻倍:1→2→4→8×) |
| `S` (或 `⌘K`)| 在播放头下分割剪辑(链接剪辑一起分割) |
| `Del` / `Backspace` | 删除选择 · 按 `⇧` 删除 **并关闭间隙** (波纹) |
| `←` / `→` | 一个帧后退/前进 · 按 `⇧` 十个帧 |
| `Home` | 跳转到 0 |
| `I` / `O` | 标记 **工作范围** 的开始/结束(尺子上的琥珀色带) |
| `P` | 将当前 I-O 范围保存为 **导出片段** |
| `⇧X` | 清除 I-O 范围 |
| `⌘Z` / `⌘⇧Z` | 撤销 / 重做 |
| `⌘S` / `⌘O` | 保存 / 打开项目 |
在 **文本** 选项卡中,键操作于转录本:`Backspace` 剪切标记的单词,`⌘X` / `⌘V` 移动它们,`Esc` 清除。每个滑块的数字读数都是可编辑的:输入精确值,`↑`/`↓` 微调(`⇧` ×10)。
## 变换和关键帧
每个剪辑都有 **位置 X/Y,不透明度,缩放,旋转** 和 **水平/垂直翻转** (以及音频,**增益**)。在每个滑块旁边,`◇` 在播放头处创建一个关键帧(`◆` = 已经有一个;点击删除它)。一旦属性被动画化,**移动滑块会在播放头处写入一个关键帧**,就像 Premiere/Resolve 一样。
**曲线编辑器** 出现在下面:拖动菱形(时间和值),**双击** 添加或删除键,选择一个键会选择其插值(**线性 / 保持 / 平滑**)。菱形也会在时间线上的剪辑中绘制。
动画在 **暂停、播放和导出时看起来相同** (所有三个路径上的曲线数学相同)。
## 效果和生成器
`Inspector → 效果 → + 添加效果`。五个内置效果:**色键**,**色彩校正**,**高斯模糊**,**投影** (在画中画/叠加层上非常有用,以使其与背景分离) 和 **垂直:模糊背景**。所有参数都可关键帧。
**⏦ 形状** 在时间线中添加一个生成的剪辑:一个 **实心矩形** 或 **渐变**。它们是普通的剪辑,因此可以应用完整的变换 — 使面板滑动的关键帧, 在标题后面放置一个半透明的面板。
效果和生成器是 **数据,而不是代码**:一个 `manifest.json` (参数 + ffmpeg 模板),预览和导出都会运行,因此它们不会分离。你可以添加自己的效果而无需重建。
📖 [`docs/PACKS.md`](docs/PACKS.md)
## 文本、标题和模板
- **+ 标题** 在播放头处添加文本(在空轨道上)。
- `Inspector → 文本`:内容,**系统字体** (所有已安装的字体),大小,颜色,对齐方式,位置和行高。大小和位置相对于 1080p,因此在导出时缩放。
- **模板**:保存一个命名样式并将其应用于其他标题。
- 文本由我们自己的字形引擎(`ue-text`)栅格化,因此 **表情符号和 CJK 正确渲染** — ffmpeg 的 `drawtext` 没有字体回退,而 libass 没有颜色字体支持。
## 过渡
`Inspector → Transition in` / `Transition out` — **每个剪辑都有两者**,每个都有类型和持续时间(0.1–2 秒)。
**11 种类型**:交叉淡入,擦除 ←/→,滑动 ←/→/↑,圆形打开,圆形关闭,溶解,像素化,径向。在两个相邻的剪辑之间,它们作为真正的 A/B 交叉过渡运行;如果不可能,则降级为从黑色开始的入口,而不是静默消失。它们也可以在不同速度的剪辑之间工作。

---
## AI
### 转录(Whisper)
**🎙 转录** 在媒体项目上,或在 `Inspector → AI` → 逐字转录(模型自行下载)。`T✓` = 已转录;再次点击 **重新转录** (字幕剪辑继续工作)。模型和语言在检查器中处于未选中状态(`AI · Whisper`):tiny/base/small/medium/large-v3-turbo · auto/es/en/pt/fr/de。
### 基于文本的编辑
**文本** 选项卡:完整的转录本,播放时突出显示当前单词。
- **点击** 一个单词来标记它并跳转到它; **`Backspace`** 剪切标记的单词 — 删除视频中的这些部分 **在所有轨道上** 并关闭间隙(1 次撤销)。
- **`⌘X`** ,将播放头放置到位, **`⌘V`** — 将一段连续的单词块移动到其他地方(重新排序语音短语而不触摸刀片)。
- **双击** 一个单词来纠正 Whisper 听错的内容,或使用 **查找 → 替换** 栏一次性替换所有出现的内容。音频时序保持不变;仅更改字幕。
### 静音
`Inspector → 静音` (带有音频的剪辑),带有 **阈值(dB)** , **最小持续时间** 和 **边缘** 围绕语音的滑块:
- **🔇 删除** — 剪切静音并关闭间隙(所有轨道,1 次撤销)。
- **⏩ 加速 4 倍** — 而不是删除,它会加速静音部分。
- **✂ 分割** — 仅在静音边界处剪切,以便您决定删除什么。
### 自动字幕
**💬 自动字幕** 在转录的剪辑上。检查器中的 **字幕** 有三种模式:
- **按短语** — 每行一个片段。
- **逐字** — 一次一个大单词(短视频风格)。
- **卡拉 OK** — 整个短语可见,**每个单词在被朗读时亮起** (可配置的高亮颜色)。
每行字数自动或手动设置为 1-12;字体,大小,颜色,高度和行间距由您选择。
### 从文本生成配音(TTS)
检查器中的 `AI · 配音` (未选中任何内容):编写脚本,选择引擎和声音,然后 **🎙 生成配音**。音频在后台合成,作为普通资产进入媒体池,可以在播放头处自行放置。

两个内置引擎 — **macOS 系统声音** (`say`:即时,离线,所有已安装的声音)和 **Kokoro-82M** (自包含:应用程序在首次使用时自行配置虚拟环境)。添加另一个引擎 **无需代码**:将 JSON 清单放入 `tts_engines/` 文件夹中。 📖 [`docs/TTS.md`](docs/TTS.md)
### 反应式头像
**🧑🎤 头像** → 添加表情(每种情绪的图像或视频),选择驱动它的声音,设置分类器模型/API 密钥,然后 **生成视频**。

它将每个短语分类为一种表情(离线能量/节奏分类器,或任何 OpenAI 兼容模型,如果您设置了密钥/`OPENAI_API_KEY`),并渲染一个 **透明** 的头像视频,该视频会随着音量摇晃。结果 **作为普通剪辑进入媒体池** — 放置它,缩放它,为其添加关键字或像其他视频一样动画:

头像设置保存在项目中,可以导入/导出(与 Youtubers-toolkit `config.json` 兼容)。
### 自动竖屏(短视频/视频)
**📱 竖屏** 生成一个 1080×1920 的序列副本,带有模糊的背景和居中的视频。序列选择器(在时间线按钮旁边)会切换回横屏模式。每个序列都单独导出。
---
## 音频
- **增益** (可关键帧),**声像** (平衡律),每个剪辑的淡入/淡出;每个 **轨道** 的音量;**RMS L/R 表计** 在播放时。
- 音频是 **主时钟**:位置来自为设备提供的帧(无漂移)。
- **背景噪音去除** 每个剪辑(`音频 → 减少背景噪音`):Facebook 的 DNS64 神经降噪器,在后台渲染 — 播放和导出切换到相同的干净音频时就绪。自包含:应用程序在首次使用时提供自己的 Python 虚拟环境。
📖 [`docs/DENOISE.md`](docs/DENOISE.md)
## 导出
- **预设**:YouTube 1080p,YouTube 4K,最大质量,快速草稿,**仅音频(M4A)** 和 **GIF**。
- 可调整:最大分辨率,CRF 质量,编解码器速度,音频比特率,可选 **R128 归一化** (-14 LUFS,YouTube 风格)。
- **范围**:整个时间线, **I-O 范围** 或 **片段** — 用 `I`/`O` 标记范围并按 `P` 标记每个块,它们 **连接成一个文件**,按顺序。
- 按钮上的实时进度和 **取消** 会清理未完成的半成品文件。
## 项目
- **`.uep`** 格式(可读的 JSON),**可移植**:媒体路径存储为相对于项目 — 将整个文件夹移动到另一个磁盘/机器并打开。无法找到的媒体保持 **离线** (红色)并带有 **重新链接...** 按钮。
- **自动保存**:每分钟(如果有更改)写入 `.uep.autosave` 副本;如果应用程序崩溃,则在启动时提供 **恢复**。真正的保存使其失效。
- 缓存(确认的音频,代理,波形,缩略图)存放在项目外部,按内容哈希索引:它们在另一台机器上自行再生。
---
## MCP 服务器(基于代理的编辑)
启动时,应用程序在 `http://127.0.0.1:4599/mcp` (仅本地回环)启动一个 MCP 服务器,**受令牌保护** (在启动时生成;可在标头中的“MCP”丸中找到,其中包含现成的连接命令):
```bash
claude mcp add --transport http ubereditor http://127.0.0.1:4599/mcp \
--header "Authorization: Bearer <token>"
```
**53 种工具 — UI 可以做的,代理也可以做**:导入、重新链接和转录媒体、剪切、修剪、移动和拆分剪辑、动画变换与关键帧、应用效果和过渡、添加标题、形状和字幕、管理轨道和序列、删除静音、纠正转录错误、生成配音和反应式头像、渲染。所有工具都通过测试强制执行一致性:如果 UI 功能没有工具,则会故意使测试套件失败。
代理做的每个编辑都是 **一次** 在 UI 中撤销,并且会因可能破坏项目的调用而失败而不会更改任何内容。它还可以 **看到** 编辑器正在显示的内容(`debug_render_frame` , `playback`),因此它可以验证帧或重现视觉错误而不是猜测。
📖 **[完整参考:`docs/MCP.md`](docs/MCP.md)** — 规则、典型会话、每个工具、后台作业以及如何添加一个。
---
## 开发
```bash
cargo test # 182 个测试:单元测试 + 真实的 ffmpeg 导出像素测试
cargo clippy --workspace --all-targets
npm run dev # 浏览器中的 UI,带有 MOCK 引擎(http://localhost:5175)
npm run typecheck
npm run screenshot # 15 个视觉步骤,带有功能性断言 → screenshots/<date>/
npx tauri dev # 真实的应用程序
```
九个 crates(纯模型、媒体、音频、渲染、文本、导出、AI、Whisper、Tauri shell),一个由预览和导出共享的合成器,处处都是微秒。
📖 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)