chore: 初始化仓库,提交 vibevideo 源码

- src/: HyperFrames 封装 CLI(hv)、组件、品牌样式、音频(TTS/混音)工具
- projects/: 各项目 project.yaml 与文案
- interactive/: 井字棋演示页
- .gitignore: 忽略 node_modules、构建产物与 HyperFrames 运行期缓存
This commit is contained in:
2026-10-12 18:06:20 +08:00
commit 9b63424740
42 changed files with 8004 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
title: 三维钩子建模全过程
aspect: 横屏
fps: 30
lang: zh-CN
scenes:
- component: cad3d
duration: 16
props:
spin: "true"
accent: "#d97757"
+72
View File
@@ -0,0 +1,72 @@
title: 一个钩子的诞生
aspect: 横屏
fps: 60
lang: zh-CN
# 演示项目:把全部组件串成一条完整时间线
# 改任何一处都只影响对应场景,用 `hv 看帧 demo全组件` 快速验证
scenes:
# ---------- 开场 ----------
- component: intro
duration: 3.5
props:
kicker: 建模演示
title: 一个钩子的诞生
subtitle: 草图 · 拉伸 · 切除 · 圆角
# ---------- 第一部分:写代码 ----------
- component: codedemo
duration: 8
props:
filename: hook.py
language: python
dimOthers: "true"
highlight: "3,4"
code: |
def make_hook(thickness=0.4):
"""生成一个钩子的截面轮廓"""
profile = bezier_profile()
solid = extrude(profile, depth=0.6)
throat = subtract(solid, sphere(r=0.92))
return fillet(throat, r=0.11)
- component: terminal
duration: 6
props:
title: python
prompt: ">>> "
script: |
[
{ "text": "from cad import make_hook", "kind": "cmd" },
{ "text": "hook = make_hook(thickness=0.4)", "kind": "cmd" },
{ "text": "四个布尔操作全部成功", "kind": "ok" },
{ "text": "耗时 0.42s", "kind": "dim" }
]
- component: lowerthird
duration: 3
props:
text: 关键:轮廓必须一次性闭合
sub: 自交的草图会让拉伸直接失败
# ---------- 第二部分:三维建模 ----------
- component: cad3d
duration: 16
props:
spin: "true"
accent: "#d97757"
# ---------- 收尾 ----------
- component: textblock
duration: 4
props:
heading: 四个操作,[[一气呵成]]
body: 草图定形状,拉伸给厚度,切除挖钩槽,圆角去毛刺。
- component: outro
duration: 4
props:
cta: 觉得有用就点个关注
handle: "@你的频道"
foot: 每周三更新一期
+56
View File
@@ -0,0 +1,56 @@
title: 三个 Cursor 实用技巧
aspect: 横屏
fps: 60
lang: zh-CN
scenes:
- component: intro
duration: 3.5
props:
kicker: 技巧合集
title: 三个 Cursor 实用技巧
subtitle: 让你写代码少一半时间
- component: codedemo
duration: 8
props:
filename: fib.py
language: python
dimOthers: "true"
highlight: "3,4,5"
code: |
def fib(n):
"""斐波那契数列"""
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
for i in range(10):
print(f"fib({i}) = {fib(i)}")
- component: terminal
duration: 6
props:
title: zsh
prompt: "$ "
script: |
[
{ "text": "python fib.py", "kind": "cmd" },
{ "text": "fib(0) = 0", "kind": "out" },
{ "text": "fib(1) = 1", "kind": "out" },
{ "text": "fib(8) = 21", "kind": "ok" },
{ "text": "9 行代码,递归一次跑通。", "kind": "dim" }
]
- component: lowerthird
duration: 3
props:
text: 技巧一:先描述意图,再让它动手
sub: 上下文质量决定了产出质量
- component: outro
duration: 4
props:
cta: 觉得有用就点个关注
handle: "@你的频道"
foot: 每周三更新一期
+8
View File
@@ -0,0 +1,8 @@
title: 自由度压测
aspect: 横屏
fps: 30
lang: zh-CN
scenes:
- component: stress
duration: 6
+43
View File
@@ -0,0 +1,43 @@
# 选题简报 · 井字棋科普
> 这份文件是策划面。填完之后再动手改 `project.yaml`。
## 一句话
(这条视频要让观众记住的一句话。写不出来说明选题还没想清楚。)
## 给谁看
- 受众:
- 他们现在知道什么:
- 他们看完应该能做什么:
## 钩子
(前 3 秒说什么。用反常识、具体数字、或者直接抛结果。别铺垫。)
## 结构
| 段 | 时长 | 讲什么 | 用哪个组件 |
|---|---|---|---|
| 开场 | 3.5s | | intro |
| 主体 | | | codedemo / terminal / cad3d |
| 收尾 | 4s | | outro |
## 素材清单
- [ ] 录屏:
- [ ] 截图:
- [ ] 代码片段:
- [ ] 背景音乐:
## 完成标准
- [ ] `hv 检查 井字棋科普` 通过
- [ ] `hv 看帧 井字棋科普` 抽查几个关键时间点,没有排版问题
- [ ] 全片时长与预期一致
- [ ] 音画对齐(若有配音)
## 已知取舍
(哪里打算偷懒、哪里有风险,写下来免得忘了)
+92
View File
@@ -0,0 +1,92 @@
title: 井字棋怎么玩
aspect: 横屏
fps: 30
lang: zh-CN
scenes:
# 1. 片头
- component: intro
duration: 3.5
narration: 五步就能看出谁会玩。井字棋怎么玩,今天一次讲清楚。
props:
kicker: 游戏科普
title: 井字棋怎么玩
subtitle: 5 手就分出胜负
# 2. 规则
- component: tictactoe
duration: 5.5
narration: 棋盘是三乘三的九个格子。两人轮流落子,先把三个棋子连成一条线的人获胜。
props:
moves: "0"
eyebrow: 规则
caption: 棋盘三乘三,双方轮流落子,三子连线即胜
tip: 三条规则
# 3. X 走中心
- component: tictactoe
duration: 5.5
narration: X 先手。第一手走中心最稳,因为中心这一格和四条线都相连。
props:
moves: "5"
eyebrow: 第 1 手
caption: X 走中心——这一格和四条线都相连
tip: 占中心
# 4. O 应对
- component: tictactoe
duration: 5.5
narration: O 落在第二格。棋盘上一共只有八条线,从这一步起,每一步都要盯着它们。
props:
moves: "5,2"
eyebrow: 第 2 手
caption: O 应在第二格,八条线一条都不能放松
# 5. X 形成威胁
- component: tictactoe
duration: 6.5
narration: X 走第九格。现在第一格、第五格、第九格三缺一,X 再补上第一格就赢了。
props:
moves: "5,2,9"
eyebrow: 第 3 手
caption: 斜线三缺一,X 只差第一格
tip: 形成威胁
point: 1
# 6. O 漏防
- component: tictactoe
duration: 6.5
narration: 可是 O 走了第四格,把第一格空在那儿。对成线的威胁视而不见,是新手最常见的失误。
props:
moves: "5,2,9,4"
eyebrow: 第 4 手
caption: O 走了第四格——它漏掉了第一格
tip: 漏防了
point: 1
# 7. X 获胜
- component: tictactoe
duration: 5
narration: X 补上第一格,三个棋子连成一条斜线,棋局结束。
props:
moves: "5,2,9,4,1"
eyebrow: 第 5 手
caption: X 连成斜线,取胜
tip: 三子连线
# 8. 总结
- component: textblock
duration: 7
narration: 记住三句:先占中心,始终盯着有没有成线的机会,看到威胁立刻去挡。
props:
heading: 记住三句
body: 先占中心 · 盯住成线 · 见威胁就挡
# 9. 片尾
- component: outro
duration: 4
narration: 下一局,轮到你先手。
props:
cta: 下次轮到你先手
handle: "@你的频道"
foot: ""
+21
View File
@@ -0,0 +1,21 @@
# 台词稿
> 一行一个场景,顺序与 `project.yaml` 的 `scenes` 一致。
> 填完后跑 `python3 src/audio/cli.py 配音 <项目名>`,
> 场景时长会自动对齐到每句的朗读时长。
## 场景 1 · intro
- 画面:
- 台词:
## 场景 2 · codedemo
- 画面:
- 台词:
- 重点行号:
## 场景 3
- 画面:
- 台词:
+28
View File
@@ -0,0 +1,28 @@
title: 配音对齐演示
aspect: 横屏
fps: 30
lang: zh-CN
scenes:
- component: intro
duration: 2.812
narration: 一个钩子是怎么被造出来的。
sfx: whoosh@0.1
audio: projects/配音演示/assets/audio/tts_一个钩子是怎么被造出来的_2462.wav
- component: textblock
duration: 4.952
narration: 第一步画草图,用一条闭合的贝塞尔曲线把轮廓定下来。
audio: projects/配音演示/assets/audio/tts_第一步画草图-用一条闭合_4602.wav
- component: codedemo
duration: 5.724
narration: 第二步拉伸,把这条轮廓沿着 Z 轴扫成一个实体,厚度零点六。
sfx: pop@1.2
audio: projects/配音演示/assets/audio/tts_第二步拉伸-把这条轮廓沿_5374.wav
- component: cad3d
duration: 8.421
narration: 第三步切除,用一个球做布尔差集,把钩子内侧的承载面挖出来。最后一步圆角,把生硬的棱磨圆。
audio: projects/配音演示/assets/audio/tts_第三步切除-用一个球做布_8071.wav
- component: outro
duration: 2.225
narration: 四个操作,一气呵成。
sfx: whoosh@0.2
audio: projects/配音演示/assets/audio/tts_四个操作-一气呵成_1875.wav