高级视频技能 v3.3(锚点网格 + 音效) 是做什么的?
==================================================
一个高级代理编排技能,将语音脚本转换为高质量 HyperFrames 短视频,包含:
- 锚点网格(kicker → hero → body → chip → presenter,底部固定)
- 动态排版(逐字错开动画)
- SVG 动画(带移动元素的技术图解)
- 磨砂玻璃证据卡片 + 下方三分之一 + 结束画面
- 运动模糊擦除过渡
- 完整音效系统(SFX 合成、cue 表、音频混音)
- 设计合同验证(prepare.py 门控)
- 可复现流水线(scenes.sh → prepare.py → build_index.py)
流水线(顺序不可协商)
语音脚本
│
▼
generate.py → new_scene.py → prepare.py → build_index.py
(解析) (场景文件) (验证) (根 HTML + 擦除)
│ │
▼ ▼
npx hyperframes lint → npx hyperframes render
(0 错误门控) (MP4 输出)
│
▼
python3 scripts/gen_sfx.py # 合成 SFX(一次性)
python3 scripts/mix_audio.py # VO + cue + 背景音乐 → master.wav
ffmpeg 混流 → final.mp4
逐步操作
# 1. 从语音脚本生成场景合成 + 根 HTML
python3 generate.py --script my_script.txt --topic Tor --output index.html
# 2. 验证门控(对比度、字体、安全区、字段节奏)
python3 scripts/prepare.py
# 3. Lint(必须为 0 错误)
npx hyperframes lint
# 4. 预览和渲染
npx hyperframes preview
npx hyperframes render
# 5. 音频流水线
python3 scripts/gen_sfx.py # 从头合成 14 种 SFX
python3 scripts/mix_audio.py # VO + cue + 背景音乐 → master.wav
ffmpeg -i rendered.mp4 -i renders/master.wav \
-c:v copy -c:a aac -shortest final.mp4
锚点网格(底部固定,不变)
每个场景使用相同的下半部分——只有上半部分重新组合:
| 锚点 | 元素 | 位置 | 动画 |
|---|---|---|---|
| 1 | Kicker | 左上 | 从 y:-26 向上滑入,0.32s 淡入 |
| 2 | Hero | 顶部带状区域(1–3 个单词) | 从 1.3 缩放到 1,偏移 44px→0,缓慢上漂 |
| 3 | Body | 卡片 / 里程表 / 多行 | 从 56px 向上滑动到 0,缩放 .95→1 |
| 4 | Chip | 底部区域(3–6 个单词) | 从 30px 向上滑动到 0,0.26s 淡入 |
| 5 | Presenter | 右下,按帧裁剪 | 从 .92 缩放到 1,y:46→0,0.34s 淡入 |
帧 0 是海报——场景 1(data-cover="1")打开时完全组合好。
六色场循环
相邻场景的背景色场不重复:
accent → ground → ink → secondary → tertiary → quaternary
若连续两个场景共享同一色场,prepare.py 将拒绝构建。
所有文字/背景组合满足 WCAG ≥ 4.5:1 对比度。
音效系统
SFX 合成(无需下载,无需授权)
python3 scripts/gen_sfx.py 创建 14 种音效:
| SFX | 用途 |
|---|---|
pop.wav | 每个场景切换 |
click.wav / key.wav | UI 元素、列表勾选 |
chime.wav | 揭示 / 得分 |
ping.wav | 通知 |
notify.wav | 行动号召 |
riser.wav | 切换前的大转折 |
impact.wav | 强烈视觉冲击 |
whoosh.wav | 快速移动 |
error.wav | 错误 / 拒绝 |
Cue 表 — assets/sfx/cues.json
基于段落相对偏移(可适应 VO 重录):
{ "at": "scenes", "file": "pop.wav", "gain": 0.5 }
{ "at": "vo2-0.30", "file": "riser.wav", "gain": 0.3 }
{ "at": "vo9+0.55", "file": "notify.wav", "gain": 0.4 }
音频混音 — scripts/mix_audio.py
- VO + SFX cue + 背景音乐 →
renders/master.wav - 使用
ebur128测量响度,校正至 −14 LUFS - 真峰值 ≤ −1 dBTP
- 使用
alimiter且level=false(避免自动电平陷阱) - 背景音乐音量为 0.15 → −29 LUFS(约比 −16 LUFS 的 VO 低 13 LU)
- 无旁链压缩——电平差本身就是压缩效果
技术话题(自动动画 + 证据)
当脚本包含识别到的关键词时,编排器自动插入:
| 组件 | 处理方式 |
|---|---|
| SVG 图解 | 带移动元素和 animateMotion 的节点链路流 |
| 证据叠加 | 带来源徽章的磨砂玻璃卡片 |
| 过渡 | 动画前的运动模糊擦除 |
| 音频提示 | 动画开始时 "whoosh" SFX |
已识别关键词: tor、onion、vpn、proxy、isp、relay、network、packet、 encryption、cybersecurity、dns、cdn、blockchain、ai、machine learning 等。
输入脚本格式
纯文本(自动计时 ~145 词/分钟)
Same resume everywhere? That's why you're rejected.
Tailor it per company.
Read the **job description**.
One resume does not fit every company. Customize and get shortlisted.
带时间戳的段落
[0-4s] 到处投同一份简历?这就是你被拒的原因。
[4-10s] 针对每家公司量身定制。
[10-14s] 阅读 **职位描述**。
强调: **word** → 右对齐、品牌色、权重 950、弹出动画。
文件
| 文件 | 用途 |
|---|---|
generate.py | CLI 入口 |
orchestrator.py | 流水线:解析 → 检测 → 分解 → 生成场景 → 构建根 |
design_system.py | 设计令牌、对齐规则、验证 |
PARAMS.json | 您唯一需要编辑的设计文件 |
scripts/prepare.py | 验证门控 + 令牌注入 |
scripts/new_scene.py | 锚点网格场景合成生成器 |
scripts/build_index.py | 含连续计时和自适应擦除的根 HTML |
scripts/gen_sfx.py | 从头合成 SFX |
scripts/mix_audio.py | VO + cue + 背景音乐 → master.wav |
assets/sfx/cues.json | 基于章节相对偏移的 cue 表 |
scenes.sh | 可复现场景列表模板 |
compositions/_scene-base.html.tmpl | 锚点网格骨架 |
compositions/wipe.html | 运动模糊过渡 |
skill.md · skill.json | 文档 + 模式 |
系统要求
- Python 3(标准库)
- HyperFrames CLI:
npx hyperframes init / preview / render / lint - Node.js ≥ 22, FFmpeg
- ffprobe(用于音频测量)
许可
MIT — 自由在此基础上构建、分享、销售视频。