关于 paper2video
paper2video 是将论文材料编排为演示文稿并渲染为带旁白视频的工作流技能,面向制作论文视频的研究者。它把演示文稿制作和视频渲染交给 ppt-master 与 pptx2video,并统一触发设置、严格执行媒体 QA。
主要功能
- 01从论文材料构建共享资源包
- 02统一解析演示文稿动画触发方式
- 03委托 ppt-master 制作演示文稿
- 04委托 pptx2video 渲染旁白视频
- 05严格模式执行媒体质量检查
适用场景
- 01将论文制作成旁白视频
- 02确保演示文稿与视频使用一致的动画触发方式
- 03生成带字幕及无字幕的视频版本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ microsoft/ researchstudio --skill paper2video安装后在 Claude Code 中输入/paper2video确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdreferences/ppt_trigger_handoff.mdpptx2video.mdscript_json_schema.mdscripts/ppt_options_contract.pyppt_stage_validator.py详细介绍
paper2video - 论文/素材 -> ppt-master 演示文稿 -> pptx2video 渲染 -> 配音 MP4
paper2video 是一个轻量级编排器,仅支持一条路径。它本身不会创作幻灯片、合成音频、合成视频,也不会自行执行 QA 门禁。它会解析输入和一个共享的触发器决策,然后将所有工作完全委托出去:
paper.pdf
-> skills/paper2assets/scripts/build_package.py (shared package)
-> assets/meta/paper_spec.md + assets/meta/narration.json
-> ppt_options_contract.py resolve-ppt-trigger (ONE trigger decision)
-> installed ppt-master skill (full workflow, receives the trigger)
-> installed pptx2video skill / CLI `bootstrap` then `render` (full workflow, receives the trigger)
-> ppt_stage_validator.py audit-final-pptx-trigger (proves the handoff held)
-> video.mp4, video_no_subtitles.mp4, video.pptx
只有一条路径。 此技能的早期版本曾有第二条由自身实现的“路线 A”,它会调用私有的配音、时长和视觉提示脚本,并调用 python -m pptx2video.render_video / pptx2video.build_timeline / pptx2video.check_video_package,仿佛这些是已安装的公开软件包中的可导入子模块。这些模块在公开 pptx2video CLI 中并不存在于该导入路径;其入口是 pptx2video render、pptx2video doctor 和 pptx2video bootstrap 子命令。不要重新创建这种捷径。不要手动拼装配音脚本、视觉提示文件,或跳过已安装 pptx2video 技能的“简化版”渲染流程。不要调用 pptx2video.* 下的任何私有子模块路径。每次渲染都必须通过 /pptx2video(已安装的技能)或第 5 步中的确切 pptx2video render CLI 调用;即使会话时间紧迫或上下文较少,也没有更省事的备用方案。
为什么必须完全委托
pptx2video render 不是用于冒烟测试的包装器。它自己的 CLI(cli.py 中的 _render())始终会运行 QA 检查,并始终写入 assets/meta/reports/video_qa_report.json;它没有 --no-qa 标志,也无法跳过检查本身。手动调用内部模块可能会完全跳过此门禁,因此每次渲染都必须使用第 5 步中的命令。
严格门禁为选择启用,第 5 步会选择启用。 上游 pptx2video 默认将 --qa-mode 设为 warn-only,即便存在阻断性警告也会交付成品包——这适用于预览和演示,却不适用于 Paper2Video 交付物。因此,第 5 步会明确传入 --qa-mode strict。切勿为了让失败的渲染成功而移除此标志:阻断性警告意味着演示文稿不可交付,应在 ppt-master(第 3 步)或配音内容中修复,而不是放宽门禁。将非零退出码视为必须修复的阻断性失败,绝不要因此放宽模式或退回到更简单的本地脚本。
两个子技能,一个共享的触发器决策
此技能自身的职责很有限:解析输入、确定一个 ppt_trigger 值、将其原样传递给两个子技能,并验证交付的 PPTX 确实携带该值。其他工作都由子技能负责:
ppt-master创作演示文稿:SVG 页面、Strategist 确认阶段、演讲者备注,以及包含原生进入动画触发器(--animation-trigger)的 PPTX 导出。pptx2video渲染演示文稿:TTS、词边界计时、动画调度、字幕、时间线和严格的媒体 QA(assets/meta/reports/video_qa_report.json)。
两者都会读取 PowerPoint 原生的 p:timing 树,但用途不同:ppt-master 负责写入,pptx2video 的视频调度器则读取原生行顺序和其中的配音计时,而不会读取点击组编号。如果允许这两个技能各自选择默认触发器,它们可能会生成一对原生徽标与播放节奏悄然不一致的 PPTX/MP4 文件。此技能的第 2 步正是为避免这种情况而设。
旧协议混为一谈的四个概念
单一的原生 p:timing 树必须回答四个不同的问题,而本技能协议的旧版本只使用一个字段(点击组编号)来试图回答所有问题;只要演示文稿使用了 after-previous,这种做法就会失效:
| 概念 | 含义 | 所在位置 | 采用谁的默认值 |
|---|---|---|---|
effect_order | 实际的进入动画顺序,范围为 1..N,与触发类型无关 | 原生动画窗格行顺序(mainSeq 内的 p:cTn 顺序) | 由创作顺序决定;绝不根据点击组编号推断 |
ppt_trigger | 面向用户的唯一意图:on-click 或 after-previous | 由本技能的 resolve-ppt-trigger 命令解析一次 | 由本技能决定,而非 ppt-master 自身的 CLI 默认值,也非 pptx2video 自身的 CLI 默认值 |
click_group | PowerPoint 自行推导的点击组标记,显示在动画窗格 UI 中 | PowerPoint/pptx2video 根据触发器拓扑通过 --click-group-policy 计算 | 一种副作用,绝非事实来源 |
video_start | 某个阶段在渲染后的 MP4 中播放的时间 | pptx2video 的旁白/时间线调度器,根据 effect_order 和单词边界时间确定 | 由 pptx2video 的渲染器决定;绝不参考点击组编号 |
此修复针对的问题是:包含 38 个 after-previous 效果的演示文稿在 OOXML 中完全有效,但 PowerPoint 会将所有 after-previous(自动)效果放入同一个原生点击组,因此动画窗格的点击组列中通常都会显示 0。这是 PowerPoint 对自动效果的预期行为,不是数据丢失,也不是渲染错误;effect_order(窗格行顺序)仍然存在,pptx2video 的调度器正是结合旁白/单词时间信息,利用它将每个阶段放置在视频时间线上。旧协议的问题在于文档和验证,而非底层渲染:没有任何说明要求 Agent 在创作前主动选择 ppt_trigger,将相同设置交给两个子工具,并检查交付文件。本技能的步骤 2 和步骤 6 正好弥补了这一缺口。
路径
除非另有说明,请在 ResearchStudio-Reel/ 下运行 Paper2Video 工作流命令。
PAPER2VIDEO=skills/paper2video
PAPER2ASSETS=skills/paper2assets
开始前请安装两个外部技能。请勿在 ResearchStudio 内克隆或打包任一依赖:
npx skills add hugohe3/ppt-master --skill ppt-master
npx skills add ai-nuts/pptx2video --skill pptx2video
安装并验证公开的 pptx2video CLI 运行时。请使用 Python 3.11 或更高版本的环境,并跟踪上游默认分支——这是 pptx2video 自身的 SKILL.md 文档中记录的安装方式:
python -m pip install \
'pptx2video[svg] @ git+https://github.com/ai-nuts/pptx2video.git'
python -m playwright install chromium
python3 -m pptx2video --version
python3 -m pptx2video doctor --svg
始终通过 python3 -m pptx2video ... 调用运行时,切勿直接使用裸 pptx2video 命令。 主机上可能有较旧的 pptx2video(例如 0.3.0)排在预期安装版本之前;此时裸命令会静默解析到错误版本,且不会报错。请对比 python3 -m pptx2video --version 与 pip show pptx2video 的结果;如果两者不一致,请先修复环境(pip install 目标、PATH、虚拟环境),再继续,而不是抱着 CLI 接口仍与本文档一致的侥幸心理继续操作。
请跟踪上游默认分支,不要固定到某个发行版标签。 pptx2video 会在标签版本之间发布功能,因此固定到某个标签会导致所有 paper2video 用户无法获得这些功能。请从默认分支重新安装,以获取上游修复。
请勿将特定于主机的技能目录写死。用户可能通过 Codex、Claude Code、shell 或其他 Agent 运行此仓库。本技能本身绝不会调用 pptx2video.* 下的私有路径;它始终调用已安装的技能(/pptx2video)或公开的 pptx2video render /
pptx2video doctor /
pptx2video bootstrap CLI 子命令。
输出约定
遵循共享的 paper2assets v2 布局。输出包顶层仅包含交付文件和 manifest.json;其他所有内容都放在 assets/ 下:
<video_outdir>/
video.mp4 # required, burned-in subtitles in an appended black bottom band
video_no_subtitles.mp4 # required, raw/pre-subtitle playback copy for paper2reel
video.pptx # required, the same delivered deck pptx2video rendered from
manifest.json # schema_version "paper2video.v1", layout "v2-assets"
assets/
audio/ # script.json, per-block TTS, word timings
captions/ # video.srt, video.vtt
slides/ # rendered slide frames used by the MP4
clips/ # raw render intermediate
meta/ # timeline.json, QA and authority reports
此布局及其中的每个文件均由 pptx2video render 自行生成;第 5 步是此技能唯一会写入 <video_outdir> 的地方。在此步骤之前,不要手动组装此目录树的任何部分。
在写入任何文件之前,先确定 <video_outdir>。 按以下规则确定:
- 调用方显式传入的
<video_outdir>参数优先。 原样使用;仅在未传入路径时才使用下方默认值。 paper2assets包已存在 → 原样复用其文件夹作为<video_outdir>。规范的检测信号是<dir>/assets/meta/paper_spec.md;如果存在,<dir>/manifest.json中的"layout": "v2-assets"可作为确认提示。- 否则(输入仅为一个普通 PDF) → 默认使用
<input_pdf_dir>/<pdf_stem>/,与paper2assets的默认约定一致,以便后续运行paper2assets时输出到同一个包中。
pptx2video render 会拒绝写入已存在的路径,因此第 5 步会先渲染到一个全新的临时包中,然后由此技能将结果移入 <video_outdir>(见第 5 步)。
第 1 步:构建或复用共享的 paper2assets 包
python skills/paper2assets/scripts/build_package.py <paper.pdf> --outdir "$VIDEO_OUT"
如果 paper_spec.md 已存在,则同步结构化要点和旁白,而不是重新提取:
python skills/paper2assets/scripts/build_package.py <paper.pdf> \
--outdir "$VIDEO_OUT" \
--skip-extract \
--paper-spec "$VIDEO_OUT/assets/meta/paper_spec.md"
assets/meta/narration.json 是本次运行的规范旁白顺序:每个章节包含一个 {"id", "heading", "text"} 条目;海报、博客和视频均按相同顺序使用。不要在此处重排或改写;ppt-master 会读取 paper2assets 包并按此顺序制作幻灯片,第 4 步也会从同一来源向 pptx2video 传递旁白。
第 2 步:确定唯一共享的 ppt_trigger
这是此技能中最重要的一步。在调用 ppt-master 之前确定 ppt_trigger,并将完全相同的已确定值传递给 ppt-master 和 pptx2video。绝不要让任一子技能采用各自独立的默认值。
python3 skills/paper2video/scripts/ppt_options_contract.py resolve-ppt-trigger \
--ppt-trigger {auto,on-click,after-previous}
- 用户未表达偏好时,省略
--ppt-trigger或传入auto。这会解析为on-click,因为带有连续1..N动画窗格徽标序列的可下载 PPTX 是适用范围更广的默认交付物,并且无论采用哪种设置,渲染后的 MP4 都会自动播放,无需手动点击(见下文)。 - 用户需要可由演讲者控制、带编号的 PPTX 时,显式传入
on-click。 - 仅当用户明确要求 PPTX 也能在 PowerPoint 中原生自动播放时,才传入
after-previous(而不只是要求“自动播放的视频”——无论此处如何选择,渲染后的 MP4 都会自动播放)。
该命令会打印一个 JSON 对象;将其中每个字段都视为要传递给后续两步的字面值,而非建议:
{
"ppt_trigger": "on-click",
"ppt_master_animation_trigger": "on-click",
"pptx2video_click_group_policy": "normalize"
}
{
"ppt_trigger": "after-previous",
"ppt_master_animation_trigger": "after-previous",
"pptx2video_click_group_policy": "preserve"
}
ppt_master_animation_trigger 是第 3 步中传给 ppt-master 的 --animation-trigger 标志的确切值。pptx2video_click_group_policy 是第 5 步中传给 pptx2video 的 --click-group-policy 标志的确切值。两者均来自同一条命令,因此两个子技能绝不会对用户设定的触发方式产生分歧。记录打印出的 JSON(例如写入 $VIDEO_OUT/assets/meta/ppt_trigger_handoff.json),以便第 6 步审计和任何重试都使用同一个已确定的值。
为什么渲染后的 MP4 无论如何都会自动播放。 pptx2video 的视频调度器会依据原生动画窗格行顺序(effect_order)以及旁白/词语边界时间,将每个进入阶段放入时间轴;它从不参考 PowerPoint 的单击组编号。选择 on-click 只会改变人在 PowerPoint 中打开下载的 PPTX 时看到的效果,不会让 MP4 等待点击。
步骤 3:使用 ppt-master 编写演示文稿,并传入已解析的触发方式
调用已安装的 ppt-master 技能,并遵循其完整工作流:源内容转换、项目初始化/导入、Strategist 确认阶段(字段 a 到 h,必需且不可跳过)、可选的图像获取、逐页依次编写 SVG、运行 svg_quality_checker.py,然后逐条运行由三个命令组成的导出流程(total_md_split.py、finalize_svg.py、svg_to_pptx.py)。
- 不要用手写 SVG、本地简化生成器,或内容并非取自论文的示例演示文稿副本替代 ppt-master。
- 如果 ppt-master 遇到阻塞式确认关卡,且用户尚未批准默认设置,请停止并询问用户。
- 如果缺少机器依赖项,请记录具体缺少的依赖项并停止。不要悄悄改用其他幻灯片生成方法。
- 将
$PAPER_ASSETS/assets/meta/narration.json中的章节(或论文/PDF 内容本身)作为源内容;不要编造论文中没有的论断。
将 ppt-master 的 --animation-trigger 标志设为步骤 2 中 resolve_ppt_trigger_handoff 返回的确切值:
python3 ${SKILL_DIR}/scripts/svg_to_pptx.py <project_path> \
--animation-trigger <ppt_master_animation_trigger from Step 2>
如果演示文稿不应包含任何入场动画(-a none,这是 ppt-master 自带的默认值),则 --animation-trigger 标志无关紧要,可以省略;只有在 -a 请求实际的入场效果时,解析后的值才有用。保留演讲者备注(ppt-master 的默认设置;不要传入 --no-notes),以便步骤 4 将原始备注替换为 pptx2video 的规范化逐元素协议——请参阅下方关于备注格式的说明。
ppt-master 备注并非 pptx2video 的备注协议。 ppt-master 的 markdown_to_plain_text() 会写入纯文本演讲者备注段落,而非 pptx2video 规范的 ## [handle] semantic 块语法。pptx2video 会将普通演讲者备注视为缺少旁白,并回退到通用的逐形状句柄。不要直接渲染带有动画的原始 ppt-master PPTX。步骤 4 会先将页面级旁白引导写入带句柄的备注和替代文本。
在调用 ppt-master 之前,如果存在 paper2assets 包,请先准备标题幻灯片实用素材:
python skills/paper2assets/scripts/fetch_logos.py \
--outdir "$PAPER_ASSETS" --from-spec "$PAPER_ASSETS/assets/meta/paper_spec.md" || true
python skills/paper2assets/scripts/make_qr.py \
--outdir "$PAPER_ASSETS" --from-metadata "$PAPER_ASSETS/assets/meta/metadata.json" || true
如果 paper_spec.md 不可用,则跳过 fetch_logos.py;不要编造徽标。make_qr.py 尽力而为,且只使用 metadata.json 中的 paper_url、code_url 或有文档说明的 arxiv_id 回退值。在发给 ppt-master 的提示词中加入要求,说明这些素材应克制地放置在第 1 张幻灯片上(标题区域右侧或右下方安全区域),并指示 ppt-master 清晰省略不可用的素材,不要留下损坏的占位符。
继续步骤 4 之前,确认导出结果已生成位于 <project_path>/exports/<name>.pptx 的 PPTX 文件。
第 4 步:准备旁白并初始化可编辑协议
根据共享的 narration.json 构建 script.json,明确指定 pptx2video 的旁白来源,不依赖 ppt-master 的原始 Notes 文本:
{
"sections": [
{"id": "problem", "heading": "Problem", "text": "..."},
{"id": "method", "heading": "Method", "text": "..."}
]
}
paper2assets 生成的 assets/meta/narration.json 已采用 {"id", "heading", "text"} 格式;只要其中的章节数与 PPTX 幻灯片数一致,就可以直接用作 bootstrap --script-json 输入。此文件中的章节数必须与第 3 步导出的演示文稿中的幻灯片数相同,且顺序一致;pptx2video 遇到章节数不匹配时会拒绝执行。当 ppt-master 的页数解析结果与 narration.json 中的章节数不同时,请在渲染前协调两者:要么按修正后的页数重新生成演示文稿,要么编辑 script.json 副本,使其章节数和顺序与最终交付的 PPTX 完全一致。不要通过截断或重复章节来强行匹配。
只对普通动画演示文稿执行一次初始化。这会将每张幻灯片的页面级旁白分配到各个动画目标,并写入规范的、通过句柄寻址的 Notes 和 Alt Text:
PPTX2VIDEO_WORK=$(mktemp -d)
PPTX2VIDEO_SOURCE="$PPTX2VIDEO_WORK/video-protocol-source.pptx"
PPTX2VIDEO_TMP="$PPTX2VIDEO_WORK/video-bundle"
python3 -m pptx2video bootstrap \
"<project_path>/exports/<name>.pptx" \
--script-json "$VIDEO_AUDIO/script.json" \
--output "$PPTX2VIDEO_SOURCE"
若初始化退出码非零,则必须阻止后续操作。第 5 步中不要将 $PPTX2VIDEO_SOURCE 替换为 ppt-master 的原始导出文件。
步骤 5:通过 pptx2video 渲染,并传入同一个已解析的触发方式
将已完成引导的 PPTX 渲染到全新的输出目录中。页面级脚本仅作为 --ids-from-script 传入:这样既能保留步骤 4 中编写的逐元素旁白,也能修正每张幻灯片的内部 section_id。
此次渲染不要使用 --script-json;否则会将整张幻灯片的转录文本放到第一个动画元素上,同时清空其他元素。
python3 -m pptx2video render \
"$PPTX2VIDEO_SOURCE" \
"$PPTX2VIDEO_TMP" \
--resolution 1080p \
--ids-from-script "$VIDEO_AUDIO/script.json" \
--animation-order-policy animation-pane \
--click-group-policy <pptx2video_click_group_policy from Step 2> \
--qa-mode strict
--click-group-policy必须使用步骤 2 解析出的确切值(on-click对应normalize,after-previous对应preserve)。切勿省略此标志并依赖 pptx2video 自身的 CLI 默认值;CLI 默认值(normalize)会静默地将特意编写的after-previous级联动画覆盖为点击驱动的演示文稿,这与明确请求after-previous的含义正好相反。--animation-order-policy animation-pane可确保运行完全非交互且结果确定。pptx2video 自身的auto默认值只会在stdin是 TTY 时提示;在非交互式 Agent 会话中,如果实际存在顺序冲突,它会以状态码 3 退出而不进行渲染。显式传入animation-pane,即表示预先确认“信任演示文稿自身的动画窗格顺序”,从而避免实际冲突使运行静默停滞。- 除非用户明确禁用了字幕,否则不要传入
--no-subtitles;默认行为会将字幕烧录到video.mp4中,同时保留video_no_subtitles.mp4和 VTT/SRT 旁附文件。 - 首次渲染时不要传入
--baseline-pptx/--narration-mode regenerate;这些参数用于明确要求重新渲染之前已交付的演示文稿。
不要添加 --no-qa。 顶层 pptx2video render CLI 不支持此参数。QA 始终会运行,并始终写入 assets/meta/reports/video_qa_report.json;--qa-mode 只决定哪些发现会导致渲染失败。在此步骤传入的 strict 模式下,cli.py 自身的 _render() 会在检查器未报告 passed 时抛出 SystemExit,也就是说,任何错误和任何未豁免的警告都会阻止渲染。检查器豁免的代码(目前为 audio_extra_files,即上一次运行遗留的未引用 MP3 文件)仍会显示在报告中,但不会阻止渲染。此处非零退出码表示阻断性失败:修复演示文稿、脚本或标志,然后重新运行这条完全相同的命令;不要放宽 --qa-mode,也不要退回到私有渲染路径来强行输出结果。
成功后,将新生成的资源包移至 <video_outdir>,但不要覆盖来自共享同一资源包根目录的其他 paper2* 技能所创建的现有 manifest.json:
rsync -a --exclude=manifest.json "$PPTX2VIDEO_TMP"/ "$VIDEO_OUT"/
如果 $VIDEO_OUT/manifest.json 已存在(由共享同一资源包根目录的 paper2assets、paper2poster 或 paper2blog 创建),请手动将 $PPTX2VIDEO_TMP/manifest.json 中的视频专属字段合并到其中,而不要直接覆盖;切勿通过盲目复制,抹掉其他 paper2* 技能写入同一个 manifest.json 的字段。否则,按原样复制 pptx2video 的 manifest.json。
第 6 步:根据已确定的触发方式审核最终 PPTX(强制关卡)
这一步补上了旧协议从未检查的环节:证明交付的
video.pptx 的原生 p:timing 树确实包含本技能在第 2 步
确定的触发方式,而不是盲目信任 ppt-master 的标志和
pptx2video 的标志各自都正确生效。
python3 skills/paper2video/scripts/ppt_stage_validator.py audit-final-pptx-trigger \
"$VIDEO_OUT/video.pptx" \
--ppt-trigger <ppt_trigger from Step 2>
on-click要求每个非 With-Previous 原生行都为clickEffect; 这样下载的 PPTX 才会显示连续的1..N动画窗格徽标序列。after-previous要求每个非 With-Previous 原生行(包括保留级联中的 每一行)都为afterEffect;这样 PPTX 才能在 PowerPoint 中原生自动播放。 此选择不声称或要求显示编号窗格。- 如果交付的演示文稿在所有幻灯片上都没有原生
p:timing动画, 审核就会报错;因此,静默丢弃的动画请求会明确失败,而不会因空集而通过。
此处非零退出码属于阻断性失败,与第 5 步中 video_qa_report.json
未通过完全一样:这意味着 ppt-master 的 --animation-trigger
与 pptx2video 的 --click-group-policy 对触发方式的判断不一致,或者其中之一
没有使用第 2 步确定的值,而是回退到了自身默认值。请对照第 2 步打印的
JSON,重新检查第 3 步和第 5 步实际传入的标志,修正偏离的命令,并在报告
视频完成前重新渲染。
第 7 步:报告
告知用户交付文件的绝对路径:
<video_outdir>/video.mp4(已内嵌字幕)<video_outdir>/video_no_subtitles.mp4(paper2reel 源文件)<video_outdir>/video.pptx(可编辑演示文稿,即第 6 步审核所验证的同一文件)<video_outdir>/assets/meta/timeline.json和<video_outdir>/assets/meta/reports/video_qa_report.json
明确说明使用了哪个 ppt_trigger,并确认第 6 步的审核已通过。在第 5 步的
QA 关卡和第 6 步的触发方式审核均已运行并通过之前,不要报告任务已完成。
验收标准
- 当确定并使用
ppt_trigger=on-click时,下载的 PPTX 动画窗格会显示连续的1..N徽标序列。 - 无论使用哪种
ppt_trigger,渲染后的视频都会按照与旁白一致的顺序自动播放每个阶段。 - 当用户明确要求
after-previous时,交付的 PPTX 仍可在 PowerPoint 中原生自动播放,且不声称具有连续的原生编号。 - 对照第 2 步确定的确切
ppt_trigger运行ppt_stage_validator.py audit-final-pptx-trigger,退出码为 0。 pptx2video render自带的 QA 关卡(video_qa_report.json)在--qa-mode strict下报告passed:没有错误,且没有检查器豁免列表之外的警告。
关键规则
- 仅使用一条路线。每次渲染都必须通过
/pptx2video或第 5 步中的确切pptx2video renderCLI 命令;绝不使用私有的pptx2video.<module>导入,也绝不手工制作旁白、时间线或 QA 替代方案。 - 只确定一次触发方式。第 2 步在每次运行中只确定一次
ppt_trigger; 第 3 步和第 5 步都使用同一份已确定的 JSON,绝不使用各自子技能的默认值。 - QA 关卡通过本身并不代表任务完成。
video_qa_report.json通过只能证明 pptx2video 的渲染没有问题;无法证明触发方式交接成功。第 6 步的审核才是 用于证明这一点的检查,并且在报告完成前必须执行。 - 不要静默降级。缺少依赖、ppt-master 确认关卡受阻、QA 报告失败或触发方式审核失败, 都必须停止并修复,绝不能因此交付简化版或未经验证的视频。
工具
scripts/
├── ppt_options_contract.py # resolve-ppt-trigger CLI; also the shared PPT option/appearance contract
└── ppt_stage_validator.py # audit-final-pptx-trigger CLI; also descriptive-option/export-flag audits
通用渲染运行时不由本技能拥有或随附。请安装
pptx2video,并且只能通过 /pptx2video 或
python3 -m pptx2video {doctor,render,bootstrap} 调用它。
参考资料
references/pptx2video.md- 独立渲染器的安装步骤、本技能的 Step 5 命令所依赖的确切 CLI 标志,以及可能导致几乎正确的调用悄然偏离协议的陷阱(PATH、--no-qa并不存在、click-group-policy 默认值)。references/script_json_schema.md- Step 4 传递给bootstrap、Step 5 仅以--ids-from-script传递的script.json架构,包括句柄级别的elements形式和 TTS 文本注意事项。references/ppt_trigger_handoff.md- 深入介绍四概念模型、其背后的原生 OOXML 机制,以及本技能的 Step 2/Step 6 要解决的故障模式。