在用户自己的视频上添加动态图形
在已安装的 HyperFrames 技能之上作为工作区层使用。对于 HTML/时间线机制,加载
hyperframes-core(合成契约)和 hyperframes-animation(GSAP 规则);最近的
上游路径是 talking-head-recut。此技能添加了创建者的内部规则,冲突时以其为准。
快速路径(在 reel-sep30 上验证,3:20 乌尔都语/英语 Reel,Paper Cut 风格)
powershell -NoProfile -ExecutionPolicy Bypass -File tools/new-project.ps1 -Name <n> -Video raw/<file> -Transcribe→ 数秒内获得 Deepgram 转录。- 导出
transcript-words.txt(index:text@start)→ 阅读、总结、选取时刻。 - 字幕:
captions-src.json(根据单词索引的罗马化 Hinglish 片段)→node tools/build-captions.mjs projects/<n>。 - 样式模板:复制
kit/templates/paper-cut-vertical.html→index.html;设置两个data-duration;将 EXAMPLE 调用替换为此视频的时刻。 lint→snapshot --at ...(2 批,每批约 12 帧)→ 查看联系表 → 修复。- 音效:根据
mg-sound中的偏移表编写sfx.json→node tools/sfx.mjs projects/<n>(在渲染之前,以便一次渲染包含它们)。 - 预先告知用户渲染时间(参见
mg-export:在 4 核笔记本电脑上,每 1 分钟 1080x1920 视频约需 25–30 分钟),然后渲染一次,复制到exports/。 - 后期调整:仅音频 →
sfx.mjs --mix(秒级别,无需重新渲染)。视觉调整 → 先快照,然后重新渲染一次。
不要:安装本地语音模型、恢复停滞的下载、为“检查”任何内容而渲染(请使用快照)、或在 VS Code 的播放器中预览(无 AAC 音频——请使用 VLC)。
1. 设置项目
- 如果视频不在
raw/中,可以保留在原处。从文件名中选取一个简短的 kebab-case 项目名称。 - 运行(从工作区根目录):
powershell -NoProfile -ExecutionPolicy Bypass -File tools/new-project.ps1 -Name "<name>" -Video "<path>" -Transcribe- 转录使用 Deepgram(
nova-3,默认language=multi:处理乌尔都语/印地语 + 英语代码切换;印地语/乌尔都语词汇可能以天城文返回——请罗马化为 Hinglish,保留时间戳)。需要用户环境变量DEEPGRAM_API_KEY;如果缺失,请让用户自己运行powershell -NoProfile -ExecutionPolicy Bypass -File tools/set-deepgram-key.ps1(绝不要在聊天中执行)。纯英语视频:-Language en。单独重新运行:powershell -NoProfile -ExecutionPolicy Bypass -File tools/transcribe-deepgram.ps1 -Project projects/<name>。 - 不要使用
npx hyperframes transcribe配合 whisper 或安装它(太吵/慢);请使用 Deepgram。 - 生成
projects/<name>/目录,包含clip.mp4(CFR H.264)、audio.mp3、metadata.json、transcript.json、fonts/、sfx/、renders/。 - 如果用户为某个时刻提供了截图,添加参数
-Screenshots "<folder>"。
- 转录使用 Deepgram(
- 此后在
projects/<name>/内工作(在任何npx hyperframes命令之前先cd到那里)。
2. 仔细分析视频
- 阅读
metadata.json(宽度、高度、fps =r_frame_rate、时长)和transcript.json(扁平的[{text,start,end}])。 - 就地修复明显的 ASR 错误,保留时间戳。语音转文本可能偏差约 1 秒:当某个时刻很重要时,请通过
ffmpeg -ss <t-0.5> -t 2 -i clip.mp4 ...或快照进行验证,不要完全信任数字。 - 长视频或混合语言转录:导出索引化的单词列表(
index:text@start,每行一个句子)到transcript-words.txt并阅读。
字幕(当用户需要时)
- 编写
captions-src.json:[[firstWordIndex, lastWordIndex, "caption text", ["key","words"]], ...],每个块 3–7 个单词,覆盖所有单词。 乌尔都语/印地语/Hinglish 语音 → 将文本写成 罗马化 Hinglish(例如 "ke 9 maah guzar gaye hain"),保留英语单词原样,通过上下文修正误听("नौ मां" → 9 maah,"New York" → New Year)。 - 构建:
node tools/build-captions.mjs projects/<name>→captions.js(window.CAPTIONS = [{s,e,text,key}]),对未覆盖的单词发出警告。通过<script src="captions.js">加载。 - 找到脸部位置:在合成存在之前
npx hyperframes snapshot不可用,因此提取帧:ffmpeg -nostdin -v error -ss <t> -i clip.mp4 -frames:v 1 renders/_probe_<t>.png在 3–4 个点,并查看它们。 - 编写一段摘要:视频内容是什么,以及 3–8 个重要的时刻(数字、列表、前后对比、关键声明、行动号召)。
- 如果用户未指定风格,询问他们(参见
mg-styles)。默认:干净的白色磨砂卡片(Liquid Glass)。
3. 规划(如果视频长度 > 30 秒或需求模糊,请在构建前向用户展示)
对于每个时刻:触发词及其精确的 start、图形类型、内容、区域、退出时间。图形类型跟随所说内容:
- 数字 → 计数递增 · 列表 → 清单勾选 · 前后对比 → 对比 · 关键行 → 放大 或大字
- 截图/证明 → 顺序弹出(PROMPT 12)· 新话题 → 重构(视频缩入卡片)
动作词汇和样式存在于
mg-styles技能中。
4. 内部规则(不可协商)
- 保持视频完全不变:相同尺寸、fps、音频、剪辑。合成
data-width/height= 视频尺寸,fps = 视频 fps, 根元素data-duration= 视频时长(锁定到metadata.json)。视频为<video id="a-roll" class="clip" src="clip.mp4" data-has-audio="true" data-start="0" ...>,无muted,无crossorigin。 - 每个图形 在精确的单词上开始(转录中该单词的
start)。 - 整个视频使用一种风格。
- 前 3 秒内不添加任何内容——那是吸引观众的部分。
- 保持图形 远离面部、避开底部三分之一区域(字幕),并且 位于宽度中间 80% 范围内(左右各 10% 边距)。
- 仅使用项目
fonts/文件夹中的字体,通过@font-face定义(绝不使用 Google Fonts 网址);通过<script src="vendor/gsap.min.js">使用 GSAP。 - 磨砂玻璃效果需要背后有内容;覆盖在视频上有效果,透明导出请使用实心卡片。
5. 构建、检查、审阅
- 编写
index.html(独立合成,一条暂停的 GSAP 时间线,注册为window.__timelines["<id>"])。Paper Cut 风格:从kit/templates/paper-cut-vertical.html开始。 低分辨率手机视频(例如 480x864 WhatsApp):仍然在 1080x1920 画布上创作,以便图形/字幕保持清晰;视频在下方缩放。 npx hyperframes lint然后npx hyperframes check— 修复所有错误。npx hyperframes snapshot --at <t1>,<t2>,...在每个图形的中间点,然后 查看 PNG 文件 — 检查面部/字幕重叠和文本裁剪。- 渲染草稿:
npx hyperframes render . -o renders/with-cards.mp4(渲染在普通 PC 上较慢;使用快照进行迭代,仅当帧看起来正确时才渲染)。 - 将批准的最终版本复制到
exports/<name>.mp4。
6. 后续操作(同一会话内)
- 单个位置(PROMPT 12):"当我说 <短语> 时,显示 <内容>"。在转录中找到该短语,仅修改那一刻,保持其他所有内容完全相同,重新渲染到同一文件。
- 音效:使用
mg-sound技能。导出变体/透明:mg-export技能。 - 用简单语言进行微调(表面、颜色、字体、运动、时间、布局)→ 仅编辑该项,保持其他所有内容不变,再次渲染。
基础优先,然后一次一个位置。不要试图一次完成所有内容。