内容
# VertIR
**AI-first** 视频编辑器,专为 **垂直(9:16)** 内容设计。大型语言模型(LLM,Claude Code / OpenCode)**计划** — 发出并转换 **声明式时间线 IR**;**fail-closed 验证器** 检查;**确定性渲染器(FFmpeg)** 执行。人类在 **网页调整器**(浏览器,包括移动端)上完成最后的润色。
- 架构和决策:[`docs/informe-editores-ai-video-y-arquitectura.md`](docs/informe-editores-ai-video-y-arquitectura.md)
- 合同(IR):[`docs/timeline-ir-v1.md`](docs/timeline-ir-v1.md)
## 状态
**切片 1(核心),功能正常。** 流水线:`ingest → transcript → 切除填充/沉默 → 自动转换为 9:16 → 字幕高亮 → 验证 → 渲染代理 + MP4`。无外部依赖:**仅 Python 标准库 + FFmpeg**。
后续切片:b-roll + logo(2),介绍/结尾板块 + 音频 Ducking + Loudness(3),导出到 CapCut(4)。IR 已设计为所有切片服务 → 无需重新架构。
## 要求
- Python ≥ 3.11
- `ffmpeg` 和 `ffprobe` 在 PATH 中
## 快速使用
```bash
# 端到端演示(生成合成源和转录文本,并渲染一个短视频)
python -m vertir demo --out ./vertir-out
# 从您的素材开始:
python -m vertir build --hero hero.mp4 --transcript words.json --out ./out [--bgm music.m4a]
# 在浏览器中进行人为调整(也可从移动端在同一网络中访问):
python -m vertir web --ir ./out/timeline.ir.json --dir ./out
```
转录文本格式(`words.json`),时间单位为微秒:
```json
{ "assetId": "hero",
"words": [ {"sourceAtUs": 0, "sourceEndUs": 500000, "text": "你好"} ] }
```
## 作为 MCP 服务器用于 Claude Code
`.mcp.json`:
```json
{ "mcpServers": { "vertir": { "command": "python3", "args": ["-m", "vertir", "mcp"] } } }
```
公开的工具:`ingest`, `build_short`, `validate`, `render`, `demo`.
## 测试
```bash
python -m unittest discover -s tests -v
```
## 结构
```
vertir/
ir.py # 合同(构建器 + IO) validate.py # fail-closed 验证器
probe.py # ingest(ffprobe)+ sha256 render.py # FFmpeg + ASS 字幕高亮
transcript.py # 转录文本 + 加载器(whisper.cpp) pipeline.py # 核心组装
edit.py # 切片,cut-map(源 → 程序) cli.py / mcp_server.py / web/
```
## 路线图
- [x] **切片 1 — 核心**:填充切除 + 转换为 9:16 + 字幕高亮 + 验证器 + 渲染 + MCP + 网页调整器
- [x] **切片 2** — b-roll(源锚定切片)+ logo/水印(节目锚定叠加)
- [x] **切片 3** — 介绍/结尾板块(钩子卡)+ 音频 Ducking + 平台 Loudness 配置文件
- [ ] **切片 4** — 导出到 CapCut 草稿(次要功能,桌面端)
## 贡献
欢迎 Issues 和 PR。**IR 是合同** (`docs/timeline-ir-v1.md`):模式更改需版本控制,绝不破坏现有文档。提交 PR 前请运行测试:`python -m unittest discover -s tests`.
## 许可证
[MIT](LICENSE) 2026 FullFran