内容
# dawn-cut
### 一款开源视频编辑器,您的素材永远不会离开您的电脑。
像编辑文档一样编辑视频 - **自动字幕、基于文本的剪辑和自动去除静音,100%本地化。** 无需云存储,无需账户,无需水印,无需订阅。
<p>
<img alt="100% 本地化" src="https://img.shields.io/badge/100%25-local-2ea44f">
<img alt="无水印" src="https://img.shields.io/badge/no-watermark-2ea44f">
<img alt="无订阅" src="https://img.shields.io/badge/no-subscription-2ea44f">
<img alt="无需账户" src="https://img.shields.io/badge/no-account-2ea44f">
<img alt="许可证:MIT" src="https://img.shields.io/badge/license-MIT-blue">
</p>
**中文** · [한국어](README.ko.md)
> **状态:v0.1.** 确定性编辑核心是真实的、经过测试的、并且可以使用 - 基于文本的剪辑、去除静音、韩语自动字幕、**一键自适应自动增强**、**低置信度字幕审查和纠正**、色彩分级、9:16/1:1 重新构图、图像/贴纸/GIF 叠加层、一键式风格包、TTS 和 SRT/章节导出,所有这些都是 100% 本地化的。自然语言 AI 编辑和无头 **MCP** 代理服务器也本地工作,但标记为 **实验性** - 它们需要一次性本地模型下载,并且仍在成熟中。 我们诚实地标记一切:[今天有效的内容](#今天有效的内容) · [实验性(可选)](#实验性(可选)) · [路线图](#路线图)。
---
## 演示
<!-- TODO(release): add a license-clean hero GIF (original clip → captioned, graded cut) at
assets/hero.gif, then restore the image line below. Kept commented so the README doesn't
render a broken image before release. -->
<!--  -->
_(演示 GIF 随第一个版本发布而来 - 请参见 `docs/PRODUCTION.md`)_
> _占位符._ 一个可复制的端到端运行(真正的 `whisper.cpp` + FFmpeg)已经存在于 [`demo-output/`](demo-output/README.md) 下:一个 23.6 秒的英语叙述剪辑被转录、文本编辑、去除静音至 17.3 秒,并导出带有混合 **软(可切换)字幕轨道** + SRT + 可重复使用的 `.dawn` 项目。(UI 还可以 *烧录* 字幕;韩语由单元 + 集成测试覆盖。)使用
> `pnpm demo:assets && pnpm demo:run && pnpm demo:ui` 重新生成。
---
## 为什么选择 dawn-cut
每款流行的“AI 视频编辑器”都要求您在二者之间做出选择:**隐私** 或 **AI 辅助**。云工具会带走您的素材;本地工具无法思考。 dawn-cut 的设计使您不必做出选择。
| | dawn-cut | CapCut | Vrew | Descript | OpenCut |
|---|---|---|---|---|---|
| 100% 本地运行 | **是** | 否(云) | 否(云 STT) | 否(云) | 是(浏览器) |
| 无需账户 / 无水印 / 无订阅 | **是** | 否 | 免费层有限 | 积分/限制 | 是 |
| 单词级 STT + 基于文本的编辑 | **是** | 否 | 部分 | 是 | 否 |
| 自动字幕(包括韩语) | **是(本地)** | 云 | 云 | 云 | 否 |
| 确定性、可验证的编辑核心(EDL + 不变量) | **是** | 否 | 否 | 否 | 否 |
| 开源 | **是(MIT)** | 否 | 否 | 否 | 是(MIT) |
- **vs CapCut** - 您的视频永远不会离开您的笔记本电脑。 无需遥测,无需声称拥有您的面部和声音的许可的条款,无需导出水印。
- **vs Vrew** - 可比较的韩语自动字幕(whisper `large-v3-turbo`),但本地、无限制且免费。 dawn-cut 从 whisper token 中无损地重新组装韩语 *eojeol*(单词 + 粒子)- 请参见 [`whisper.ts`](packages/core/src/whisper.ts)。
- **vs Descript** - 相同的“删除一个句子,删除素材”的基于文本的编辑 - 但无需云、无需积分、无需上传。
- **vs OpenCut** - OpenCut 拥有通用、手动编辑的浏览器时间线。 dawn-cut 填补了它留下的空白:**单词级 STT、基于文本的编辑和确定性编辑核心,机器可以驱动** - 代理编辑的基础。
---
## 今天有效的内容
诚实列表 - 以下每个项目都在 [`packages/core`](packages/core) 中实现,并涵盖了单元/属性测试,或通过 Electron UI 连接。
- **单词级转录** - `whisper.cpp`(MIT,本地)生成每个单词的时间戳;韩语 *eojeol* 无损重建(验证字符准确性,无 mojibake)。
- **基于文本的编辑** - 删除一个单词范围,相应的素材被剪辑并无缝隙地 rippled(`deleteWordRange`、`cutSourceRange`)。
- **自动去除静音** - 检测静音间隔并修剪它们,具有可配置的填充(`removeSilences`)。
- **填充词检测** - 保守的韩语填充词典,仅精确匹配(`detectFillers`)。
- **字幕准确性审查和纠正** - 浮现低置信度(可能听错)的 *eojeol*,从 whisper token 概率中,突出显示在转录中,跳转到它们,并内联修复一个单词 - 纠正流入提示/ SRT / 烧录并且记录在审计日志(`correctWord` 动词)。
- **一键自适应自动增强** - 分析实际素材(FFmpeg `signalstats`:亮度/对比度/饱和度)并应用计算出的色彩分级 - 使暗淡的剪辑更亮,使 dull 的剪辑更鲜活 - 而不曾过度纠正(`analyzeVideo` → 纯 `autoEnhanceParams` → `applyAutoEnhance`; 长度不变,确切的数字记录在 EDL 中)。
- **自动字幕** - 将实时单词分组为程序定时提示,根据句子结尾/剪辑/单词上限断开,每个单词 **显示/卡拉 OK** 动画,导出 **SRT** (`transcriptToCues`、`captionFrames`、`formatSrt`)。
- **自动章节** - 基于规则的 YouTube `M:SS title` 章节列表来自转录(`extractChapters`、`formatChapters`)。
- **词典替换** - 转录中确定性的术语替换(`applyGlossary`)。
- **色彩分级** - 6 种预设(暖/冷/冲/电影/平面/鲜活)具有强度加权,通过命令总线应用并使用 FFmpeg `eq`/`curves`渲染(`applyColorgrade`、`COLOR_PRESETS`)。
- **9:16 / 1:1 重新构图** - 将横向素材变成垂直短视频/方形视频,具有叠加层感知的中心裁剪(`cropForAspect`、`renderEdl({ reframe })`)。
- **图像/贴纸/GIF 叠加层** - 位置、缩放、透明度、z 顺序、旋转、混合模式和多关键帧运动路径,**合成到导出的视频** 中,通过 FFmpeg 叠加层过滤器(`OverlayClip`、[`overlay.ts`](packages/core/src/overlay.ts)、[`draw.ts`](packages/core/src/draw.ts)、`renderEdl`)。
- **一键式风格包** - 6 种类型预设(viral-punch、mukbang-sizzle、beauty-glow、golden-hour、city-night、talk-clean)表示为计划(`EditCommand[]` 包),因此 GUI、LLM 计划器和 MCP 都共享它们(`STYLE_PACKS`、`templates.ts`)。
- **TTS 配音** - 合成旁白(macOS `say`)并将其混合到导出中。
- **确定性 EDL 导出** - 时间线编译为导出决策列表,由 FFmpeg 边车渲染(`timelineToEdl`)。
- **转录 ↔ 时间线同步** - 单词和节目时间之间的可证明的双向映射(`wordToProgram`、`programToWord`)。
- **项目保存/打开** - 版本化 `.dawn` JSON;完整的撤销/重做([`history.ts`](packages/core/src/history.ts))。
- **Electron 桌面应用** - 导入媒体,转录,通过文本编辑,擦除,实时预览字幕并导出。
### 建立在数据契约之上,而不是凭感觉
编辑核心是护城河。它是 **纯 TypeScript** - 它可能不导入 `electron`、`fs`、`child_process` 或 `path`(由 `dependency-cruiser` 强制执行)。每个模型都受验证的不变量约束:
- **时间是整数微秒(µs)**;间隔是半开的 `[start, end)`。
- `validateSync` 证明转录 ↔ 时间线往返(SYNC-INV)。
- `validateEdl` 证明导出列表是连续的和总时长精确的(EDL-INV)。
- `validateCues` 证明字幕是顺序的、非重叠的和在边界内的(SUB-INV)。
- 命令是 **纯函数** 返回 `{ before, after, removedProgramUs }`,因此每个编辑都是可撤销和可重放的。
这些属性 - 确定性、验证、撤销、无头执行 - 正是 AI 编辑代理所需的非功能性需求。
---
## 实验性(可选)
这些 **今天在本地和端到端运行**,但标记为实验性,因为它们依赖于一次性模型下载和/或已知差距。它们是真实的,不是模拟的 - 只是成熟中。 有意启用它们;核心永远不依赖于它们。
- **自然语言编辑(本地 LLM 计划器)** - 输入 *“剪掉填充词并使其具有电影效果”*,本地 `llama.cpp` 计划器(默认 **Qwen2.5-1.5B**,Apache-2.0)发出 **验证的 `EditCommand` 计划**,您可以在应用前预览(干预差异)。语法约束解码保持输出符合模式;如果没有安装模型,则回落到确定性规则计划器。设置:`pnpm setup:llm`。 _注意事项:_ 需要模型下载;计划质量受 1.5B 模型的限制;CI 验证规则路径(LLM 路径手动执行)。
- **MCP 代理服务器** - 无头 [Model Context Protocol](https://modelcontextprotocol.io) 服务器(`@dawn-cut/mcp`)允许外部代理(Claude Desktop / Cursor)驱动 **相同的** 命令总线超过 `.dawn` 项目:`open_project → command_manifest → plan → dry_run → apply → save_project → render`(包括 9:16/1:1 重新构图)。每个编辑都经过相同的变量 + 哈希链审计日志,就像 GUI 一样。 _注意事项:_ `render` 尚未烧录字幕/叠加层(仅剪辑 + 颜色 + 缩放 + 重新构图);通过工作区运行无头(`npx` 安装的可执行文件尚未发布)。请参见 [`docs/P4-MCP.md`](docs/P4-MCP.md)。
---
## 愿景
> **说出您想要的;AI 提出编辑;您审查时间线/EDL;然后渲染。** 不是一个黑盒。
最终目标是一个编辑器,您输入 *“剪掉死空气并在关键点上添加字幕”*,一个 LLM 发出一个 **验证的、可序列化的 `EditCommand` 列表**,确定性核心应用并渲染 - 带有您预先批准的干预差异。因为核心已经公开了可审查的中间表示(时间线 + EDL)并验证每个步骤,所以代理的编辑是可复制和自动检查的,而不是不透明的。
其中大部分 **现已构建**。 命令总线(Zod 派生的 `EditCommand` + 变量验证 + 哈希链审计日志),一键式风格包(模板表示为 **计划**),以及 9:16/1:1 重新构图都已在核心中发布;本地 `llama.cpp` 计划器(自然语言 → 计划 → 干预 → 批准)和无头 **MCP 服务器** 带有 `render` 工具(外部 AI 通过 `.dawn` 项目驱动)作为 [实验性](#实验性(可选)) 发布。 仍开放:实时应用 ↔ MCP 桥接,MCP 字幕烧录,过渡/节拍同步和多轨。 请参见下面的路线图和 [`docs/PRODUCTION.md`](docs/PRODUCTION.md)。
---
## 路线图
- **阶段 1 - 命令总线.** 将分散在 UI 存储中的编辑操作提升到一个单一的可序列化 `EditCommand` 联盟,具有一个 `applyCommand` 调度器,每个动词都由一个 Zod 模式支持(→ TS 类型 + 运行时守卫 + JSON-Schema 清单)。 后置门控运行变量验证器在每个命令后。
- **阶段 2 - 干预/差异/提交 + 审计日志.** 在克隆状态上预览编辑,显示差异(删除的 µs,改变的提示,长度 delta),通过追加的哈希链日志提交。 为 punch-in zoom 和色彩分级添加真正的渲染管道(效果感知 EDL)。
- **阶段 3 - 本地 LLM 计划器(区分器)。** 一个 `llama.cpp` 边车(重用 `whisper.cpp` IPC 模式)具有语法约束解码,生成一个验证的 `EditCommand` 计划来自自然语言,干预 + 批准 + 提交 - 100% 本地,无云。
- **阶段 4 - MCP 服务器 + OTIO + 多轨.** 将命令注册表公开为 MCP 服务器,供外部代理(Claude Desktop / Cursor),推广到多轨/多源(B-roll,PIP,音乐),并添加 OTIO 导出以支持 Premiere/Resolve/FCP 互操作。
---
## 快速开始
需要 **Node ≥ 20**,**pnpm 10**,以及(用于转录)**cmake** + **FFmpeg**。
```bash
pnpm install # 安装工作区依赖
pnpm verify # 校验 + 核心边界检查 + 构建 + 单元测试 + 端到端测试
# (依赖 whisper 的步骤自跳过;集成运行时存在fixture)
pnpm setup:binaries # 构建 whisper.cpp + 下载模型(需要 cmake + ffmpeg)
# 默认模型:large-v3-turbo(~1.6GB);
# 更轻的设置:DAWN_WHISPER_MODEL=base pnpm setup:binaries
pnpm make:fixture # 生成确定性测试视频(使用 macOS `say`)
```
其他有用的脚本:`pnpm test:unit`,`pnpm test:int`,`pnpm test:e2e`,
`pnpm demo:assets && pnpm demo:run && pnpm demo:ui`(完整的真实媒体演示)。
---
## 架构
三个层级,具有严格的核心可移植边界:
```
UI / shell ──► 编辑核心 ──► AI / 渲染边车
(Electron, React) (纯 TS) (Node 子进程包装器)
```
- **`packages/core`** - 可移植的纯 TypeScript 编辑核心:转录 / 时间线 / 同步 / 命令 / EDL / 字幕 / 叠加层 / 章节。 无 Node,无 Electron(强制)。 这是未来代理将驱动的内容。
- **`packages/ui`** - React UI + Zustand 存储(`@dawn-cut/ui`)。
- **`apps/desktop`** - Electron 外壳(`@dawn-cut/desktop`)。
- **`sidecar/stt`** - `whisper.cpp` 子进程包装器,单词级时间戳(MIT)。
- **`sidecar/ffmpeg`** - FFmpeg / ffprobe 子进程包装器(LGPL,仅子进程)。
- **`sidecar/tts`** - 文本转语音(macOS `say` 默认离线;Piper 可选)。
**EDL** 是分离 *编辑* 和 *导出* 的确定性 IR:核心生成它,FFmpeg 边车消耗它,因此相同的编辑始终渲染相同的输出。 完整设计:[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) 和 PoC 文档在 [`docs/poc/`](docs/poc/README.md) 下。
### 校验驱动
每个里程碑门控都由自动化测试支持。 `pnpm verify` 退出 `0` 是“完成”的必要条件。 请参见 [`docs/poc/03-TEST-GATES.md`](docs/poc/03-TEST-GATES.md)。
---
## 许可证
**MIT** - 请参见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。 核心保持免费和本地,永久。