AI-powered social video automation tool for generating vertical short-form marketing videos with TTS, subtitles, and stock footage
Project description
Video Composer
AI-powered social video automation tool for generating vertical short-form marketing videos for TikTok, YouTube Shorts, and Instagram Reels.
Features
- AI-Powered Voiceover: Generate natural-sounding voiceovers using OpenAI TTS (text-to-speech) with multiple voice options
- Word-Level Transcription: Accurate transcription with word-level timestamps using OpenAI Whisper
- AI Video Validation: Validate stock footage relevance using GPT-4 Vision
- Multiple Stock Providers: Fetch relevant vertical videos from Pexels or Pixabay based on keywords
- Karaoke-Style Subtitles: Animated subtitles with word-by-word highlighting in ASS format
- 9:16 Aspect Ratio: Optimized for TikTok, YouTube Shorts, and Instagram Reels
- YAML Configuration: Define videos in YAML for batch processing
- Rich CLI: Beautiful command-line interface with progress indicators
Installation
pip install video-composer
Requirements
- Python 3.11 or higher
- FFmpeg (must be installed and available in PATH)
Installing FFmpeg
macOS:
brew install ffmpeg
Ubuntu/Debian:
sudo apt update && sudo apt install ffmpeg
Windows: Download from ffmpeg.org or use:
choco install ffmpeg
Quick Start
1. Set Up API Keys
Create a .env file in your project directory:
# Required
OPENAI_API_KEY=sk-your-openai-api-key
# Stock footage provider (choose one or both)
PEXELS_API_KEY=your-pexels-api-key
PIXABAY_API_KEY=your-pixabay-api-key
# Optional: Set preferred provider (default: pexels)
STOCK_PROVIDER=pexels # or "pixabay"
Get your API keys:
- OpenAI: https://platform.openai.com/api-keys
- Pexels: https://www.pexels.com/api/
- Pixabay: https://pixabay.com/api/docs/
2. Create Your First Video
video-composer create \
--script "Welcome to the future of content creation. AI makes everything possible." \
--keyword technology \
--keyword innovation \
--keyword future
CLI Commands
Create a Video
video-composer create \
--script "Your marketing script here" \
--keyword keyword1 \
--keyword keyword2 \
--output my_video \
--verbose
Options:
-s, --script: The marketing script text to convert to video (required)-k, --keyword: Keywords for stock footage (can specify multiple, required)-o, --output: Output filename without extension (optional)-c, --context: Additional context for video validation (optional)--subtitle-font: Subtitle font family (optional)--subtitle-font-size: Subtitle font size (optional)--subtitle-primary-color: Subtitle primary color (#RRGGBBor ASS) (optional)--subtitle-highlight-color: Subtitle highlight color (#RRGGBBor ASS) (optional)--subtitle-outline-color: Subtitle outline color (#RRGGBBor ASS) (optional)--subtitle-outline-width: Subtitle outline width (optional)--subtitle-shadow-depth: Subtitle shadow depth (optional)--subtitle-position: Subtitle position (top,center,bottom) (optional)--subtitle-margin: Subtitle bottom margin in pixels (optional)--subtitle-words-per-line: Maximum words per subtitle line (optional)--subtitles-enabled/--no-subtitles: Enable or disable subtitle rendering (optional)--keep-temp: Keep temporary files after processing-v, --verbose: Enable verbose logging
Generate from YAML Configuration
# Create a sample configuration
video-composer init-config
# Or create a batch configuration
video-composer init-config --batch -o batch_videos.yaml
# Generate videos from configuration
video-composer from-yaml videos.yaml
Text-to-Speech Only
video-composer tts --script "Hello world" --output speech.mp3
Transcribe Audio
video-composer transcribe --audio input.mp3 --output transcription.json
Search Stock Footage
video-composer search-footage --keyword nature --keyword sunset --output-dir ./footage
View Configuration
video-composer config
Version Information
video-composer version
YAML Configuration
Video Composer supports YAML configuration files for defining videos. This is ideal for batch processing or reproducible video generation.
Subtitle colors support hex values (#RRGGBB) or ASS color strings (&H00BBGGRR).
Single Video Configuration
script: |
Every successful person started exactly where you are right now.
The difference? They didn't give up.
Your dreams are valid. Your goals are achievable.
keywords:
- sunrise motivation
- person working hard
- success celebration
voice:
model: tts-1-hd
voice: nova
speed: 1.0
subtitles:
enabled: true
font: Arial
font_size: 48
primary_color: "#FFFFFF"
highlight_color: "#FFFF00"
outline_color: "#000000"
outline_width: 3
shadow_depth: 2
position: bottom
margin: 150
words_per_line: 4
video:
width: 1080
height: 1920
fps: 30
output_filename: motivation_video
output_dir: ./output
Batch Video Configuration
version: "1.0"
# Global defaults
voice:
model: tts-1-hd
voice: nova
subtitles:
enabled: true
font: Arial
font_size: 48
primary_color: "#FFFFFF"
highlight_color: "#FFFF00"
outline_color: "#000000"
outline_width: 3
shadow_depth: 2
position: bottom
margin: 150
words_per_line: 4
output_dir: ./output
# Multiple videos
videos:
- name: motivation_monday
script: "Start your week with purpose..."
keywords:
- sunrise
- motivation
- name: tech_tips
script: "Three tips to boost productivity..."
keywords:
- technology
- workspace
voice:
voice: onyx # Override default voice
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
OPENAI_API_KEY |
Yes | - | OpenAI API key for TTS and Whisper |
PEXELS_API_KEY |
Conditional | - | Pexels API key (required if using Pexels) |
PIXABAY_API_KEY |
Conditional | - | Pixabay API key (required if using Pixabay) |
STOCK_PROVIDER |
No | pexels | Stock footage provider (pexels or pixabay) |
VIDEO_WIDTH |
No | 1080 | Output video width |
VIDEO_HEIGHT |
No | 1920 | Output video height |
VIDEO_FPS |
No | 30 | Output video frame rate |
TTS_MODEL |
No | tts-1-hd | OpenAI TTS model |
TTS_VOICE |
No | nova | TTS voice (alloy, echo, fable, onyx, nova, shimmer) |
TTS_SPEED |
No | 1.0 | TTS playback speed |
VISION_MODEL |
No | gpt-4o | Model for video validation |
SUBTITLE_FONT |
No | Arial | Subtitle font family |
SUBTITLE_FONT_SIZE |
No | 48 | Subtitle font size |
SUBTITLE_PRIMARY_COLOR |
No | &H00FFFFFF | Subtitle primary color (ASS format) |
SUBTITLE_HIGHLIGHT_COLOR |
No | &H0000FFFF | Subtitle highlight color (ASS format) |
SUBTITLE_OUTLINE_COLOR |
No | &H00000000 | Subtitle outline color (ASS format) |
SUBTITLE_OUTLINE_WIDTH |
No | 3 | Subtitle outline width |
SUBTITLE_SHADOW_DEPTH |
No | 2 | Subtitle shadow depth |
SUBTITLE_POSITION |
No | bottom | Subtitle position (top, center, bottom) |
SUBTITLE_MARGIN_BOTTOM |
No | 150 | Subtitle bottom margin in pixels |
SUBTITLE_WORDS_PER_LINE |
No | 4 | Maximum words per subtitle line |
SUBTITLES_ENABLED |
No | true | Enable subtitle generation |
TEMP_DIR |
No | ./temp | Temporary files directory |
OUTPUT_DIR |
No | ./output | Output directory |
Python API
Video Composer can also be used as a Python library:
import asyncio
from video_composer import VideoComposer
async def create_video():
async with VideoComposer() as composer:
result = await composer.create_video(
script="Your marketing script here",
keywords=["technology", "innovation"],
output_filename="my_video",
)
if result.success:
print(f"Video created: {result.output_path}")
print(f"Duration: {result.duration}s")
else:
print(f"Error: {result.error}")
asyncio.run(create_video())
Available Methods
# Full video creation
result = await composer.create_video(script, keywords, output_filename, validation_context)
# Text-to-speech only
audio_path = await composer.generate_tts_only(script, output_path)
# Transcription only
transcription = await composer.transcribe_audio_only(audio_path)
Output
Videos are generated in MP4 format with:
- Resolution: 1080x1920 (9:16 vertical)
- Frame Rate: 30 FPS
- Audio: AAC codec
- Video: H.264 codec
- Subtitles: Burned-in ASS subtitles with karaoke-style highlighting
Project Structure
your-project/
├── .env # API keys (not committed)
├── .env.example # Example environment file
├── videos.yaml # Video configuration
├── output/ # Generated videos
│ └── my_video.mp4
└── temp/ # Temporary files (auto-cleaned)
Troubleshooting
FFmpeg Not Found
Ensure FFmpeg is installed and in your PATH:
ffmpeg -version
API Key Errors
Verify your API keys are set correctly:
video-composer config
Memory Issues with Long Videos
For longer scripts, consider:
- Breaking the script into smaller segments
- Increasing system swap space
- Using a machine with more RAM
Development
Setup Development Environment
# Clone the repository
git clone https://github.com/youhanasheriff/video-composer.git
cd video-composer
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run linting
ruff check src/
mypy src/
Running Tests
# Run all tests
pytest
# Run with coverage
pytest --cov=video_composer --cov-report=html
# Run specific test file
pytest tests/test_subtitles.py -v
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- OpenAI for TTS and Whisper APIs
- Pexels for free stock video footage
- Pixabay for free stock video footage
- MoviePy for video processing
- Typer for the CLI framework
- Rich for beautiful terminal output
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file video_composer-0.4.0.tar.gz.
File metadata
- Download URL: video_composer-0.4.0.tar.gz
- Upload date:
- Size: 43.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33fc8ef609dea07afcd48cee10bba35e22264e754551212ac84929252df943e2
|
|
| MD5 |
52d4af8b58dcd08a3e00e8e0c8e82af6
|
|
| BLAKE2b-256 |
d7cd74643c1cb075012afdd9410619a50c661871b33f454a6e2407b5e4c8e772
|
File details
Details for the file video_composer-0.4.0-py3-none-any.whl.
File metadata
- Download URL: video_composer-0.4.0-py3-none-any.whl
- Upload date:
- Size: 46.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a926202cd0458e79b336842faa22f41ed4e318b7840fa02ea94aaf49fae4a93
|
|
| MD5 |
86ccb9ddcc1c015fd373961e7243eb08
|
|
| BLAKE2b-256 |
36bb020e368d79274b8922fe140b92904370b51c490a80c676497a6272518c09
|