mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-12 15:20:13 +00:00
refactor(skills): rebuild faceless-explainer + pr-to-video on the shot-sequence architecture (#1778)
* refactor(skills): rebuild faceless-explainer + pr-to-video on the shot-sequence architecture Move both skills onto the current shot-sequence authoring architecture and the latest shared engine, then re-narrate to each domain. The engine fixes (pre-assembly frame guards + BGM loop-extend in assemble-index, dark-ground caption contrast, brand-accent selection + mono role in tokens, dark-mode polarity invert / weight-clamp / icon-font filter in build-frame) had only landed in one copy; both skills were a generation behind. - Authoring model: visual-design now writes a time-coded shot sequence (Scene windows paced to the voiceover) instead of the older effects-id phased note; motion-language carries the move vocabulary + the tightened motion doctrine (smooth over bouncy) + the seek-safe core (fromTo entrances, no CSS-transition motion); add cut-catalog (within-frame velocity-matched seams); frame-worker and SKILL Step 4/5 move to blueprint instantiation + shot-sequence fidelity. - faceless-explainer: fold the standalone composition.md into visual-design (inventing-the-visual / portrait / caption geometry); keep the explainer story doctrine; graft cue-segmented VO + candidate-blueprint-from-Step-3. - pr-to-video: keep the ingest pipeline (fetch-pr / ingest / fetch-people-avatars) and code-vocabulary; preserve the code-beat (code-* block as focal, Scenes choreograph the surround) and mechanism-beat treatments under the new model. - Drop stage-assets from both (no captured assets to stage); remove derivation references so each skill reads standalone. bun run scripts/lint-skills.ts passes; all scripts node --check clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(skills): resync skills-manifest after format pass The pre-commit skills-manifest hook hashed the skills before the format hook reformatted cut-catalog.md, so the committed manifest lagged the on-disk content and CI's "Skills: manifest in sync" check failed. Regenerated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c811a2750a
commit
7cb8386539
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env node
|
||||
// audio.mjs — product-launch audio ADAPTER. The TTS / BGM / SFX implementation
|
||||
// audio.mjs — pr-to-video audio ADAPTER. The TTS / BGM / SFX implementation
|
||||
// no longer lives here: it is the shared engine at
|
||||
// ../../hyperframes-media/scripts/audio.mjs. This file only (a) maps the
|
||||
// product-launch model (SCRIPT.md frames + STORYBOARD.md music/sfx) into the
|
||||
// frame model (SCRIPT.md frames + STORYBOARD.md music/sfx) into the
|
||||
// engine's neutral audio_request.json, (b) converts the engine's id-keyed
|
||||
// audio_meta back into the frame-keyed shape captions.mjs / assemble-index.mjs
|
||||
// already consume, and (c) keeps the local `sync-durations` pass (it rewrites
|
||||
// STORYBOARD.md, which is product-launch-specific).
|
||||
// STORYBOARD.md, which is this skill's concern).
|
||||
//
|
||||
// Three modes (unchanged CLI surface):
|
||||
// (default) generate — engine --only tts,bgm. BGM mode is "retrieve" (strict:
|
||||
@@ -86,9 +86,9 @@ function runEngine({ request, hyperframesDir, neutral, only, extra = [] }, die)
|
||||
if (r.status !== 0) die(`media audio engine exited ${r.status}`);
|
||||
}
|
||||
|
||||
// Engine neutral meta (id-keyed) → product-launch meta (frame-keyed) consumed by
|
||||
// Engine neutral meta (id-keyed) → frame-keyed meta consumed by
|
||||
// captions.mjs / assemble-index.mjs. id is the zero-padded frame number.
|
||||
function toProductLaunchMeta(neutral) {
|
||||
function toFrameKeyedMeta(neutral) {
|
||||
const voices = (neutral.voices ?? []).map((v) => ({
|
||||
frame: Number(v.id),
|
||||
path: v.path,
|
||||
@@ -152,7 +152,7 @@ function runGenerate(argv) {
|
||||
const neutral = neutralPath(outPath);
|
||||
runEngine({ request, hyperframesDir, neutral, only: "tts,bgm" }, die);
|
||||
|
||||
const meta = toProductLaunchMeta(JSON.parse(readFileSync(neutral, "utf8")));
|
||||
const meta = toFrameKeyedMeta(JSON.parse(readFileSync(neutral, "utf8")));
|
||||
writeFileSync(outPath, JSON.stringify(meta, null, 2));
|
||||
console.log(
|
||||
`✓ audio generate: ${meta.voices.length} voice + ${meta.bgm ? "1 bgm" : "no bgm"} → ${outPath}`,
|
||||
@@ -189,7 +189,7 @@ function runFetchSfx(argv) {
|
||||
// voices/bgm written by the earlier generate (--only tts,bgm) pass are preserved.
|
||||
runEngine({ request, hyperframesDir, neutral, only: "sfx" }, die);
|
||||
|
||||
const meta = toProductLaunchMeta(JSON.parse(readFileSync(neutral, "utf8")));
|
||||
const meta = toFrameKeyedMeta(JSON.parse(readFileSync(neutral, "utf8")));
|
||||
writeFileSync(outPath, JSON.stringify(meta, null, 2));
|
||||
console.log(`✓ audio fetch-sfx: ${meta.sfx.length} SFX cue(s) → ${outPath}`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user