executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
story-videoConvert narrated stories (audio + text) into YouTube Shorts videos (9:16 portrait) with synced subtitles, dynamic background images matched to story content, and professional subtitle effects.
Independent GitHub snapshot · Automated classification · Original documentation governs
Convert bedtime stories, narrations, or any spoken content into engaging YouTube Shorts videos with:
# 1. Transcribe audio to get word timing (automatic)
story-video transcribe --audio story.mp3 --output story.json
# 2. Generate video with auto-searched backgrounds
story-video generate \
--audio story.mp3 \
--text "Once upon a time..." \
--title "Bedtime Story" \
--output story.mp4
Output: story.mp4 (9:16 portrait, YouTube Shorts ready)
# Create a config with sections and suggested image searches
story-video generate \
--audio story.mp3 \
--text full_text.txt \
--config story-config.json \
--output story.mp4
story-config.json:
{
"title": "The Snail Designer",
"sections": [
{
"start_time": 0,
"end_time": 15,
"text": "Once upon a time, in the beautiful city of El Paso...",
"search_query": "El Paso desert sunset"
},
{
"start_time": 15,
"end_time": 35,
"text": "...a gentle snail named Snail was a designer.",
"search_query": "3D design workshop creative tools"
}
]
}
{word, start_ms, end_ms} for each word{
"subtitles": {
"font": "Inter",
"size": 48,
"color_current": "#FFD700",
"color_context": "#FFFFFF",
"shadow": true,
"shadow_blur": 8,
"shadow_color": "#000000",
"shadow_offset_y": 3,
"animation_type": "fade_scale",
"animation_duration_ms": 200
}
}
{
"background": {
"source": "unsplash",
"fallback_color": "#1a1a1a",
"zoom_effect": "subtle",
"zoom_speed": 0.3,
"fade_between_sections": true,
"fade_duration_ms": 500
}
}
story-video transcribeGenerate word-level timing from audio.
story-video transcribe --audio input.mp3 --output timing.json
Options:
--audio (required) - Audio file path--output (required) - JSON output with timings--engine (optional) - groq, google, or local (default: groq)Output format:
{
"duration_ms": 45000,
"words": [
{"word": "Once", "start_ms": 0, "end_ms": 250},
{"word": "upon", "start_ms": 250, "end_ms": 450},
...
]
}
story-video generateCreate video from audio + text.
story-video generate \
--audio input.mp3 \
--text "Story text..." \
--output output.mp4
Options:
--audio (required) - MP3/WAV file--text (required) - Full transcript text--output (required) - MP4 output path--config (optional) - JSON config file (sections, styling, etc.)--title (optional) - Video title (for metadata)--subtitle-style (optional) - Preset: minimal, bold, elegant (default: bold)--background-source (optional) - unsplash, pexels, local_dir (default: unsplash)story-video style-presetList available subtitle style presets.
story-video style-preset list
story-video style-preset preview bold
Presets:
The skill auto-generates search queries based on story content:
Example:
Text: "snail named Snail who was a three-dimensional designer"
→ Search: "3D design workshop creative snail"
→ Results: [image1, image2, image3]
→ Select: Best match for this section
ffmpeg - Video composition (brew install ffmpeg)python3 - Image processing (PIL/Pillow)ffmpeg-python
pydub
pillow
requests
# 1. Generate audio (your voice) via ElevenLabs
tts "Once upon a time..." --voice hjX6Urz6dBwVkFdr87DB --output story.mp3
# 2. Convert to video
story-video generate \
--audio story.mp3 \
--text "Once upon a time..." \
--subtitle-style bold \
--background-source unsplash \
--output story-video.mp4
# 3. Upload to YouTube Shorts
# (9:16 format is ready!)
# Create config with specific sections and background queries
cat > config.json << EOF
{
"title": "The Snail",
"sections": [
{
"start_time": 0,
"end_time": 20,
"search_query": "El Paso desert landscape"
},
{
"start_time": 20,
"end_time": 45,
"search_query": "3D design studio workspace"
}
]
}
EOF
# Generate video with custom sections
story-video generate \
--audio narration.mp3 \
--text transcript.txt \
--config config.json \
--output output.mp4
# Generate videos for each story
for story in stories/*.txt; do
audio="${story%.txt}.mp3"
output="videos/$(basename $story .txt).mp4"
story-video generate \
--audio "$audio" \
--text "$story" \
--subtitle-style elegant \
--output "$output"
done
# All ready for YouTube Shorts series
ls -lh videos/*.mp4
Adjust audio speed before generating (use ffmpeg -filter:a "atempo=0.9" to slow down).
Customize search queries in config.json sections[].search_query field.
Switch to --subtitle-style elegant (adds stronger shadow) or use the shadow config option.
Install: brew install ffmpeg