Hyperframes 嵌入字幕分组实战:如何把 Whisper 词级转写切分为 plan.json 视觉短语

Hyperframes 嵌入字幕分组实战:如何把 Whisper 词级转写切分为 plan.json 视觉短语 Hyperframes 嵌入字幕分组实战如何把 Whisper 词级转写切分为 plan.json 视觉短语【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes本篇技术指南围绕 Hyperframes 内置embedded-captions技能中的核心编排环节——**字幕分组Caption Grouping**展开讲解如何把 Whisper 生成的词级转写transcript.json转成plan.json中的groups[]数组让每个字幕组成为一个视觉短语进场、逐词揭示、退场。你将掌握五类切分边界、组时间窗口的精确计算公式、样式与语气style/tone的选取规则以及如何借助仓库内的fill-timings.cjs与check-timing.cjs脚本保证时间戳与转写严格对齐。分组的目标一组 一个视觉短语在 Hyperframes 的embedded-captions工作流中最终呈现在画面上的不是逐词飘过的字幕条而是一组一组有排版身份的视觉短语。每个 group 拥有统一的入场动画、统一的字重字号、统一的语义角色intro / phrase / emph / dream / crown并在组内按词做卡拉 OK 式的逐词揭示。判断分组是否合理的经验法则很简单1 个 group ≈ 1 个逗号到逗号的小句comma-to-comma clause或 1 次呼吸的气口breath of speech。换句话说分组依据的是语义和语调的自然停顿而不是机械的每 N 个词一组。这是本技能与普通烧录字幕最大的分野普通字幕像法庭记录嵌入字幕是写在画面里的排版。输入从transcript.json的词级转写开始分组的输入是由scripts/transcribe.cjs生成的transcript.json。该脚本读取项目目录下的source.mp4优先通过uvx驱动 WhisperXwav2vec2 强制对齐词级时间精度远高于 whisper.cpp 的段级插值可通过TRANSCRIBE_ENGINEwhisperx|whisper切换模型默认small可用WHISPER_MODEL覆盖输出结构如下{ words: [ { text: Some, start: 0.24, end: 0.44, type: word }, { text: , start: 0.44, end: 0.48, type: spacing }, { text: memories, start: 0.48, end: 0.82, type: word } ] }做分组的第一步是丢弃type: spacing的条目——你只需要带真实时间的word条目。从源码实现看transcribe.cjs会做三类健壮性收尾对齐缺失的词WhisperX 偶尔给出无时间戳的词OOV、数字脚本会从前一词的end与后一词的start插值补齐尾部幻觉词裁剪Whisper 会在静音尾巴上编造重复词如反复说 Im sorry.脚本用 ffmpegsilencedetect找出真实可听内容的终点删除落在其后 0.4 秒之外的词近静音护栏整段平均音量低于 -45dB 时直接警告这是幻觉转写不是真实语音提醒遵守决策门禁、拒绝为编造的词配字幕。正是因为这层清洗transcript.json的词级时间才是后续分组与对齐的可靠基准。这也解释了为什么技能里强调转写是垃圾就拒绝配字幕一个由幻觉词拼成的逐字 rail 比没有字幕更糟。切分边界满足任意一条就开新组把词流切成组时以下五个断点条件任意命中其一就应在该处新起一个组停顿 ≥ 500msword.end[i]与word.start[i1]之间的间隙——说话人换了一口气句末终止符——词以.、?、!结尾或出现破折号式的长停强逗号——,后跟 ≥ 250ms 的停顿话语重置discourse reset——but、so、and then、you know 这类开启新小句的词往往值得独占一组或开启新组组达到 6 个词或 2.5 秒——哪个先到算哪个。过长的组读起来像字幕条而不是嵌入排版。同时还有三条硬约束必须满足每组最少 2 个词唯一的 1 词例外感叹词如 Wait.或 crown 金句行组在屏时长最少 0.5 秒不足则并入相邻组组与组不得在时间上重叠——同一时刻至多一个组可见。第 5 条边界6 词 / 2.5 秒上限与1 组 ≈ 1 个小句的目标相互配合短句不会因为停顿不够而长到失去节奏长句则被自然断点拆成若干视觉呼吸单位。组时间窗口in与out的精确算法对一组词w[0]..w[n-1]组窗口的时间按下式计算in w[0].start - 0.08——在第一个词出声前稍早进场约提前 80ms避免词到了字还没到的错位感out min(next_group.in - 0.05, w[n-1].end 0.6)——最后一个词结束后再滞留约 0.6 秒让观众读完但绝不能撞上下一个组的in留 50ms 安全间隙最后一组如需可延伸到视频结尾。从实现层面看这个公式与scripts/check-timing.cjs的校验规则互为表里校验器要求group.in ≤ 组内最早词的 start、group.out ≥ 组内最晚词的 end——一旦in晚于某个词的 start该词会被静默推迟到容器挂载后才显示仓库注释记录过由此产生的 800ms 滞后 bug一旦out早于某个词的 end词会被硬生生截断。需要强调的是组窗口只做包住词的保证不做收紧。fill-timings.cjs的源码注释明确说明作者故意设置的更晚out高潮滞留、句子累积与更早in预进场会被原样保留仅当它们会裁剪词时间时才做夹取clamp。这保证了编排水准不被机械规则抹平。样式与语气每个组都要有排版身份分组确定后按references/typography-presets.md为每个组挑选style与tone并从左到右逐组推进。五种命名样式对应模板中的cap-*CSS 类styleCSS 规格适用场景intro66px 斜体 500首行、填充语You know…、So…、沉思式开场视觉重量低phrase78px 正体 600主要陈述小句大多数行的默认值emph92px 正体 800情绪峰值或关键成就Ive achieved incredible thingsdream82px 斜体 700愿景类、回忆类was dreaming of…斜体暗示记忆与想象crown140px 正体 900 大写仅限高潮行用在居中crown-plane全片至多一个——通常就是最后一行tone与 style 相互独立二选一soft——柔和淡入 8px 垂直漂移power2.out缓动飘浮、怀旧用于记忆、开场、dreampresent——干脆的 6px 位移 1.04 倍缩放弹入power3.out以中心为变换原点果断、当下感用于强调与 crown。选样式的推进顺序第一组默认introsoft观察强调信号转写中全大写罕见更常见的是语义信号——最高级形容词、专有名词独白从铺垫转为陈述时把语气升为presentcrown最多保留一个组通常是最后一行。字号还随字幕平面的列宽缩放typography-presets.md给出的默认值是针对约 560px 列宽champion 原始构图调校的平面更宽时字号要等比放大如 600–760px 中宽时 phrase 提到 108px、crown 提到 220px若平面rotateY超过约 8°可见宽度收缩字号应上调约 10% 补偿。编辑手术你不是在誊写法庭记录字幕组并不要求逐字全配。为了视觉节奏允许合理的编辑取舍删填充词——多余的 you know、um、I mean 若拖垮视觉节奏可以删压缩——把 6 词长句通过删功能词压成 4 词只要语义与时间仍然真实整体跳过——明显的静音或非语音段笑声、纯音乐间奏可以不配。总原则一句话你写的是支撑语音的排版不是逐字法庭记录——保住含义裁掉噪音。这与composition-craft.md的逐词角色标注一脉相承纯语音感叹词um/uh/er、完全重复的结巴the the the 只留一个、自我纠正回退I think— I mean actually… 只留 I mean actually才被允许从转写中移除内容词与结构词冠词、连词、介词、代词一律保留。完整示例champion 分组的黄金样本原始转写约 15 秒You know, for me Ive had this kind of upbringing, had the great foundation and, you know, Ive achieved incredible things. I was dreaming of becoming number one in the world and becoming a Wimbledon champion经过编辑取舍后的分组plan.json的groups[]片段[ { id: cg-0, style: intro, tone: soft, words: [You, know, for, me], in: 0.1, out: 1.45 }, { id: cg-1, style: phrase, tone: soft, words: [Ive, had, this, kind, of, upbringing], in: 1.4, out: 3.35 }, { id: cg-2, style: phrase, tone: soft, words: [the, great, foundation], in: 3.5, out: 5.35 }, { id: cg-3, style: emph, tone: present, words: [Ive, achieved, incredible, things], in: 6.05, out: 8.3 }, { id: cg-4, style: dream, tone: present, words: [dreaming, of, becoming, number, one], in: 8.5, out: 10.4 } ]加上 crown独立于 groups[] 之外的crown_group字段{ id: cg-crown, style: crown, words: [Wimbledon, Champion], in: 10.8, out: 12.08 }注意这里的三处编辑手术痕迹cg-2 删掉了 hadhad the great foundation → the great foundationcg-4 删掉了 I wascrown 删掉了 a——全部是为了视觉节奏。同时注意时间窗口的衔接cg-0 的out是 1.45cg-1 的in是 1.4先出后进的相邻交接或靠空间分离共存cg-3 选择了emphpresent因为 incredible 是最高级cg-4 用dreampresent因为 dreaming of 是愿景表达crown 独占最终高潮。词级时间戳原样透传绝不重排分组只负责决定哪些词组成一组、以及组窗口 in/out组内每个词的start/end必须原样透传转写中的时间戳——不要对词重新计时。组内的逐词卡拉 OK 揭示动画用的是原始w.start。这一点在scripts/fill-timings.cjs中有完整的工程化支撑该脚本按转写顺序sequence而非文本匹配为plan.json填充词级时间。它维护一个转写游标在 40 词前瞻窗口内按位置匹配每组词——这正是为了规避文本匹配在重复词如第二个 and、actions上配错时间戳的经典 bug匹配不到的词保留原时间并报警告让拼写错误优雅降级而不是静默错位。最后scripts/check-timing.cjs --strict会在渲染前把守时间真相词时间与转写偏差 ≤ 80msDRIFT_TOL 0.08——一个偏差 500ms 的字幕会毁掉场景幻觉组窗口包住词——group.in晚于最早词 start、group.out早于最晚词 end 都会报错时间 屏幕区域双重重叠检测——同时在时间与垂直带上重叠的组会报冲突需空间分离、交接前组out ≤后组in或显式allow_overlap: true创意替换如 15% 替代 fifteen percent通过CREATIVE_SUBS注册表放行替换词按对应转写词位对齐。这套分组由人或 Agent决定、时间由脚本按位置填充、校验器在渲染前把关的流水线正是caption-grouping.md与整个embedded-captions技能一切确定性步骤都计算/编译、绝不手写原则的缩影——你只需要做好一件事判断哪些词构成一个视觉短语剩下的事交给脚本和校验器。更多上下文分组只是embedded-captions技能链条上的一环。若想继续深入可查阅仓库内的配套文档与实现skills/embedded-captions/SKILL.md——五步流水线总览prepare → 编排 JSON → preview → renderrail embed 双轨字幕模型以及嵌入是稀缺的、值得争取的高潮这一核心设计哲学skills/embedded-captions/references/typography-presets.md——五种样式 × 两种语气的完整对照表、字号随列宽的缩放矩阵、以及每个渲染最多一个 crown等禁忌清单skills/embedded-captions/references/composition-craft.md——embed 轨道的深水区短语分组、平面与净区锚定、高潮弹出、遮挡三步判断法skills/embedded-captions/scripts/transcribe.cjs、skills/embedded-captions/scripts/fill-timings.cjs、skills/embedded-captions/scripts/check-timing.cjs——词级转写、按序填时间、80ms 严格校验的完整实现skills/embedded-captions/references/layout-heuristics.md——分组之后该把组放在画面哪里净区选择、视线方向、crown 居中的三个条件。其中每个文件都建议按需精读分组规则回答切到哪排版预设置回答长什么样布局启发式回答放哪里时间脚本回答何时出现——四者合起来才是一条真正嵌入场景、而不是浮在画面上的字幕。【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考