# PPT 逐元素讲解

> 16:9 把现成的 .pptx 变成带解说的视频。每页一个场景，页面元素按「拍」随旁白逐个出现，画面从原稿一比一还原，旁白优先用 PPT 备注页。

Source: https://www.remixmate.ai/learn/templates/ppt-to-video · Updated: 2026-09-30

## 什么时候选它

你**已经有一份 PPT**：课程讲义、方案汇报、培训材料，想把它变成可以发出去的讲解视频，而不是重新做一遍。

画面不用你描述：形状、文本、图标、坐标、配色都由渲染管线直接从 .pptx 里抽取并还原。你只需要提供文件，确认旁白。

## 规格

| 项 | 值 |
|----|----|
| 画幅 | 16:9（只有横屏，1920×1080） |
| 时长 | 5–600 秒 |
| 内容语言 | 中文、英文 |
| 场景结构 | **一页 PPT = 一个场景**，最多 120 个场景 |
| 旁白 | 需要（音频）；每一拍对齐一句旁白 |
| 字幕 | 默认开 |
| 需要的素材 | .pptx 源文件 URL + 旁白音频 |

## 旁白从哪来

1. **优先用 PPT 的备注页**。它本来就是「说给人听的话」，agent 只做重排和口语化：切成与拍数对齐的句子，去掉「如图所示」「（翻页）」这类现场指代，不加原稿没有的事实。
2. **备注为空时**，从页面正文扩写。原则是讲要点背后的意思，不是把屏幕上的字再念一遍。这部分旁白是 agent 写的，会请你过目。

## 每页怎么动

抽取时会为每一页判定一个档位，判定理由写在 `slide.modeReason`：

- **static**：整页第 0 帧就位，不做逐元素动画，和原稿一致。判不出结构时就用它。
- **spotlight**：整页就位，随旁白提亮当前块、压暗其余，只改透明度不动位置。
- **sequenced**：按块逐个入场。

原则是「宁愿不动，也不能错」。元素只增不减、已有内容永不移动。

## 关键参数

`customPayload.slide`（元素清单与时间轴）由管线自动填入，**不需要也不应该手写**。你能调的是下面这些。

| 参数 | 位置 | 类型 / 取值 | 默认 | 说明 |
|------|------|-------------|------|------|
| `source_document_url` | gen-script 参数（CLI `--source-document-url`） | .pptx 的 URL | — | **必传**，与给 doc-parse 的是同一个 URL。管线据此抽取每页画面 |
| `scenes` | gen-script 参数（CLI `--scenes`） | 整数，上限 120 | — | 传 PPT 页数 |
| `slideIndex` | `customPayload.slideIndex` | 整数，1-based | 按场景顺序取第 i 页 | 只讲其中几页、跳过某几页时才写 |
| `mode` | `customPayload.mode` | `static` / `spotlight` / `sequenced` | 用抽取判定 | 只能把判定**往下压**（sequenced → spotlight → static），不能往上抬 |
| `trustMeMode` | `customPayload.trustMeMode` | 布尔 | false | 允许 `mode` 越过判定往上抬。只在人工核对过这一页重绘无误时用 |
| `defaultAnim` | `customPayload.defaultAnim` | `fade` / `up` / `down` / `left` / `right` / `scale` / `grow-x` / `grow-y` | `up` | 全局默认入场动画。细长条自动走 grow-x / grow-y |
| `revealDurationSec` | `customPayload.revealDurationSec` | 秒 | 0.45 | 单个元素的入场动画时长 |
| `minBeatHoldSec` | `customPayload.minBeatHoldSec` | 秒 | 1.2 | 每拍最短停留，只影响推荐时长，不会把后面的拍往后推 |
| `tailPadSec` | `customPayload.tailPadSec` | 秒 | 0.6 | 旁白结束后的静音尾巴 |
| `showSubtitles` | `customPayload.showSubtitles` | 布尔 | true | 底部字幕条 |
| `fontFit` | `customPayload.fontFit` | `shrink` / `overflow` | `shrink` | 单行文字超框时等比缩字号塞回去，还是任其溢出。渲染环境装了原稿字体时应切 `overflow` |
| `slide.beats[].atSec` | `customPayload.slide.beats` | 秒 | 对齐第 i 句旁白起点 | 显式起始秒，一般不用写 |

## 什么时候别选它

- **手上没有 PPT，要从零讲一个概念** → [知识看板](/learn/templates/html-slide)，版式是现成的。
- **想要课堂板书风格** → [黑板粉笔](/learn/templates/html-slide-blackboard)。
- **要竖屏** → 只有 16:9。
- **想重新设计画面**。本模板忠实还原原稿，不改版式。

## 常见坑 {#pitfalls}

- **没传源文件 URL**。漏了 `--source-document-url`，要到写完全部旁白、准备素材时才会被整份拒绝。
- **场景数没对上页数**。用 doc-parse 摘要里的页数传 `--scenes`，生成后以 DSL 里实际的场景数为准。
- **旁白句数和拍数对不上**。句数少于拍数时，剩下的拍会在末尾均分，能跑但节奏会散。
- **自己给 mode 往上抬**。不写 `trustMeMode` 不生效；写了又没人工核对，可能出现画面错位。
- **时长自己拍一个数**。每页时长要同时满足「旁白说得完」和「每拍看得清」，让管线按估算器排。
- **旁白把屏幕上的字原样念一遍**。画面文字、字幕、语音三重重复，观感很差。
- **备注里混着出处、TODO、提醒**。这些不是讲稿，确认旁白时留意是否已被剔掉。
