Skill v1.0.0
currentTrusted Publisher100/100version: "1.0.0" name: demo-video description: 'Assemble ordered frames or clips with narration into a narrated MP4 via FFmpeg' license: MIT compatibility: 'Requires FFmpeg on PATH' metadata: authors: "microsoft/hve-core" spec_version: "1.0" last_updated: "2026-09-23"
Demo Video Assembly Skill
This skill assembles a narrated demo video from ordered visual segments and matching narration audio. It is designed for first-pass walkthrough videos that combine captured prototype frames or clips with per-segment voiceover WAV files.
Overview
The workflow takes a manifest that describes each segment, resolves the visual source, and uses FFmpeg to render each segment into a normalized video clip before concatenating them into a final MP4. The narration track is muxed from WAV files so the output can be reviewed as a polished walkthrough without requiring a separate video-editing tool.
Manifest Schema
Use a segments.yml manifest with optional top-level output settings and an ordered list of segments. Each entry describes a visual source and the narration audio to combine for that portion of the video. All paths resolve relative to the manifest file.
output: ./output/demo.mp4 # optional; destination path for the assembled MP4resolution: 1280x720 # optional; default 1280x720fps: 24 # optional; default 24segments:- type: framevisual: ./frames/intro.pngnarration: ./audio/intro.wavduration: 4.5- type: clipclip: ./clips/interaction.mp4narration: ./audio/interaction.wav
Top-level fields
outputsets the destination path for the assembled MP4, resolved relative to the manifest; the--outputor-OutputPathargument overrides it when suppliedresolutioncontrols the output width and height inWIDTHxHEIGHTform (default1280x720); the--resolutionor-Resolutionargument overrides itfpssets the frame rate applied when rendering each segment (default24); the--fpsor-Fpsargument overrides it
Segment fields
typeidentifies whether the segment is a still image (frame) or a motion clip (clip)visualpoints to an image file for a frame segmentclippoints to a motion clip file for a clip segmentnarrationpoints to the WAV file generated from narration text (the script also acceptsnarration_wavas an alias)durationis optional and overrides the inferred duration when you want a fixed segment length
Quick Start
Use the bash or PowerShell wrappers to invoke the assembler from the skill directory.
scripts/assemble-video.sh --manifest examples/segments.yml --output ./output/demo.mp4
scripts/Invoke-AssembleVideo.ps1 -ManifestPath examples/segments.yml -OutputPath ./output/demo.mp4
Parameters Reference
The assembly step accepts the following high-level controls:
--manifestor-ManifestPathselects the YAML manifest to process--outputor-OutputPathsets the destination MP4 path--fpsor-Fpscontrols the output frame rate for rendered segments--resolutionor-Resolutioncontrols the output width and height in the formWIDTHxHEIGHTdurationper segment lets you override the inferred length when narration timing is known in advance
Narration Quality
Narration quality is the single biggest driver of how polished the final video feels. Prioritize neural voices from Azure AI Speech (part of Azure AI Foundry) through the tts-voiceover skill for any video you intend to share.
- Recommended: Use the
tts-voiceoverskill backed by Azure AI Speech neural voices (for exampleen-US-Andrew:DragonHDLatestNeuraloren-US-Jenny:DragonHDLatestNeural). These produce natural, presentation-grade narration and are the default for shareable output. - Offline alternative: The
tts-voiceoverskill's--engine piperoption synthesizes narration locally with a separately installed Piper executable. It needs no credentials or network access, which suits scheduled CI builds, but it sounds less natural than Azure neural voices. Record which engine produced the narration so reviewers know whether to regenerate it with Azure AI Speech before publishing.
See the tts-voiceover skill for the neural voice catalog, --voice and --rate controls, Azure authentication (Entra ID or key), and Piper setup.
Reuse Bridge
This skill is intentionally designed to fit into the existing media workflow:
tts-voiceoverprovides the narration WAV files that this skill muxes into the final output; prefer its Azure AI Speech neural voices for production-quality narrationvscode-playwrightprovides the frame-capture source for prototype walkthroughs and screen-based demos
Prerequisites
FFmpeg and ffprobe must be available on your PATH.
Linux
sudo apt update && sudo apt install ffmpeg
macOS
brew install ffmpeg
Windows
winget install FFmpeg.FFmpeg