Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,21 @@ npx github:microsoft/ResearchStudio
For usage, see [Idea](ResearchStudio-Idea/#usage) and [Reel](ResearchStudio-Reel/#usage).
We recommend using these skills with model versions $\ge$ `claude-opus-4.6` or `gpt-5.5`.

The PowerPoint renderer is independently maintained at
[`ai-nuts/pptx2video`](https://github.com/ai-nuts/pptx2video). Install its
skill and Python 3.11+ CLI runtime separately from ResearchStudio:

```bash
npx skills add ai-nuts/pptx2video --skill pptx2video
python -m pip install \
'pptx2video[svg] @ git+https://github.com/ai-nuts/pptx2video.git@v0.5.0'
python -m playwright install chromium
pptx2video doctor --svg
```

Then invoke `/pptx2video` in a supporting agent host, or call the public
`pptx2video render` CLI directly.

## License

[MIT](LICENSE)
Expand Down
2 changes: 1 addition & 1 deletion ResearchStudio-Reel/skills/paper2reel/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ double-render text when the user turns on CC.

`timeline.json` must already contain the explicit section mapping. If the deck
uses slide ids instead of canonical poster ids, build the timeline with
`paper2video/scripts/build_timeline.py --section-map ...` first.
`python -m pptx2video.build_timeline --section-map ...` first.

## Required Hard Gate

Expand Down
65 changes: 50 additions & 15 deletions ResearchStudio-Reel/skills/paper2video/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ The production route should use the shared `paper2assets` package whenever it ex

## Output

Written back into the same v2 bundle root, next to `manifest.json` and `assets/`:
Route A writes back into the same v2 bundle root, next to `manifest.json` and
`assets/`:

| File | What it is |
|---|---|
| `video.mp4` | Final H.264/AAC video with burned-in subtitles and a translucent caption background |
| `video.mp4` | Final H.264/AAC video with burned-in subtitles in an appended black bottom band |
| `video_no_subtitles.mp4` | Required raw playback copy for `paper2reel`, so the reel CC toggle does not double-subtitle the video |
| `video.pptx` | Editable deck used to render the video |
| `assets/audio/*.{mp3,json}` | Per-section narration, script JSON, word timings, and TTS manifests |
Expand All @@ -36,9 +37,33 @@ Written back into the same v2 bundle root, next to `manifest.json` and `assets/`
| `assets/meta/` | Timeline, duration reports, visual cues, anchor contracts, and QA reports |

The top level holds only deliverables plus `manifest.json`; everything else lives under `assets/`.
Route B delegates an existing or edited PPTX to the standalone CLI and must use
a fresh output path that does not already exist.

## Usage

Install the two external skills in order, then install and verify the public
`pptx2video` CLI runtime. The runtime requires Python 3.11 or newer:

```bash
npx skills add hugohe3/ppt-master --skill ppt-master
npx skills add ai-nuts/pptx2video --skill pptx2video
python -m pip install \
'pptx2video[svg] @ git+https://github.com/ai-nuts/pptx2video.git@v0.5.0'
python -m playwright install chromium
pptx2video --version
pptx2video doctor --svg
```

For Route B, keep that destination separate from any existing Route A or
paper2assets bundle:

```bash
PPTX2VIDEO_OUT=/absolute/path/to/new-video-bundle
test ! -e "$PPTX2VIDEO_OUT"
pptx2video render <deck.pptx> "$PPTX2VIDEO_OUT" --resolution 1080p
```

From a Claude Code session:

```text
Expand All @@ -47,6 +72,9 @@ From a Claude Code session:

# or start from a raw PDF; the skill resolves the same bundle root first
> /paper2video ./my_paper.pdf

# render an existing or edited deck through the installed standalone skill
> /pptx2video ./edited.pptx
```

The final package is not complete until `video.mp4`, `video_no_subtitles.mp4`, `video.pptx`, `assets/meta/timeline.json`, and the video QA report are all present.
Expand All @@ -58,8 +86,9 @@ The final package is not complete until `video.mp4`, `video_no_subtitles.mp4`, `
3. **Delegate deck generation to ppt-master** — the skill must run the full ppt-master workflow, not a hand-written shortcut deck.
4. **Generate audio** with the shared `paper2poster/scripts/generate_audio.py` synthesizer, preserving one MP3 per script section.
5. **Build visual cue contracts** so important slide regions are anchored to narration chunks.
6. **Render and subtitle** with `render_video.py` and `add_subtitles.py`; the public MP4 may use burned, soft, bottom-bar, or disabled captions while the raw compatibility render remains available to downstream Paper2Reel.
7. **Build timeline metadata** so `paper2reel` can map poster sections, slide thumbnails, subtitles, and video seek times.
6. **Delegate rendering and subtitles** to `python -m pptx2video.render_video` and `python -m pptx2video.add_subtitles`; the public MP4 may use burned, soft, bottom-bar, or disabled captions while the raw compatibility render remains available to downstream Paper2Reel.
7. **Delegate timeline metadata** to `python -m pptx2video.build_timeline` so `paper2reel` can map poster sections, slide thumbnails, subtitles, and video seek times.
8. **Delegate strict media QA** to `python -m pptx2video.check_video_package`.

## Visual attention cues

Expand All @@ -71,30 +100,36 @@ Visual cues are generated from the deck, the script, word-boundary timings, and

Duration is controlled before audio is synthesized. `assets_to_script.py` / `notes_to_script.py` estimate section lengths against the target, `plan_tts_rate.py` checks measured MP4 duration, and large mismatches must be fixed by rewriting the narration rather than by clipping audio or truncating the final video.

## Scripts
## Paper2Video-owned scripts

```
scripts/
├── assets_to_script.py # paper2assets narration -> video script + duration plan
├── notes_to_script.py # ppt-master notes -> video script
├── generate_edge_audio.py # Edge TTS helper with word timings
├── generate_cue_requirements.py # script -> visual anchor contract for ppt-master
├── generate_visual_cues.py # deck/script/timings -> positioned highlight cues
├── inject_pptx_anchors.py # preserve cue anchors inside editable PPTX
├── render_video.py # slides + audio + cues -> raw no-subtitle MP4
├── add_subtitles.py # raw MP4 + captions -> final subtitled MP4
├── build_timeline.py # section timeline for paper2reel
└── check_video_package.py # strict package and media QA gate
└── inject_pptx_anchors.py # preserve cue anchors inside editable PPTX
```

The generic runtime is not owned or vendored by this skill. Install
`pptx2video`, then invoke `python -m pptx2video.generate_edge_audio`,
`python -m pptx2video.render_video`,
`python -m pptx2video.add_subtitles`,
`python -m pptx2video.build_timeline`, and
`python -m pptx2video.check_video_package`.

## Requirements

- Python >= 3.10
- ppt-master skill for the deck and speaker notes
- Python >= 3.11
- Installed `ppt-master` and `pptx2video` skills
- Compatible `pptx2video` 0.5.x CLI runtime from `ai-nuts/pptx2video`, installed
with the `svg` extra
- Playwright Chromium installed with `python -m playwright install chromium`
- A passing `pptx2video doctor --svg` check
- LibreOffice, Poppler, FFmpeg / FFprobe
- Playwright + Chromium for SVG slide-frame rendering
- Playwright + Chrome/Chromium for SVG slide-frame rendering
- Edge TTS by default; Azure TTS is optional

## More detail

[`SKILL.md`](SKILL.md) is the authoritative, agent-facing spec: the full v2 output contract, both supported routes, duration-control loop, visual-cue contract, subtitle requirements, and strict QA gates. The [`references/`](references/) folder documents render details, script JSON, and visual cue semantics.
[`SKILL.md`](SKILL.md) is the authoritative, agent-facing spec: the full v2 output contract, both supported routes, duration-control loop, visual-cue contract, subtitle requirements, and strict QA gates. The [`references/`](references/) folder documents the narration schema, Paper2Video cue generation, and the minimal standalone-runtime bridge.
Loading