1仕組みと動作原理
字幕ではなく「グラフィックパッケージング」としての位置付け:元映像はカット編集せずフル再生し、エージェントが対話内でカードのHTML(タイミング+内容)を1枚ずつ生成し、合成HTMLに組み立ててhyperframesでMP4としてレンダリングします。固定のカード一覧はなく、文字起こし内容に応じて動的に決定されます。
Talking Head Recut takes a local video that **plays in full** and layers a sequence of timed, designed **graphic cards** onto it — titles, lower-thirds, data callouts, quotes, side panels, picture-in-picture — synced to what's being said. The agent designs the cards (timing + content) and **writes each card's HTML directly in the conversation**, then assembles a single composition HTML and renders it to MP4 via `hyperframes`. There is no fixed archetype list and no prescribed card structure — the overlays emerge from what the transcript actually says.
実行面は本リポジトリのCLIおよびシステム標準のffmpeg/ffprobeのみ:文字起こしはローカルWhisperを使用し、サードパーティ製サービス、APIキー、プロキシ、レート制限は一切ありません。
This skill runs entirely on the **hyperframes** CLI plus system `ffmpeg` / `ffprobe`. Transcription is local **Whisper** via `hyperframes transcribe` — no third-party service, API key, or rate-limited proxy.
ステップ3〜5は純粋なローカルメディア処理:ffprobeで幅/高さ/フレームレート/長さを取得、ffmpegでmp3を抽出、hyperframes transcribeで**フラットな単語配列**(transcript.json)を出力し、エージェントが誤認識語の修正と句読点/ポーズによる文の分割を独自に行います。
`transcript.json` is a **flat array of word objects** — `[{ "text": "...", "start": s, "end": s }, …]` (no `segments` array, no `words` wrapper; the per-word key is **`text`**). Read it and fix obvious ASR errors:
レンダリング戦略として、明示的な1回限りの4問ゲート(アスペクト比/レイアウト/スタイル/カード密度)を設け、推奨値を事前計算(元動画の比率からrecommendedRatio、動画長からautoCountを算出)し、ホスト環境に応じた3段階のフォールバックプロンプトを備えています。
**Environment compatibility — pick the best available question channel.** Not every runtime exposes the same structured-question tool. Apply this order: 1. **Native clarification tool** — use the structured 4-question call below. 2. **Other native clarification tool** (e.g. `ask_question`, `request_user_input`, IDE-specific prompt) — use that tool with the same 4 question texts and option lists. Preserve the recommendation markers and the precomputed values. 3. **No native tool** (Codex CLI, plain text-only runtimes) — **ask directly in normal conversation**.
デザイン次元を直交する3次元に分解:10種のスタイル × 4種のレイアウト × 3種の画面フレーム = 120通りの組み合わせを、それぞれ自己完結型HTMLスニペット(スコープ付き<style>、<script>なし、外部リンクなし、アニメーションはdata-anim-*のみ)として保持します。
Style × Layout × VideoFrame (10) (4) (3) = 120 possible combinations
アセンブリ時の2つの厳格なルール:① 入力動画は高密度なキーフレームで再エンコード必須(GOP間隔が広いとレンダラーのシーク時にフレームがフリーズするため);② 映像はミュートの<video>を使用し、同一ソースからルートレベルの#source-audioトラックを別立てで読み込むことで、原音を保持しつつ音量やダッキングの個別制御を可能にします。
ffmpeg -y -i "$VIDEO_PATH" -c:v libx264 -crf 18 -g 30 -keyint_min 30 \ -pix_fmt yuv420p -movflags +faststart -c:a aac "$WORK_DIR/public/input-video.mp4"
SKILL.md自体のコンテンツに対する構造アサーションテストを同梱:正規の合成例が元動画をミュートvideo+同音源audioとして確実に保持していること、両トラックのsrc/data-start/data-durationが一致しtrack属性が異なることを検証します。
assert.equal(readAttribute(audio, "src"), readAttribute(video, "src")); assert.equal(readAttribute(audio, "data-start"), readAttribute(video, "data-start")); assert.equal(readAttribute(audio, "data-duration"), readAttribute(video, "data-duration")); assert.notEqual( readAttribute(audio, "data-track-index"), readAttribute(video, "data-track-index"), );
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | hyperframes CLI(doctor / transcribe / render / snapshot / preview / skills update) |
| cli | ffmpeg / ffprobe(系统依赖:取元数据、抽音频、重编码输入视频) |
| cli | 本地 Whisper(经 hyperframes transcribe,无 key/无代理) |
| package | GSAP 3.15.0(随包 vendored,复制进工作目录的 public/vendor/) |
| package | 随包字体(Inter / Caveat / Virgil / LXGWWenKaiTC,woff2) |
| network | hyperframes skills update(自刷新,需网络;本 skill 唯一需要联网的环节) |
| package | 上游开源项目(本 skill 卡片设计系统的来源,仅署名引用,非运行时依赖) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: (同梱の本番スクリプトなし)ワークフローがホストに実行を要求: npx hyperframes doctor / transcribe / render / snapshot
- 本地工作目录: ファイルの読み書きと成果物の出力: videos/<project>/metadata.json、audio.mp3、transcript.json、storyboard.json(ag
5二重目の独立検証
- [ok] 是否真的无凭证、无第三方 API(蓝档判定的关键) — 整目录 grep:(API_KEY|TOKEN|SECRET|\.env|keychain|Bearer|Authorization) 命中 15 处全为 'tokens' 子串误配(设计 token 语境);heygen/OPENAI/ANTHROPIC 0 命中;process.env 0 命中;fetch 0 命中。SKILL.md 与 NOTICE.md 双重声明转录为本地 Whisper。结论成立。
- [ok] 『无脚本』是否属实(有没有隐藏的执行体) — 全量清单中 .mjs 仅 1 个且为测试;无 .sh/.py/.cjs。流程里的命令是文档中给宿主执行的 ffmpeg/CLI 调用,不是随包脚本。『runs entirely on the hyperframes CLI plus system ffmpeg/ffprobe』表述与文件构成一致。
- [ok] 『外部资源』逐条回查调用点 — npx hyperframes doctor/transcribe/render/snapshot/preview 均在 SKILL.md 原文;ffprobe/ffmpeg 两条命令在 Step 3 原文、重编码命令在 Step 9 原文;随包字体与 gsap 的复制命令在 Step 9 原文;上游仓库链接在 NOTICE.md 原文。无推测项。
- [discrepancy] 转录模型选择与同批 skill 的口径差异 — 本 skill 硬编码 `--model small.en`(Step 4 原文),而同仓 embedded-captions 的 transcribe.cjs 明确**禁止**默认 small.en(注释:'Default = multilingual `small`, NOT `small.en`. Per media-use: ".en models mistranslate non-English and mis-handle accented speech"',并记录了曾被 small.en 在重口音说话人上产出错误转录的实例)。本 skill 在 description 中虽未宣称多语种,但也没有对非英语素材给出提示。这是**同一仓库内两个 skill 对同一问题给出相反默认**的真实出入,对非英语/重口音素材的使用者有实际影响(本 skill 使用者也可能会中同样的坑)。
- [ok] vendored GSAP 的许可约束是否被标注 — assets/vendor/gsap.min.js 文件头写明 'GSAP 3.15.0 … @license Copyright 2026, GreenSock. All rights reserved. Subject to the terms at https://gsap.com/standard-license.';随包分发即意味着产出物沿用该许可约束(同批其它 skill 走 CDN 引用、许可披露方式不同)。已在 meta.license 与 risks 中记录。
- [unlocatable] 验证:渲染/预览类声明是否可在源码内证实其行为 — SKILL.md 描述的行为(稀疏 GOP 导致渲染器 seek 卡帧、单帧 snapshot 的位置与命名、`--at` 单值会忽略 --out)需要实际运行 hyperframes render/snapshot 才能证实;本次为只读侦查且不得运行构建/渲染,故记为无法在源码内定位,不作为已验证事实。
6結論
ff96f4df7b933a0f…