VoxLite 1.0.12 (WorkBuddy Edition)
本技能把一句话/文案变成 Vox 风格剪纸拼贴视频。提供两种模式:
- 极速模式(默认):一句话进去,视频出来,全程不打断确认。
- 引导模式:用户指令含「确认 / review / 精修 / 先让我看分镜」时启用,走两次确认节点,适合精修。
0. 极速模式(默认,一句话直接出片)
触发
用户给出一句话主题、一段文案,或含「做成视频 / 直接出片 / 科普短片」等意图。
默认决策(无需询问)
| 项 | 默认 |
|---|---|
| 画面比例 | 9:16(竖屏,最适合短视频;用户说横屏/方形则改 16:9/1:1) |
| 视觉风格 | 标准 Vox 4.0;句子含「美漫 / 纪念碑谷 / 复古报纸」则切到对应风格 |
| 音频 | 带配音+字幕(画面静音生成,旁白用 edge-tts 带情绪风格自然化管线生成,字幕按抖音 9:16 安全区算法从下往上排版,见 §8、§11);用户指令含「静音/无声/不要配音」才跳过 |
| 每段(Shot)时长 | 约 6s,封顶 8s(节奏更跟手;长镜头可放宽到 10s);总时长 = 段数 × 各段时长累加 |
| 画风对比 | 句子含「对比 / 合集 / 多风格 / 风格对比」或列举≥2 种风格名(如「美漫+复古报纸」)→ 只产出点名那几种对比短片;仅说「全部 / 4种 / 四种」才出满 4 条 |
> 🔒 单一风格约束(省积分,强制):一个任务只生成一种风格的关键帧。 默认风格 = 标准 Vox 4.0(用户指令含「美漫 / 纪念碑谷 / 复古报纸」则切到对应那一种,不是全部)。绝不为「以防万一 / 凑多样 / 顺手多给几个」去生成其他风格——那样会把图片积分 ×N 且无意义。只有用户显式说「对比 / 合集 / 多风格 / 风格对比」或列举≥2 种风格名(如「美漫 + 复古报纸」)才进入 §4 的多风格对比模式,那时只为点名的那几种生成对比短片(绝不生成未点名的风格,避免多余积分)。正常任务永远只出 1 种风格。
执行流水线(自动,不阻塞)
> 🔒 任务目录隔离(强制):每个任务必须先新建一个专属工作文件夹,所有 ImageGen 关键帧、VideoGen 分镜、配音分段、字幕轴、拼接中间片都只写进该文件夹,绝不直接写进工作区根目录或混用其他任务的文件夹。文件夹命名带时间戳以便区分同日多次运行:
> voxlite-<主题slug>-<YYMMDD-HHMM>/(如 voxlite-boba-sugar-260806-0430/)。
> 这一隔离是「安全清理」的前提——§11.5 的清理脚本只作用于本任务文件夹,因此绝不会误删其他未完成任务的临时文件。若同一主题要重做,用新的时间戳文件夹,不要覆盖旧任务的目录。
- 理解主题:从一句话提炼要讲的核心信息。
- 搜最新真实数据(强制实时检索):任何含数字、价格、销量、统计、排行、法规、占比的内容,必须用实时搜索取数,严禁用模型记忆 / 训练数据里的旧数字——训练知识有截止日期,会过期失真。具体:
- 查询词带时间锚点(如「2026」「最新」「今年」「截至 2026」「近一年」),并优先采信带明确发布日期、且为近 12 个月内的来源;
- 数据来源必须记到成片可见的小字标注,且必须含「检索日期」(如「来源:XX 报告,检索于 2026-08」),让观众知道数据新鲜度;缺检索日期等于没标注;
- 区分「实时数据」(价格 / 销量 / 统计 / 排行 / 法规——必须搜最新一期,不可用往年数据含糊带过)与「长期基准值」(如 WHO 游离糖 <25g/天 属长期指南,可标注「WHO 指南」,但仍要确认是否更新);
- 搜不到就明说:宁可在成片标注「暂未找到最新公开数据」,也绝不编造或用旧数顶替。 - 拆分为 3–4 个叙事拍(核心!):按「提出问题 → 铺陈/过程 → 揭示结果 → 对比/结论」的叙事弧拆成多 Shot(复杂主题可扩到 5–6 拍),绝不用一张海报直接展示结论再飘字(那样逻辑断裂、观感生硬)。每拍只讲一件事:
- 拍 1 抛钩子(爆款标题/hook 大字,3s,见 §9.6 文案规范,前 3 秒必须抓人)
- 拍 2 铺陈过程(糖倒入杯 / 数字累积等,5–6s)
- 拍 3 揭示结果(大号数字 / 结论,5–6s)
- 拍 4 对比 / 升华(与基准对比,5–6s) - 逐拍出关键帧 + 图生视频:按「视觉场景」用 ImageGen 生成关键帧(中文清晰,风格统一),再用 VideoGen 以
image参数做图生视频;运镜按该拍动作设计(如倒糖拍强调下落/堆叠运动,揭示拍强调数字弹入)。出图前先查 §9.4 关键帧缓存、同场景后续拍复用前一张图,把出图张数压到最低。
- 关键帧中文由图像模型渲染,避免视频模型画中文乱码。
- 关键帧构图必须遵守 §8 安全区域:所有文字与主体置于中央安全区,远离顶/底边缘(抖音/手机全屏播放时状态栏、灵动岛、底部字幕栏、手势条会吃掉边缘)。
- 生成顺序:ImageGen / VideoGen 必须逐张串行(或小批量)。平台存在「200 任务」并发上限,并行易触发RequestLimitExceeded,且同名输出文件会互相覆盖(实测 2026-08-05 并行出图丢帧)。 - ffmpeg 拼接成单条静音片:用 ffmpeg(经
imageio-ffmpeg自带二进制,路径python -c "import imageio_ffmpeg;print(imageio_ffmpeg.get_ffmpeg_exe())")把多段按叙事顺序concat为一条 MP4(各段已是同比例关键帧图生视频,直接 concat 即可)。此步产出单文件静音成片;画幅归一化交给第 6 步的finalize.py统一处理,勿在此步提前 scale。 - 配音 + 字幕 + 安全区混流成片(默认带声音,见 §11;本步是流水线最后一步):
- 若启用 §10 运动图形层,应先作用于第 5 步的拼接静音片,再进入本步。
- 用tts_natural.py脚本从分句脚本生成带自然停顿与音频后处理的中文配音,并输出与配音逐句对齐的字幕时间轴。
- 用sfx_mix.py按字幕时间轴自动生成音效轨(转场 whoosh / 高亮揭示 pop / 结尾 ding,详见 §11.6),再交给finalize.py叠加。
- 用finalize.py脚本完成四件事:画幅归一为抖音标准 9:16(1080×1920,不足处上下补深色条)、按安全区算法从下往上计算字幕 y 坐标、烧字幕、混流(配音 + 音效轨,音效默认低于人声)。
- 若用户指令含「静音/无声」,则跳过本步,只交付静音画面。 - 落盘 + 交付 + 清理:单条视频存本任务专属文件夹,随消息交付;同轮附一句「做了什么」(主题/数据来源/风格/比例/时长/是否有配音字幕/积分消耗),不在生成前停下来等确认。成片交付后立即清理本任务文件夹里的临时中间文件(关键帧图、分镜视频、配音分段、字幕轴、拼接静音片等,详见 §11.5),只保留成片与可复用源。因为清理脚本只作用于本任务文件夹(见 §0 隔离约定),所以不会误删其他未完成任务的临时文件。
> ⚠️ 积分提示:生成会消耗 WorkBuddy 自带积分(约 1 张 ImageGen 5–15 分 + 1 条 8s VideoGen 约 100–200 分/条)。通过 §9.4 的关键帧复用 + 缓存,单视频图片积分通常压到 2–3 张(约 10–45 分),4 风格模式约 8 张(约 40–120 分),而非原来的 4–6 / 12–16 张。极速模式默认继续,用户如需先确认成本可在指令里加「确认」。
中文渲染铁律
任何含可见中文的画面,必须先经 ImageGen 出关键帧,再图生视频。绝不直接用 VideoGen 纯文生视频去「画」中文(后段模型对中文 glyph 支持差,必乱码)。若用户坚持纯文生,须先警告乱码风险。
数据时效铁律
做视频用的数字,必须是「当下最新」的,不是模型脑子里记的旧数。 执行第 2 步时务必遵守:
- 凡数字 / 价格 / 统计 / 排行 / 法规 → 一律实时搜索,禁止凭记忆作答;
- 搜索带年份与时间词,优先近一年、带发布日期的来源;
- 成片数据标注必须含检索日期,缺日期等于没标注;
- 若话题本身有时效(如「今年 GDP」「最新销量」「当前汇率」),必须明确取到最新一期,不可用往年数据含糊带过;
- 不同口径的数据(如「中国」「全球」「某机构估算」)要标清范围,避免拿 A 口径的数去说 B 的事。
为什么不用「单张海报 + 推近」
Vox / 数据科普爆款的核心是逐拍建构叙事:先抛问题,再铺过程,最后揭示并对比。若把结论全画进一张海报再让相机推近,跳过了推理过程,逻辑断裂、观感生硬。多 Shot 叙事 + ffmpeg 拼接虽多耗几倍积分,但是「符合逻辑」的必要代价。
4 多风格对比(子集可控)
当用户想要「同一主题的多种画风对比」时,按以下规则识别并只生成点名的风格:
- 点名子集:指令列举了 ≥2 种风格名(如「美漫 + 复古报纸」「标准、纪念碑谷、复古报纸对比」)→ 只生成用户点名的那几种,不生成未点名的风格(省积分)。
- 全量:指令含「对比 / 合集 / 多风格 / 风格对比」但没列具体风格,或显式说「全部 / 4种 / 四种风格」→ 生成全部 4 种(标准 Vox 4.0 / 美漫 / 纪念碑谷式柔和几何 / 复古报纸)。
- 只列 1 种风格名 = 单风格任务(走 §0 单一风格约束),不进对比模式。
风格名识别(指令词 → 内部 key):
- 标准 / Vox / Vox4.0 / 标准 Vox → 标准 Vox 4.0
- 美漫 / 漫画 / comic → 美漫
- 纪念碑谷 / 柔和几何 / 几何 → 纪念碑谷式柔和几何
- 复古报纸 / 报纸 / 报纸风 → 复古报纸
- 自定义 → 需用户给风格描述,读 references/style-presets.md 按自定义处理
执行:
- 每种被选风格各跑一遍上述多 Shot 叙事流水线(每风格 2–3 拍;遵守 §9.4 关键帧复用——每风格只出 hook + 揭示 2 张图,过渡拍复用这两张做运镜变化;N 种风格合计约 2N 张图)。
- 每风格产出一条成片,按用户点名顺序用 ffmpeg 拼接为「风格对比 reel」单文件(如点名「美漫+复古报纸」则顺序 01-美漫 02-复古报纸)。
- 关键帧缓存(§9.4)对每种风格独立命中,重复主题/多次运行仍省积分。
1. 引导模式(用户要求确认时启用)
当指令明确含「确认 / review / 精修 / 先让我看分镜 / 别直接生成」时,切换为以下两次确认流程,且每次确认前停止等待。
1.1 第一次确认:字幕分镜
按语义合并、完整时间区间、向上吸附为 4/6/8 秒 Shot(默认封顶 8s,长镜头最多 10s,详见「时间轴规则」)。只输出分镜表,停止。
1.2 参数选择
让用户明确比例与风格(9:16/16:9/1:1 × 标准/美漫/纪念碑谷/复古报纸/自定义),回显后停止。
1.3 第二次确认:视觉分镜
逐 Shot 输出构图/元素/可见文字/动作/运镜,停止。
1.4 渲染
两次确认后执行 ImageGen 关键帧 → VideoGen 图生视频(同极速模式流水线),并落盘。
2. 时间轴规则(内部参考,极速模式自动应用)
- 中文 240–270 字/分钟,英文 140–160 词/分钟估算口播时长(配音已提速,按偏快口径估)。
- 合并后完整区间 >8s 须在语义边界拆分。
- 可长不可短:选能覆盖
actual_duration的最小档位4/6/8(默认封顶 8s,长镜头最多 10s);素材可长不可短,绝不选比实际短的档。 - WorkBuddy VideoGen 单段上限约 10–12s,默认
8s封顶(提速观感),确需长镜头可放宽到10s。
3. 动作与运镜(内部参考)
每 Shot 一个核心视觉隐喻 + 一次主要转变。8s 用「建立初始状态 → 完成核心转变」;10s 最多三段。严格控制复杂度:辅助元素合并为最多三组,可见文字尽量 ≤3 组(标题除外)。运镜连续执行,不作额外动作节拍。
4. 风格视觉规则
- 标准 Vox 4.0:完整读取
references/vox-standard-v4.0.md,逐字执行其视觉/配色/质感/运镜规则。 - 扩展风格(美漫 / 纪念碑谷 / 复古报纸 / 自定义):完整读取
references/style-presets.md,各用独立构图-材质-镜头语言,不混用。
5. VideoGen 调用规范
prompt:极速模式可直接用关键帧派生的一段英文运镜描述(关键帧已决定画面与中文,prompt 只补运动)。image:ImageGen 关键帧路径(图生视频,必填以保中文清晰与风格一致)。aspect_ratio:纯文生视频时传9:16/16:9/1:1;图生视频(带image)时建议省略该参数,让 VideoGen 跟随关键帧原比例,否则后端可能报unsupported video aspect_ratio(实测 2026-08-05 图生视频传9:16被拒)。seconds:6(默认),封顶8;确需长镜头最多10。resolution:720P(默认)或1080P。negative_prompt:no voiceover, no talking heads, silent video, no audio, no speech, text-only-where-specified(≤2500 字符)。enable_audio:false(画面静音生成——视觉素材无真人说话、无自带音轨;配音由 §11 的 edge-tts 后期叠加,与画面解耦、可控,故此处始终 false)。watermark:默认服务器浮水印;去水印传false。output_dir:可选,指定保存目录。
6. 落盘
极速模式把视频存本任务的专属工作文件夹(命名见 §0 顶部「任务目录隔离」:voxlite-<主题slug>-<YYMMDD-HHMM>/,如 voxlite-boba-sugar-260806-0430/),所有中间产物与成片都只写进这个文件夹;并在同目录写一份 <主题>.md 记录主题/数据来源(含检索日期 YYYY-MM)/风格/参数,便于复用与下游合成。不要把文件散落到工作区根目录或其他任务的文件夹里——那是安全清理与任务隔离的前提。
7. 多 Shot / 成片(进阶)
- 风格一致性:VideoGen 无 seed,靠「ImageGen 关键帧 → 图生视频」锁定;多 Shot 共用同一关键帧派生或同风格关键词。
- 带旁白成片(默认):极速模式已内置「旁白脚本 → edge-tts 生成 → ffmpeg 烧字幕+混流」流水线(见 §11),一步到位产出带字幕配音的完整成片。VideoGen 只负责静音视觉素材,配音与字幕全部后期叠加。
8. 安全区域(抖音 / 竖屏发布必读)
视频在抖音等 App 全屏播放时,画面会被状态栏、灵动岛/刘海、底部字幕栏、手势条、圆角覆盖或裁切。关键帧若把标题放最顶、来源放最底,在部分手机会直接超出屏幕。字幕如果用手写 y 值"拍脑袋"放到底部,更会被抖音互动栏完全盖住。
8.1 安全区边距(生成时强制遵守)
| 比例 | 顶部禁区 | 底部禁区 | 左右禁区 | 安全区(放所有重要文字/主体) |
|---|---|---|---|---|
9:16(1080×1920) |
顶 12%(≈230px) | 底 20%(≈384px) | 各 5%(≈54px) | 中央约 90% 宽 × 68% 高 |
1:1(1080×1080) |
顶 12% | 底 18% | 各 8% | 中央约 84% 宽 × 70% 高 |
16:9(1920×1080) |
顶 8% | 底 12% | 各 5% | 中央约 90% 宽 × 80% 高 |
- 顶部禁区:放问号/装饰,不放可读标题(状态栏、灵动岛在此)。
- 底部禁区:抖音字幕/进度条/互动按钮在此,任何关键信息、来源小字、数字绝对不放底部 20%。
- 核心原则:把所有可读中文、大号数字、主体都收进中央安全区;边缘只放可裁切的纯背景延伸。
8.2 关键帧提示词必加构图约束
在每张关键帧的 prompt 末尾固定追加:
> Safe-area composition: keep ALL readable text and the primary subject within the central safe zone — between 12% from the top and 20% from the bottom, and within 5% side margins. NEVER place text in the top 12% (status bar / notch) or bottom 20% (caption / gesture bar) of the frame. Edge areas may only hold extendable background, no key information.
8.3 画幅归一化:输出必须为标准 9:16 / 1:1 / 16:9
ImageGen / VideoGen 可能输出非标准比例(如实测出现 792×1160)。交付前必须用 finalize.py 归一化到目标标准分辨率:
- 默认 9:16 → 1080×1920
- 等比缩放到目标宽度,上下/左右用深色条补齐(色值 #14161A,Vox 深灰),不要留黑边。
- 画面主体偏上放,给底部互动栏更多余量。
8.4 字幕样式与安全区算法(强制)
字幕样式:白字 + 黑描边,不要半透明底框。
底框方案在多行时上下框会互相压叠、观感脏乱,且遮挡画面。描边方案在任何背景上都清晰,是抖音/B站爆款的通用做法。
字幕渲染走 libass(ASS 字幕),不用 drawtext:
| | ASS(推荐) | drawtext |
|---|---|---|
| 描边质量 | 矢量描边,无锯齿 | 位图描边,边缘毛糙 |
| 多行行距 | 逐行独立定位,精确可控 | 需手算每行 y,易重叠 |
| 底部边距 | MarginV 直接锁定 | 手写 y 值,易踩禁区 |
| 关键词变色 | 内联 {\c} 标签 | 需拆成多个 drawtext |
样式参数(9:16 / 1080×1920):
- 字号 54px,粗体,白色填充 &H00FFFFFF
- 黑色描边 Outline=5,阴影 Shadow=2
- MarginV = 384 + 24 = 408(底部禁区 + 余量),字幕底边锁在 y=1512
- 多行向上生长,行距 pitch = 字号 × 1.34 ≈ 72px
- 关键词用 Vox 黄 &H005EE4FF(即 #FFE45E,注意 ASS 是 BGR 顺序)
断行规则:
1. 每行视觉宽度 ≤ 16(全角字 1.0,半角字 0.55);
2. 两行时选最接近中点的标点断开——既保语义完整又两行均衡;
3. 三行及以上用贪心填满,优先落在标点后;
4. 超过 3 行自动截断并告警,此时应精简文案。
> ⚠️ 断行必须在解析高亮标记之后做,否则 **词** 会被 \N 从中间劈开,导致裸 ** 泄漏到画面上。finalize.py 已按「片段列表」处理,不要退回字符串切片。
8.5 交付前安全区核查
两种方式,推荐用第 2 种(可量化,不依赖肉眼):
① 红框目视版(仅自检,最终交付不要带红框):
python "$SKILL_DIR/scripts/finalize.py" \
--video src.mp4 --audio narration.mp3 --subs subs.json \
--out 成片_安全区核查.mp4 --ratio 9:16 --check
> $SKILL_DIR 为技能安装目录:Windows $USERPROFILE/.workbuddy/skills/voxlite/,Mac/Linux ~/.workbuddy/skills/voxlite/。下文示例里的 $SKILL_DIR/scripts/... 即指代此目录(请替换为你实际的安装路径)。
② 像素级差分校验(推荐):
再渲染一版无字幕成片,与带字幕版逐帧差分,差异像素即字幕本体,可与画面自身的白色/黄色元素彻底区分,从而精确测出字幕的顶/底 y 坐标与行间距。
> 直接扫描"白色像素"是错的——画面里本来就有大量白色元素,会被误判成字幕(实测误报率极高)。必须用差分。
校验标准:字幕底边 y < 底部禁区起点(9:16 为 1536),行间距 > 0。
9. 视觉语言对齐顶级 Vox(生成时强制)
对照市面爆款(Vox / Johnny Harris / 国内科普号)复盘,把以下「金标准」写进关键帧与运镜:
9.1 一拍一观点 + 慢
每拍只讲一件事,画面停留 4–6 秒(别拖,节奏偏快更跟手)。一个 prompt 描述的视觉想法 ≤3 个,多了拆拍。关键帧里保留可见的 paper label(纸标签)承载核心词——即便静音也能看懂(双通道原则,与「保持静音」兼容)。
9.2 招牌元素(关键帧必含)
- 手绘箭头 + 标注线:指向「重要的那个东西」,不要只摆物体。
- Vox 商标黄
#FFE45E作为高亮色,用于高亮涂抹/强调(见 §10)。 - 粗体 condense 大字:标题/大号数字用厚重无衬线,居中或三分线交点。
- 做旧不完美:纸纹 + 撕边 + 轻微歪斜,明确要「handmade, not perfect」,别生成光滑 corporate 风。
9.3 风格锚点(style-anchor,解决一致性)
- 第 1 拍(标题/hook 帧)先生成,作为风格锚点。
- 把这段逐字固定的「风格句」(palette + texture + typography + mood)原样粘进后续每个 ImageGen prompt;改写风格句 = 十段视频像十个作者。
- 例:
warm cream paper (#FAF9F5), flat paper-cut collage, sharp drop shadows, torn edges, bold condensed sans-serif labels, high-contrast, handmade imperfect feel, film grain, subtle vignette— 每段都原样带这句。
9.4 关键帧复用与缓存(省积分,必看)
ImageGen 按张计费(单张约 5–15 分),是积分大头。以下规则在不牺牲叙事的前提下把每支视频的关键帧张数压到最低:
- 一图多段(场景级复用):关键帧按「视觉场景」而非「拍」生成。同一视觉场景的连续多拍(如「奶茶杯」在铺陈拍与对比拍都出现)只生成 1 张关键帧;后续拍用同一张图做图生视频,靠不同运镜 prompt(推/拉/摇/强调)制造差异。典型 4 拍视频可压到 2–3 张图(hook + 1–2 个变化场景),而非 4 张。
- 4 种风格模式降张:每风格只生成 2 张关键帧(hook 帧 + 揭示帧),中间过渡拍复用这两张做运镜变化;4 风格合计约 8 张,而非 12–16 张(详见 §4)。
- 纯数字揭示拍免图:仅含阿拉伯数字 + 图形的揭示拍(无任何中文词)用 ffmpeg
drawtext直接在纯色/渐变背景上画大号数字,不调 ImageGen(数字字形 ffmpeg 渲染不会乱码,且省 1 张图)。含中文词的核心词拍仍必须走 ImageGen(中文渲染铁律)。 - 关键帧缓存(跨任务复用,最大省,流水线强制步骤):相同「风格 + 场景描述」的关键帧不重复生成。每次 ImageGen 前,先跑下面这一行;命中(exit 0)就直接把缓存图当本拍关键帧用(0 积分),跳过 ImageGen;未命中(exit 1)才正常出图,出图后立刻
--store落缓存。
bash # 出图前:命中则自动把缓存图拷到 keyframe.png(0 积分),未命中 exit 1 python "$SKILL_DIR/scripts/keyframe_cache.py" --resolve "风格名|场景描述" --out keyframe.png \ && echo "[cache HIT] 复用缓存图,跳过 ImageGen" \ || { ImageGen 出图到 keyframe.png; \ python "$SKILL_DIR/scripts/keyframe_cache.py" --store "风格名|场景描述" --file keyframe.png; }
缓存按 (风格, 归一化场景描述) 的哈希存于用户级~/.cache/voxlite_keyframes/,多个任务/多次运行共享。⚠️ 复用前务必肉眼确认缓存图与本次需求一致;若构图/主体有差异,重新生成并覆盖缓存(或--clear清空)。
9.5 数据随「动作」同步(非随音频)
画面虽静音生成,但成片默认带后期配音(§11),故动态排版/计数/增长条优先对齐该拍的动作爆点时刻(如糖块堆满、数字弹入的瞬间);若用户选静音版,则纯靠动作爆点传达。
9.6 文案去 AI 味 + 爆款潜质(强制)
短视频前 3 秒定生死:文案要让人「刷到就停」,不是「听完就懂」。所有标题与旁白必须过这一节。
A. 标题 / Hook 帧大字(开场 3 秒,即第 1 拍画面主文案)
- 用一句有张力的短句,直接做第 1 拍(标题/hook 帧)的粗体大字。
- 爆款标题公式(任选其一,宁用反差/悬念,不用陈述):
- 反常识:「你以为的零卡,其实比可乐还甜」
- 身份代入 + 痛点:「爱喝奶茶的你,先看完这杯」
- 数字钩子:「一杯奶茶,藏着 11 块方糖」
- 冲突对比:「同样一杯,凭什么它贵三倍」
- ✅ 用具体、惊人、挑衅、可代入的词;能带数字就带数字(数字=确定性=停留)。
- ❌ 禁用工具感标题:「一文搞懂 / 科普一下 / 干货 / 带你了解 / 关于XX的那些事 / XX 知多少」。
B. 旁白去 AI 味(逐句硬约束)
- 第二人称「你」:把"奶茶含糖高"改成"你手里的这杯,早超标了"。
- 短句为主:一句 ≤16 字,别写长复合句。
- 具体场景 > 抽象结论:不说"糖分摄入超标危害健康",说"你今天这杯下去,一天糖额度就没了"。
- 情绪词 + 冲突:用"居然 / 偷偷 / 扎心 / 离谱 / 没想到"等口语情绪词,制造惊讶或共鸣。
- 禁止 AI 过渡词:首先 / 其次 / 综上所述 / 想必 / 不难发现 / 值得一提的是 / 由此可见 / 总而言之 / 建议收藏 / 众所周知 / 也就是说 / 事实上。
- 禁止过度工整对仗/排比:AI 爱写"不仅…而且…""一边…一边…",改零散口语。
- 前 3 秒不铺垫:第一句直接抛钩子/结论/冲突,别先介绍背景。
- 结尾留互动或反转:用"你猜怎么着""下次还敢喝吗""评论区说说你中了几条",别用"以上就是本期内容 / 总结一下"。
C. 示例对比(珍珠奶茶)
| 维度 | ❌ AI 味写法 | ✅ 爆款写法 |
|---|---|---|
| 标题/hook | 一杯珍珠奶茶含有多少方糖? | 一杯奶茶,藏着 11 块方糖 |
| 铺陈 | 一杯中杯奶茶大概七百毫升,可倒进杯里的糖比你想象多 | 你手里这杯七百毫升,糖却多到离谱 |
| 揭示 | 算下来足足有十一块方糖 | 数完了——整整 11 块方糖,就在这杯里 |
| 对比 | 而世卫建议每天游离糖不超二十五克,也就是说你这杯严重超标 | 世卫说一天别超 25 克,你这一杯直接干完两天的量 |
> 注意:示例里的数字(11 块、25 克)必须来自实时检索(§0 第 2 步),不得沿用此例的硬编码值。
10. 运动图形增强层(ffmpeg,把"会动的照片"升级为 Motion Graphics)
VideoGen 图生视频只给相机级运动,做不出 Vox 的「动态排版/数字跳动/条形增长/高亮涂抹/停格感」。这一层用 ffmpeg 在 i2v 成片之上叠加,是拉开与「生硬纸贴画」差距的关键。每段 i2v 产出后、拼接前(或拼接后整体)执行。
10.1 中文动态排版(Kinetic Typography)
中文字体用工作目录下的 msyhbd.ttc(微软雅黑粗体;先复制到工作目录:Windows cp /c/Windows/Fonts/msyhbd.ttc ./,macOS cp /System/Library/Fonts/PingFang.ttc ./msyhbd.ttc,Linux 复制任意 CJK 字体为 msyhbd.ttc)。逐词砸入用 alpha 随时间淡入 + 粗描边:
FF=$(python -c "import imageio_ffmpeg;print(imageio_ffmpeg.get_ffmpeg_exe())")
"$FF" -i beat.mp4 -vf \
"drawtext=fontfile=msyhbd.ttc:text='11 块方糖':x='(w-tw)/2':y='h*0.28':fontsize=90:fontcolor=white:bordercolor=#E8625C:borderw=10:alpha='if(lt(t,13),0,min(1,(t-13)*3))'" \
-c:v libx264 -crf 23 beat_k.mp4
10.2 数字跳动(Ticking Counter)
drawtext 用 %{eif\:...} 表达式按时间计数(逗号需转义 \,):
# t=13 起 7 秒内从 0 数到 11
drawtext=fontfile=msyhbd.ttc:text='%{eif\:trunc(min((t-13)*1.57\,11))\:d}':\
x='(w-tw)/2':y='h*0.45':fontsize=80:fontcolor=#E5A93C:\
alpha='if(lt(t,13),0,min(1,(t-13)*3))':enable='between(t,13,20)'
10.3 增长条形(Growing Bar)
drawbox 宽度随时间增长(变量 iw/t):
drawbox=x='iw*0.12':y='h*0.70':w='if(lt(t,13),0,min((t-13)*120, iw*0.76))':h=36:color=#E8625C:t=fill:enable='between(t,13,20)'
10.4 高亮涂抹(Highlight Sweep,Vox 招牌)
黄色细条在关键词下「扫」过——近似 Vox 商标黄涂抹:
drawbox=x='iw*0.20':y='h*0.345':w='if(lt(t,13.5),0,min((t-13.5)*230, iw*0.6))':h=18:color=#FFE45E:t=fill:enable='between(t,13.5,16.5)'
10.5 停格感(12fps Stutter / on-twos)
输出降为 12fps,得到手作定格感(避免 corporate 顺滑):
"$FF" -i final.mp4 -r 12 -c:v libx264 -crf 23 final_stutter.mp4
# 进阶(真·on-twos):先 select 抽帧再 tblend 保持 24fps 时间轴
10.6 纹理 / 暗角 / 颗粒(最终质感层)
"$FF" -i final_stutter.mp4 -vf "grain=50,vignette=PI/4" -c:v libx264 -crf 23 final_vox.mp4
10.7 转场
多拍之间默认硬切(Vox 本就「cuts are on-style」)。要更顺可拼接时用 xfade(需各段时长精确):
-filter_complex "[0:v][1:v]xfade=transition=fade:duration=0.3[v]"
10.8 推荐增强顺序(与 §0 流水线严格对齐)
各段 i2v → §0 第 5 步 concat 拼成单条静音片 → 在整条静音片上叠加 §10.1–10.4(动态排版/计数/增长条/高亮)→ §10.5 停格 12fps → §10.6 颗粒暗角(该 build 不支持则跳过)→ §0 第 6 步 finalize.py 归一画幅 + ASS 描边字幕 + 混流 → 交付。
> ⚠️ §10 的叠加统一作用于拼接后的整条视频,不要逐段做(逐段做会导致拼接处运动不连续、且重复编码画质下降)。
10.9 本机实测坑(2026-08-05,imageio-ffmpeg 精简版)
- 字体路径冒号:
fontfile=C:/Windows/Fonts/msyhbd.ttc里的:会被 ffmpeg 当成选项分隔符报错No option name near ...。正确做法:把字体复制到工作目录,用相对路径fontfile=msyhbd.ttc(先cp /c/Windows/Fonts/msyhbd.ttc ./)。 -filter_complex_script不支持:该精简版无此选项,改用-filter_complex "$(cat 滤镜图.txt)",且滤镜图必须单行(换行会被当成值结束导致Invalid argument)。grain/vignette可能缺失:实测该 build 解析grain=50,vignette=PI/4报错。若报错,先去掉纹理层只保留fps=12停格;要纹理需装完整版 ffmpeg 或换gradfun/boxblur近似。- 中文字体:用
msyhbd.ttc(微软雅黑粗体)渲染锐利;drawtext的text含中文时确保字体支持中文 glyph。 - 计数跳动(§10.2 的
%{eif\:...}):逗号需转义\,、冒号需转义\:,且务必放在单行滤镜图里;若屡错,降级为静态大数字 stamp(如本演示)。
11. 配音 + 字幕流水线(默认开启,极速模式第 6 步)
极速模式默认产出带字幕 + 中文配音的完整成片。VideoGen 只出静音视觉素材,声音全部后期叠加,画面与声音解耦、可控(配音质量/音色独立于视频模型,可反复重生成不影响画面)。
11.1 旁白脚本:每拍 1–2 句
为每拍写 1–2 句口语化旁白(与画面同步,不是念标题)。每句作为独立的 TTS 单元;信息密的拍可拆 2 句,但一句一拍是基线。例(珍珠奶茶:4 拍承载 6 句,拍 2 含 2 句):
- 拍1(hook,3s):一杯奶茶,藏着 11 块方糖
- 拍2(铺陈,6s):你手里这杯,七百毫升。糖却多到离谱。
- 拍3(揭示,6s):数完了——整整 11 块方糖,就在这杯里。
- 拍4(对比,6s):世卫说一天别超 25 克。你这一杯,直接干完两天的量。
11.2 自然化配音脚本 tts_natural.py(推荐)
> 依赖(首次运行前):python -m pip install edge-tts imageio-ffmpeg(ffmpeg 二进制由 imageio-ffmpeg 提供,脚本通过 import imageio_ffmpeg 调用)。脚本路径:Windows $USERPROFILE/.workbuddy/skills/voxlite/scripts/,Mac/Linux $HOME/.workbuddy/skills/voxlite/scripts/。
不要整段丢给 edge-tts,否则会有浓重播报腔。用脚本做四件事:
0. 按语义自动套情绪风格:疑问=chat、揭示=enthusiastic、转折=serious、惋惜=empathetic、安利=cheerful、平述=narration-relaxed(详见上),让配音有表情、去平铺直叙;可逐句 style/degree 覆盖;
1. 按句型自动调速(整体偏快):疑问句/关键数字句略慢(-2%~0%),长铺垫句加快(+12%~+14%),默认 +12%,制造节奏起伏、去播报腔;
2. 句间呼吸停顿:句号后 320-450ms,逗号后 160-300ms;
3. ffmpeg 音频后处理:高通去浑浊、EQ 提亮人声、压齿音、压缩贴耳、轻微空间反射、响度标准化至 -16 LUFS(短视频平台友好)。
# 1. 写分句脚本 script.json
# 2. 生成配音 + 对齐字幕时间轴
python "$SKILL_DIR/scripts/tts_natural.py" \
--script script.json \
--voice zh-CN-XiaoxiaoNeural \
--out narration.mp3 \
--subs subs.json
可选音色:
| 别名 | 实际 voice | 风格 |
|---|---|---|
| female_warm(默认) | zh-CN-XiaoxiaoNeural | 女声,温暖,情绪风格最全(推荐) |
| male_passion | zh-CN-YunjianNeural | 男声,热情,适合 Vox 讲解(支持风格较少) |
| male_sunny | zh-CN-YunxiNeural | 男声,阳光年轻 |
| male_news | zh-CN-YunyangNeural | 男声,新闻感,偏正式 |
| female_lively | zh-CN-XiaoyiNeural | 女声,活泼 |
情绪风格(去平铺直叙的关键):脚本按语义自动给每句套 <mstts:express-as style> 情绪,让配音有表情——不再是一个调子念到底:
- 疑问/互动 → chat(好奇聊天气口)
- 揭示大数字/反转 → enthusiastic(兴奋着重)
- 转折/对比 → serious(严肃强调)
- 惋惜/风险预警 → empathetic(共情关切)
- 安利/惊喜 → cheerful(明亮上扬)
- 平述 → narration-relaxed(松弛自然)
也可在 script.json 里按拍手动指定情绪(覆盖自动推断),让分镜与语气严丝合缝:
[
{"text":"一杯奶茶,藏着 11 块方糖", "style":"chat", "degree":1.3},
{"text":"数完了——整整 11 块方糖,就在这杯里。", "style":"enthusiastic", "degree":1.6},
{"text":"世卫说一天别超 25 克。", "style":"serious", "degree":1.4},
{"text":"你这一杯,直接干完两天的量。", "style":"empathetic", "degree":1.5}
]
> 情绪风格仅部分声音支持:XiaoxiaoNeural/YunxiNeural/XiaoyiNeural 较全,YunjianNeural 仅支持 chat/newscast/narration-relaxed/sports 等少量风格。若所选声音不支持该风格,脚本会自动降级为纯调速(不报错)。degree(1.0–2.0)控制情绪强度,默认按语义 1.1–1.6。
> 备注:当前默认用 edge-tts(微软免费神经语音,免 API Key,支持情绪风格)。若想要更进一步的情感/拟真,可选升级:
> - OpenAI gpt-4o-mini-tts(廉价,支持 instructions 自然语言情绪引导,需 API Key)——把 tts_natural.py 的 TTS 调用层换成 OpenAI 即可;
> - 本地大模型(CosyVoice2 / Fish-Speech / ChatTTS)——情感最自然,但需本地 GPU,安装重;无 GPU 环境不建议。
11.3 画幅归一化 + 安全区字幕 + 混流:finalize.py
手写 y 值非常容易把字幕放到底部禁区,多行底框还会互相压叠。统一用脚本处理:
# 1. 生成音效轨(按 subs.json 自动派生转场/揭示音效,素材首次运行自动合成)
python "$SKILL_DIR/scripts/sfx_mix.py" \
--subs subs.json \
--out sfx_track.wav
# 2. 画幅归一 + 字幕 + 配音 + 音效混流
python "$SKILL_DIR/scripts/finalize.py" \
--video 静音成片.mp4 \
--audio narration.mp3 \
--subs subs.json \
--sfx sfx_track.wav \
--out final.mp4 \
--ratio 9:16 \
--sub-style outline # outline=ASS 白字黑描边(默认推荐); box=drawtext 降级
> 中文字体(跨平台):finalize.py 优先用工作目录里的 msyhbd.ttc(微软雅黑粗体)。若缺失:Windows 自动从 C:\Windows\Fonts\ 复制;Mac/Linux 需手动放入任一款含中文的 .ttc/.ttf(如 msyhbd.ttc 或 NotoSansSC-Bold.otf),并按需改 finalize.py 顶部 FONT_FILE。缺字体不报错,但字幕会用默认西文字体、中文可能显示为方框。
脚本做四件事(9:16 标准 1080×1920):
1. 画幅归一化:等比缩放至 1080 宽,上下补深色条 #14161A(不留黑边),画面偏上放,给底部互动栏让出余量;
2. ASS 白字黑描边字幕:字号 54、描边 5px、无底框,底边锁在 y=1512,多行向上生长且行距 72px(详见 §8.4);
3. 音效叠加:若传入 --sfx sfx_track.wav,按时间轴把音效铺到画面上(音效先降 0.85× 留余量,再与配音 amix,确保人声始终主导、不抢戏);
4. 混流:AAC 音轨 + -shortest 对齐。
关键词高亮:在 subs.json 的文本里用 **词** 包裹即自动渲染为 Vox 黄,例如:
{"start": 13.1, "end": 17.06, "text": "算下来,足足有**十一块方糖**。"}
数字、结论词高亮能显著提升 Vox 风格的信息密度感。
降级:若 ffmpeg 未编译 libass(ffmpeg -filters | grep subtitles 无输出),改用 --sub-style box,走 drawtext 描边方案(同样无底框,但描边质量稍差、行距需手算)。
11.4 静音模式
用户指令含「静音 / 无声 / 不要配音」→ 跳过 §11.2–11.3,只交付静音画面(§10 运动图形层仍可做)。
11.5 临时文件清理(成片交付后必做)
流水线在本任务专属文件夹(见 §0 隔离约定)里产生大量中间文件(ImageGen 关键帧、VideoGen 分镜视频、配音分段、字幕轴、拼接静音片等)。成片 final.mp4 交付后,立即清理本任务文件夹里的这些临时产物——既避免目录被垃圾占满,也防止同名文件互相覆盖出错。
> 🔒 隔离即安全:因每个任务各占一个独立文件夹,清理脚本只对本任务文件夹生效,绝不会碰到其他未完成任务的文件。务必把 --dir 指向「本次任务的文件夹」(如 voxlite-boba-sugar-260806-0430/),不要指向工作区根目录或包含多个任务文件夹的上级目录。脚本本身非递归、只删直接子项,所以即便指错上级目录,也不会跨文件夹删除其他任务——但那样会清不干净,请始终指向具体任务文件夹。
删除(临时 / 中间产物):
- ImageGen 关键帧原图:*.png *.jpg(已内嵌进成片,无需保留)
- VideoGen 分镜视频:shot*.mp4 clip*.mp4
- 拼接静音片 / 中间片:silent.mp4 concat.mp4 raw.mp4 *_silent.mp4
- 配音分段与中间音频:_seg*.mp3 _*.mp3 narration.mp3(已混进 final.mp4)
- 字幕中间轴:subs.json(已由 finalize 烧入成片)
- Python 缓存:__pycache__/
保留(交付物与可复用源):
- final.mp4(或最终交付文件名)——成片
- <主题>.md——本片制作记录(主题 / 数据来源 / 风格 / 参数)
- script.json——旁白分句脚本(重新渲染配音 / 字幕的唯一来源,体积小)
- msyhbd.ttc 等字体文件(跨平台复用)
推荐方式(跨平台、带保护,首选):用技能自带清理脚本,默认只删本目录匹配项,且对成片 / 记录 / 字体 / 旁白源做二次保护;先 --dry-run 确认最稳:
python "$SKILL_DIR/scripts/cleanup.py" --dir <成片所在目录> --dry-run # 先预览
python "$SKILL_DIR/scripts/cleanup.py" --dir <成片所在目录> # 确认后真删
等价手动方式(Git Bash / macOS / Linux):
# 仅删本目录匹配的中间文件,不上溯、不动其他目录
rm -f *.png *.jpg shot*.mp4 clip*.mp4 silent.mp4 concat.mp4 raw.mp4 *_silent.mp4 \
_seg*.mp3 _*.mp3 narration.mp3 subs.json
rm -rf __pycache__
> Windows PowerShell 等价:Remove-Item *.png,*.jpg,shot*.mp4,clip*.mp4,silent.mp4,concat.mp4,raw.mp4,*_silent.mp4,_seg*.mp3,_*.mp3,narration.mp3,subs.json -Force。
> ⚠️ 清理仅针对本次任务在工作目录生成的中间文件,绝不动用户个人目录(Desktop / Downloads / 文档等)。
11.6 音效(SFX,让视频更"高级")
不加背景音乐(版权 + 与短视频调性不符),改为在转场 / 揭示瞬间精确触发音效,提升质感与节奏感。音效全部由 sfx_lib 程序合成(免版权、离线、零 API),首次运行 sfx_mix.py 自动生成 assets/sfx/*.wav,无需手动准备。
音效类型表:
| 类型 | 触发场景 | 听感 |
|---|---|---|
whoosh |
镜头切换 / 段落转场(相邻句间隔 > 0.7s 自动判定) | 咻的气声扫过 |
swoosh |
更长的甩动转场 | 更长的咻声 |
pop |
元素 / 大数字弹入(含 **高亮** 的句自动触发) |
轻脆弹出 |
click |
UI 轻点 / 标签出现 | 短促点击 |
ding |
关键揭示 / 收尾提示(成片结尾自动触发) | 清亮提示音 |
impact |
重击 / 强调落地 | 低频冲击 |
chime |
结尾铃音 | 双音铃 |
自动派生(推荐,无需手写):sfx_mix.py --subs subs.json 会读字幕时间轴,自动在「转场间隔 → whoosh」「**高亮**出现 → pop」「结尾 → ding」三个位置铺音效。
手动覆盖 / 追加:传 --sfx sfx.json 指定任意时刻的音效(会叠加在自动事件之上):
[
{"t": 1.2, "type": "pop", "gain": 0.3},
{"t": 4.5, "type": "impact", "gain": 0.4},
{"t": 9.0, "type": "swoosh", "gain": 0.3}
]
t = 触发秒数;type = 上表类型;gain = 该音效音量(0–1,默认 0.3)。
音量铁律:音效是"点缀"不是"主角"。sfx_mix.py 单事件默认增益 0.25–0.3,finalize.py 叠加时再降 0.85× 并置于配音之下——人声永远比音效响,音效只负责"点睛",绝不允许盖过旁白或喧宾夺主。若某拍音效过响,调低该事件的 gain。
> 静音模式(§11.4)下通常不加音效;若用户要"静音画面但保留转场音效",可单独跑 sfx_mix.py 并给 finalize.py 传 --sfx(不传 --audio)。