Skip to main content

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.

PyPI version Python 3.11+ License: MIT

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:

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 (#RRGGBB or ASS) (optional)
  • --subtitle-highlight-color: Subtitle highlight color (#RRGGBB or ASS) (optional)
  • --subtitle-outline-color: Subtitle outline color (#RRGGBB or 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:

  1. Breaking the script into smaller segments
  2. Increasing system swap space
  3. 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.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

video_composer-0.4.0.tar.gz (43.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

video_composer-0.4.0-py3-none-any.whl (46.3 kB view details)

Uploaded Python 3

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

Hashes for video_composer-0.4.0.tar.gz
Algorithm Hash digest
SHA256 33fc8ef609dea07afcd48cee10bba35e22264e754551212ac84929252df943e2
MD5 52d4af8b58dcd08a3e00e8e0c8e82af6
BLAKE2b-256 d7cd74643c1cb075012afdd9410619a50c661871b33f454a6e2407b5e4c8e772

See more details on using hashes here.

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

Hashes for video_composer-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0a926202cd0458e79b336842faa22f41ed4e318b7840fa02ea94aaf49fae4a93
MD5 86ccb9ddcc1c015fd373961e7243eb08
BLAKE2b-256 36bb020e368d79274b8922fe140b92904370b51c490a80c676497a6272518c09

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page