
Ai Video Gen
- 132 installs
- 638 repo stars
- Updated March 7, 2026
- sundial-org/awesome-openclaw-skills
Use ai-video-gen for development tasks
About
ai-video-gen: A skill for development. This provides functionality for development workflows.
- ai-video-gen
Ai Video Gen by the numbers
- 132 all-time installs (skills.sh)
- +2 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #2,716 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/sundial-org/awesome-openclaw-skills --skill ai-video-genAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 132 |
|---|---|
| repo stars | ★ 638 |
| Last updated | March 7, 2026 |
| Repository | sundial-org/awesome-openclaw-skills ↗ |
What it does
Use ai-video-gen for development tasks
Files
AI Video Generation Skill
Generate complete videos from text descriptions using AI.
Capabilities
1. Image Generation - DALL-E 3, Stable Diffusion, Flux 2. Video Generation - LumaAI, Runway, Replicate models 3. Voice-over - OpenAI TTS, ElevenLabs 4. Video Editing - FFmpeg assembly, transitions, overlays
Quick Start
# Generate a complete video
python skills/ai-video-gen/generate_video.py --prompt "A sunset over mountains" --output sunset.mp4
# Just images to video
python skills/ai-video-gen/images_to_video.py --images img1.png img2.png --output result.mp4
# Add voiceover
python skills/ai-video-gen/add_voiceover.py --video input.mp4 --text "Your narration" --output final.mp4Setup
Required API Keys
Add to your environment or .env file:
# Image Generation (pick one)
OPENAI_API_KEY=sk-... # DALL-E 3
REPLICATE_API_TOKEN=r8_... # Stable Diffusion, Flux
# Video Generation (pick one)
LUMAAI_API_KEY=luma_... # LumaAI Dream Machine
RUNWAY_API_KEY=... # Runway ML
REPLICATE_API_TOKEN=r8_... # Multiple models
# Voice (optional)
OPENAI_API_KEY=sk-... # OpenAI TTS
ELEVENLABS_API_KEY=... # ElevenLabs
# Or use FREE local options (no API needed)Install Dependencies
pip install openai requests pillow replicate python-dotenvFFmpeg
Already installed via winget.
Usage Examples
1. Text to Video (Full Pipeline)
python skills/ai-video-gen/generate_video.py \
--prompt "A futuristic city at night with flying cars" \
--duration 5 \
--voiceover "Welcome to the future" \
--output future_city.mp42. Multiple Scenes
python skills/ai-video-gen/multi_scene.py \
--scenes "Morning sunrise" "Busy city street" "Peaceful night" \
--duration 3 \
--output day_in_life.mp43. Image Sequence to Video
python skills/ai-video-gen/images_to_video.py \
--images frame1.png frame2.png frame3.png \
--fps 24 \
--output animation.mp4Workflow Options
Budget Mode (FREE)
- Image: Stable Diffusion (local or free API)
- Video: Open source models
- Voice: OpenAI TTS (cheap) or free TTS
- Edit: FFmpeg
Quality Mode (Paid)
- Image: DALL-E 3 or Midjourney
- Video: Runway Gen-3 or LumaAI
- Voice: ElevenLabs
- Edit: FFmpeg + effects
Scripts Reference
generate_video.py- Main end-to-end generatorimages_to_video.py- Convert image sequence to videoadd_voiceover.py- Add narration to existing videomulti_scene.py- Create multi-scene videosedit_video.py- Apply effects, transitions, overlays
API Cost Estimates
- DALL-E 3: ~$0.04-0.08 per image
- Replicate: ~$0.01-0.10 per generation
- LumaAI: $0-0.50 per 5sec (free tier available)
- Runway: ~$0.05 per second
- OpenAI TTS: ~$0.015 per 1K characters
- ElevenLabs: ~$0.30 per 1K characters (better quality)
Examples
See examples/ folder for sample outputs and prompts.
#!/usr/bin/env python3
"""
Add voiceover to existing video
"""
import argparse
import subprocess
import sys
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
def generate_audio(text, voice="alloy", output_path="voiceover.mp3"):
"""Generate audio using OpenAI TTS"""
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
if not OPENAI_API_KEY:
print("❌ Error: OPENAI_API_KEY not set")
sys.exit(1)
import openai
client = openai.OpenAI(api_key=OPENAI_API_KEY)
print(f"🎤 Generating voiceover...")
response = client.audio.speech.create(
model="tts-1",
voice=voice,
input=text
)
response.stream_to_file(output_path)
print(f"✓ Audio saved: {output_path}")
return output_path
def add_audio_to_video(video_path, audio_path, output_path, mix_audio=False):
"""Combine video with audio using FFmpeg"""
print(f"🎞️ Adding audio to video...")
if mix_audio:
# Mix new audio with existing audio
cmd = [
'ffmpeg', '-y',
'-i', video_path,
'-i', audio_path,
'-filter_complex', '[0:a][1:a]amix=inputs=2:duration=longest',
'-c:v', 'copy',
output_path
]
else:
# Replace audio
cmd = [
'ffmpeg', '-y',
'-i', video_path,
'-i', audio_path,
'-c:v', 'copy',
'-c:a', 'aac',
'-map', '0:v:0',
'-map', '1:a:0',
'-shortest',
output_path
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
print(f"✅ Video with audio created: {output_path}")
return output_path
except subprocess.CalledProcessError as e:
print(f"❌ FFmpeg error: {e.stderr}")
sys.exit(1)
def main():
parser = argparse.ArgumentParser(description='Add voiceover to video')
parser.add_argument('--video', required=True, help='Input video file')
parser.add_argument('--text', help='Text for voiceover')
parser.add_argument('--audio', help='Pre-existing audio file (alternative to --text)')
parser.add_argument('--output', default='output_with_audio.mp4', help='Output video file')
parser.add_argument('--voice', default='alloy',
choices=['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'],
help='OpenAI TTS voice')
parser.add_argument('--mix', action='store_true',
help='Mix with existing audio instead of replacing')
args = parser.parse_args()
# Validate video exists
if not Path(args.video).exists():
print(f"❌ Error: Video not found: {args.video}")
sys.exit(1)
# Get or generate audio
if args.audio:
if not Path(args.audio).exists():
print(f"❌ Error: Audio file not found: {args.audio}")
sys.exit(1)
audio_path = args.audio
elif args.text:
audio_path = generate_audio(args.text, args.voice)
else:
print("❌ Error: Must provide either --text or --audio")
sys.exit(1)
# Combine video and audio
add_audio_to_video(args.video, audio_path, args.output, args.mix)
# Clean up temp audio if we generated it
if args.text and not args.audio:
Path(audio_path).unlink(missing_ok=True)
if __name__ == '__main__':
main()
#!/usr/bin/env python3
"""
AI Video Generator - End-to-end video creation from text prompts
Supports: OpenAI DALL-E, Replicate, LumaAI, Runway, FFmpeg
"""
import os
import sys
import argparse
import json
import time
import requests
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
# API clients
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
REPLICATE_API_TOKEN = os.getenv('REPLICATE_API_TOKEN')
LUMAAI_API_KEY = os.getenv('LUMAAI_API_KEY')
RUNWAY_API_KEY = os.getenv('RUNWAY_API_KEY')
ELEVENLABS_API_KEY = os.getenv('ELEVENLABS_API_KEY')
class VideoGenerator:
def __init__(self, output_dir='output'):
self.output_dir = Path(output_dir)
self.output_dir.mkdir(exist_ok=True)
def generate_image_openai(self, prompt, size="1024x1024"):
"""Generate image using DALL-E 3"""
if not OPENAI_API_KEY:
raise ValueError("OPENAI_API_KEY not set")
import openai
client = openai.OpenAI(api_key=OPENAI_API_KEY)
print(f"🎨 Generating image with DALL-E 3: {prompt[:50]}...")
response = client.images.generate(
model="dall-e-3",
prompt=prompt,
size=size,
quality="standard",
n=1,
)
image_url = response.data[0].url
# Download image
img_path = self.output_dir / f"image_{int(time.time())}.png"
img_data = requests.get(image_url).content
with open(img_path, 'wb') as f:
f.write(img_data)
print(f"✓ Image saved: {img_path}")
return str(img_path)
def generate_image_replicate(self, prompt, model="stability-ai/sdxl"):
"""Generate image using Replicate (Stable Diffusion, Flux, etc.)"""
if not REPLICATE_API_TOKEN:
raise ValueError("REPLICATE_API_TOKEN not set")
import replicate
print(f"🎨 Generating image with {model}: {prompt[:50]}...")
output = replicate.run(
model,
input={"prompt": prompt}
)
# Download image
img_path = self.output_dir / f"image_{int(time.time())}.png"
if isinstance(output, list):
img_data = requests.get(output[0]).content
else:
img_data = requests.get(output).content
with open(img_path, 'wb') as f:
f.write(img_data)
print(f"✓ Image saved: {img_path}")
return str(img_path)
def image_to_video_luma(self, image_path, prompt=None):
"""Convert image to video using LumaAI"""
if not LUMAAI_API_KEY:
raise ValueError("LUMAAI_API_KEY not set")
print(f"🎬 Creating video from image with LumaAI...")
headers = {
"Authorization": f"Bearer {LUMAAI_API_KEY}",
"Content-Type": "application/json"
}
# Upload image and create video
# This is a placeholder - actual LumaAI API structure may vary
data = {
"image": image_path,
"prompt": prompt or "animate this image"
}
response = requests.post(
"https://api.lumalabs.ai/dream-machine/v1/generations",
headers=headers,
json=data
)
if response.status_code != 200:
raise Exception(f"LumaAI API error: {response.text}")
generation_id = response.json()['id']
# Poll for completion
while True:
status = requests.get(
f"https://api.lumalabs.ai/dream-machine/v1/generations/{generation_id}",
headers=headers
).json()
if status['state'] == 'completed':
video_url = status['video']['url']
break
elif status['state'] == 'failed':
raise Exception(f"Video generation failed: {status}")
print("⏳ Waiting for video generation...")
time.sleep(5)
# Download video
video_path = self.output_dir / f"video_{int(time.time())}.mp4"
video_data = requests.get(video_url).content
with open(video_path, 'wb') as f:
f.write(video_data)
print(f"✓ Video saved: {video_path}")
return str(video_path)
def add_audio_openai(self, text, voice="alloy"):
"""Generate audio using OpenAI TTS"""
if not OPENAI_API_KEY:
raise ValueError("OPENAI_API_KEY not set")
import openai
client = openai.OpenAI(api_key=OPENAI_API_KEY)
print(f"🎤 Generating voiceover: {text[:50]}...")
response = client.audio.speech.create(
model="tts-1",
voice=voice,
input=text
)
audio_path = self.output_dir / f"audio_{int(time.time())}.mp3"
response.stream_to_file(str(audio_path))
print(f"✓ Audio saved: {audio_path}")
return str(audio_path)
def combine_video_audio(self, video_path, audio_path, output_path):
"""Combine video and audio using FFmpeg"""
import subprocess
print(f"🎞️ Combining video and audio...")
cmd = [
'ffmpeg', '-y',
'-i', video_path,
'-i', audio_path,
'-c:v', 'copy',
'-c:a', 'aac',
'-shortest',
output_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise Exception(f"FFmpeg error: {result.stderr}")
print(f"✓ Final video saved: {output_path}")
return output_path
def main():
parser = argparse.ArgumentParser(description='Generate AI videos from text prompts')
parser.add_argument('--prompt', required=True, help='Text prompt for video generation')
parser.add_argument('--voiceover', help='Text for voiceover narration')
parser.add_argument('--output', default='output.mp4', help='Output video file')
parser.add_argument('--image-model', choices=['dalle', 'replicate'], default='dalle', help='Image generation model')
parser.add_argument('--video-model', choices=['luma', 'runway'], default='luma', help='Video generation model')
parser.add_argument('--voice', default='alloy', help='Voice for TTS (alloy, echo, fable, onyx, nova, shimmer)')
args = parser.parse_args()
try:
generator = VideoGenerator()
# Step 1: Generate image
if args.image_model == 'dalle':
image_path = generator.generate_image_openai(args.prompt)
else:
image_path = generator.generate_image_replicate(args.prompt)
# Step 2: Convert to video
if args.video_model == 'luma':
video_path = generator.image_to_video_luma(image_path, args.prompt)
else:
print("⚠️ Runway support coming soon. Using Luma for now.")
video_path = generator.image_to_video_luma(image_path, args.prompt)
# Step 3: Add voiceover if requested
if args.voiceover:
audio_path = generator.add_audio_openai(args.voiceover, args.voice)
final_path = generator.combine_video_audio(video_path, audio_path, args.output)
else:
# Just rename/move the video
os.rename(video_path, args.output)
final_path = args.output
print(f"\n✅ SUCCESS! Video created: {final_path}")
except Exception as e:
print(f"\n❌ ERROR: {str(e)}")
sys.exit(1)
if __name__ == '__main__':
main()
#!/usr/bin/env python3
"""
Convert image sequence to video using FFmpeg
"""
import argparse
import subprocess
import sys
from pathlib import Path
def images_to_video(image_files, output_path, fps=24, quality='high'):
"""Convert list of images to video"""
# Quality presets
crf_values = {
'low': 28,
'medium': 23,
'high': 18,
'ultra': 15
}
crf = crf_values.get(quality, 18)
print(f"🎬 Creating video from {len(image_files)} images at {fps} fps...")
# Create temporary file list
file_list_path = Path('filelist.txt')
with open(file_list_path, 'w') as f:
for img in image_files:
duration = 1.0 / fps
f.write(f"file '{Path(img).absolute()}'\n")
f.write(f"duration {duration}\n")
# FFmpeg command
cmd = [
'ffmpeg', '-y',
'-f', 'concat',
'-safe', '0',
'-i', str(file_list_path),
'-vsync', 'vfr',
'-pix_fmt', 'yuv420p',
'-crf', str(crf),
output_path
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
print(f"✅ Video created: {output_path}")
return output_path
except subprocess.CalledProcessError as e:
print(f"❌ FFmpeg error: {e.stderr}")
sys.exit(1)
finally:
# Clean up temp file
if file_list_path.exists():
file_list_path.unlink()
def main():
parser = argparse.ArgumentParser(description='Convert images to video')
parser.add_argument('--images', nargs='+', required=True, help='Input image files')
parser.add_argument('--output', default='output.mp4', help='Output video file')
parser.add_argument('--fps', type=int, default=24, help='Frames per second')
parser.add_argument('--quality', choices=['low', 'medium', 'high', 'ultra'],
default='high', help='Output quality')
args = parser.parse_args()
# Validate images exist
for img in args.images:
if not Path(img).exists():
print(f"❌ Error: Image not found: {img}")
sys.exit(1)
images_to_video(args.images, args.output, args.fps, args.quality)
if __name__ == '__main__':
main()
Quick Start - Get Your First Video in 5 Minutes
Step 1: Get OpenAI API Key (Required)
1. Go to https://platform.openai.com/api-keys 2. Sign up / Log in 3. Click "Create new secret key" 4. Copy the key (starts with sk-)
Cost: You'll need ~$5 credit. First video costs ~$0.10
Step 2: Get LumaAI Key (Optional but Recommended)
1. Go to https://lumalabs.ai 2. Sign up (has free tier!) 3. Get API key from dashboard
Cost: FREE for first 30 videos/month
Step 3: Configure
Create .env file:
cd skills/ai-video-gen
copy .env.example .envEdit .env and add:
OPENAI_API_KEY=sk-your-actual-key-here
LUMAAI_API_KEY=luma_your-actual-key-hereStep 4: Generate Video!
python generate_video.py --prompt "A peaceful forest with sunlight filtering through trees" --output forest.mp4With narration:
python generate_video.py \
--prompt "A robot walking through a futuristic city" \
--voiceover "In the year 2050, robots walk among us" \
--output robot.mp4What Happens
1. 🎨 Generates image from your prompt (DALL-E 3) 2. 🎬 Converts image to 5-second video (LumaAI) 3. 🎤 Creates voiceover if requested (OpenAI TTS) 4. ✅ Combines everything into final MP4
Time: 30-60 seconds per video Cost: $0.05-0.15 per video
Without LumaAI Key
If you don't have LumaAI yet, you can still:
Create image + audio:
python generate_video.py --prompt "sunset" --output sunset.mp4
# (Will fail at video step, but you'll have the image!)Convert images to video:
python images_to_video.py --images img1.png img2.png img3.png --output result.mp4Next Steps
- Try different prompts
- Experiment with voices (alloy, echo, fable, onyx, nova, shimmer)
- Create longer videos by chaining scenes
- Add music and effects
Need help? Check README.md for full docs!
AI Video Generator
Complete end-to-end AI video creation system.
✅ Installation Status
- [x] FFmpeg installed
- [x] Python 3.11.9 available
- [ ] Python dependencies (run
setup.bat) - [ ] API keys configured
Quick Start
1. Install Dependencies
cd skills/ai-video-gen
pip install -r requirements.txtOr run setup.bat
2. Configure API Keys
Copy .env.example to .env and add your keys:
copy .env.example .env
notepad .envMinimum required:
OPENAI_API_KEY- For both image (DALL-E) and voice (TTS)
Optional but recommended:
LUMAAI_API_KEY- For video generation (has free tier!)REPLICATE_API_TOKEN- Alternative for images/video
3. Generate Your First Video
python generate_video.py --prompt "A serene mountain landscape at sunset" --output test.mp4With voiceover:
python generate_video.py \
--prompt "A futuristic city with flying cars" \
--voiceover "Welcome to the future" \
--output future.mp4What You Need to Sign Up For
Free/Cheap Options (Start Here)
1. OpenAI - https://platform.openai.com
- Get API key for DALL-E + TTS
- Cost: ~$0.05-0.10 per video (image + voice)
2. LumaAI - https://lumalabs.ai
- Free tier: 30 generations/month
- Then $1-2 per video
Total cost to start: $0-0.15 per video
Premium Options (Better Quality)
3. Runway - https://runwayml.com
- Higher quality video generation
- ~$0.50-1.00 per 5-second video
4. ElevenLabs - https://elevenlabs.io
- Best voice quality
- ~$0.30 per 1K characters
5. Replicate - https://replicate.com
- Multiple AI models
- Pay-per-use, very cheap
Examples
Simple Video
python generate_video.py --prompt "Ocean waves crashing" --output waves.mp4Multi-Image to Video
python images_to_video.py --images img1.png img2.png img3.png --output slideshow.mp4Add Narration to Existing Video
python add_voiceover.py --video input.mp4 --text "Your narration here" --output final.mp4Workflow
Text Prompt → DALL-E Image → LumaAI Video → + Voiceover → Final MP4All automated in one command!
Cost Calculator
Budget Video (5 seconds):
- Image (DALL-E): $0.04
- Video (LumaAI free): $0
- Voice (OpenAI TTS): $0.01
- Total: $0.05
Quality Video (5 seconds):
- Image (DALL-E): $0.08
- Video (Runway): $0.50
- Voice (ElevenLabs): $0.30
- Total: $0.88
Troubleshooting
FFmpeg not found
Restart your terminal after installation, or add to PATH manually.
API Key errors
Make sure .env file exists and has valid keys (no quotes needed).
Python module errors
Run pip install -r requirements.txt
What's Next
The scripts are modular - you can:
- Use just image generation
- Use just video assembly from images
- Add effects and transitions
- Batch process multiple videos
- Create longer videos with scene transitions
Need help? Check the examples or ask!
openai>=1.0.0
replicate>=0.20.0
requests>=2.31.0
pillow>=10.0.0
python-dotenv>=1.0.0