Science Paper Video
Core boundary
Build the audiovisual layer around reviewed scientific content.
REQUIRED SUB-SKILL: Use science-paper-narrator when the input lacks a reviewed article, evidence ledger, or verified high-resolution figure crops.
Treat science-paper-narrator as the only source for paper interpretation, scientific claims, figure extraction, crop manifests, and figure-integrity review. Do not recreate or silently fork those workflows here. This skill owns storyboarding for video, slide composition, local TTS, audio-text alignment, rendering, and media QA.
Text contract
Keep three fields separate:
| Field |
Purpose |
slide_summary |
Short text visible in the slide layout |
narration_display |
Reviewed narration and final subtitle source of truth |
tts_text |
Pronunciation form sent to the local TTS engine |
Allow aliases such as VirTues → Virtues, H&E → H E, and 0.823 → 零点八二三 only in tts_text. Never use free ASR output as final subtitle text.
Workflow
- Validate the narrator bundle. If it is incomplete, invoke
science-paper-narrator; do not implement a fallback paper reader or screenshotter.
- Create
video-project.json following references/input-contract.md. Preserve every scientific qualifier and figure provenance record.
- Compose 16:9 slides from verified crops. Keep plot labels, legends, axes, units, panel letters, statistical marks, and required controls readable at the target resolution.
- Generate one local open-source TTS file per scene. Record the model, voice reference, speed,
tts_text, duration, and file hash.
- Run
scripts/align_subtitles.py with the final audio. Use reviewed narration_display for visible text and tts_text only for timestamp prediction.
- Render PPTX, WAV, SRT/ASS, and MP4 from one timeline. Never estimate subtitle timing from character counts.
- Run
scripts/validate_package.py and the checks in references/qa-criteria.md. Inspect representative frames at original resolution before delivery.
Failure policy
- Stop when figure crops are unverified or too small; return the missing upstream requirement.
- Stop when aligned subtitle text differs from reviewed narration.
- Preserve intermediate slides, audio, alignment JSON, and logs if TTS, alignment, or rendering fails.
- Fall back from word-level to sentence-level alignment only when sentence boundaries come from actual audio segments. Never fall back to proportional character timing.
Deliverables
Return the editable deck, final video, narration audio, SRT/ASS, video-project.json, alignment JSON, provenance manifest, and QA report. Report the exact video resolution, duration, audio format, subtitle cue count, and unresolved subjective checks such as voice preference.
Stable subtitle contract
Treat timing, semantic cue boundaries, and visual line wrapping as separate layers:
- Create one timed cue per reviewed sentence. A two-line subtitle is one cue with a
lines field, not two timed cues.
- Keep technical notation in
narration_display exactly as reviewed: for example AUROC, 0.823, 5.14%, CD4, and VirTues.
- Keep pronunciation aliases and Chinese number readings only in
tts_text. Apply display corrections through an explicit reviewed override map; never globally convert Chinese number words.
- Verify FunASR output against
tts_text at normalized atomic-character level. Accept token merges only when content is identical; reject missing, added, or changed content.
- Map reviewed sentence boundaries to actual aligned-token boundaries. If a boundary falls inside one alignment token, stop for review.
- Add lead/tail padding from each sentence's own speech span. Resolve overlap at the midpoint between adjacent speech spans; never shift later cues cumulatively.
- Wrap long sentences into at most two visual lines, preferring punctuation or whitespace and preserving technical tokens. Use a compact two-line style and a translucent subtitle box for stable contrast.
Run scripts/adapt_narrator_storyboard.py only for legacy narrator bundles. It converts the existing storyboard and TTS manifest into the video input contract; it does not reinterpret the paper or extract figures.
1---2name: science-paper-video3description: Use when turning a verified scientific-paper explanation, narrator content bundle, article, or paper PDF into a narrated PPT-style video with readable paper figures, local open-source TTS, synchronized Chinese subtitles, and editable deliverables.4---56# Science Paper Video78## Core boundary910Build the audiovisual layer around reviewed scientific content.1112**REQUIRED SUB-SKILL:** Use science-paper-narrator when the input lacks a reviewed article, evidence ledger, or verified high-resolution figure crops.1314Treat `science-paper-narrator` as the only source for paper interpretation, scientific claims, figure extraction, crop manifests, and figure-integrity review. Do not recreate or silently fork those workflows here. This skill owns storyboarding for video, slide composition, local TTS, audio-text alignment, rendering, and media QA.1516## Text contract1718Keep three fields separate:1920| Field | Purpose |21|---|---|22| `slide_summary` | Short text visible in the slide layout |23| `narration_display` | Reviewed narration and final subtitle source of truth |24| `tts_text` | Pronunciation form sent to the local TTS engine |2526Allow aliases such as `VirTues` → `Virtues`, `H&E` → `H E`, and `0.823` → `零点八二三` only in `tts_text`. Never use free ASR output as final subtitle text.2728## Workflow29301. Validate the narrator bundle. If it is incomplete, invoke `science-paper-narrator`; do not implement a fallback paper reader or screenshotter.312. Create `video-project.json` following [references/input-contract.md](references/input-contract.md). Preserve every scientific qualifier and figure provenance record.323. Compose 16:9 slides from verified crops. Keep plot labels, legends, axes, units, panel letters, statistical marks, and required controls readable at the target resolution.334. Generate one local open-source TTS file per scene. Record the model, voice reference, speed, `tts_text`, duration, and file hash.345. Run `scripts/align_subtitles.py` with the final audio. Use reviewed `narration_display` for visible text and `tts_text` only for timestamp prediction.356. Render PPTX, WAV, SRT/ASS, and MP4 from one timeline. Never estimate subtitle timing from character counts.367. Run `scripts/validate_package.py` and the checks in [references/qa-criteria.md](references/qa-criteria.md). Inspect representative frames at original resolution before delivery.3738## Failure policy3940- Stop when figure crops are unverified or too small; return the missing upstream requirement.41- Stop when aligned subtitle text differs from reviewed narration.42- Preserve intermediate slides, audio, alignment JSON, and logs if TTS, alignment, or rendering fails.43- Fall back from word-level to sentence-level alignment only when sentence boundaries come from actual audio segments. Never fall back to proportional character timing.4445## Deliverables4647Return the editable deck, final video, narration audio, SRT/ASS, `video-project.json`, alignment JSON, provenance manifest, and QA report. Report the exact video resolution, duration, audio format, subtitle cue count, and unresolved subjective checks such as voice preference.48## Stable subtitle contract4950Treat timing, semantic cue boundaries, and visual line wrapping as separate layers:51521. Create one timed cue per reviewed sentence. A two-line subtitle is one cue with a `lines` field, not two timed cues.532. Keep technical notation in `narration_display` exactly as reviewed: for example `AUROC`, `0.823`, `5.14%`, `CD4`, and `VirTues`.543. Keep pronunciation aliases and Chinese number readings only in `tts_text`. Apply display corrections through an explicit reviewed override map; never globally convert Chinese number words.554. Verify FunASR output against `tts_text` at normalized atomic-character level. Accept token merges only when content is identical; reject missing, added, or changed content.565. Map reviewed sentence boundaries to actual aligned-token boundaries. If a boundary falls inside one alignment token, stop for review.576. Add lead/tail padding from each sentence's own speech span. Resolve overlap at the midpoint between adjacent speech spans; never shift later cues cumulatively.587. Wrap long sentences into at most two visual lines, preferring punctuation or whitespace and preserving technical tokens. Use a compact two-line style and a translucent subtitle box for stable contrast.5960Run `scripts/adapt_narrator_storyboard.py` only for legacy narrator bundles. It converts the existing storyboard and TTS manifest into the video input contract; it does not reinterpret the paper or extract figures.