Skip to main content

Audio to waveform video generator with subtitles

Project description

wavevid

Turn your podcast or audio into stunning waveform videos with avatar, subtitles, and intro/outro — ready for social media.

video

Features

  • 5 visualization styles — waveform, radial, bars, spectrum, particles
  • Auto-generated subtitles — via Soniox speech-to-text
  • Intro/outro — with title overlay, custom sounds, and fade transitions
  • Background music — loops throughout with adjustable volume
  • Smart color detection — auto-picks wave/subtitle colors from background
  • Social media presets — 16:9, 9:16, 1:1, 4:5 aspect ratios
  • End screen — auto-generated with avatar and title

Install

pip install wavevid

Or install from source:

git clone https://github.com/tf-vip/wavevid.git
cd wavevid
pip install -e .

Requires: FFmpeg (brew install ffmpeg on macOS, apt install ffmpeg on Ubuntu)

Quick Start

# Basic waveform video
wavevid audio.m4a -o video.mp4

# Square video with avatar for social media
wavevid audio.m4a -o video.mp4 --aspect 1:1 --avatar photo.jpg

# Full-featured podcast video
wavevid podcast.m4a -o podcast.mp4 \
  --style radial \
  --bg random \
  --avatar host.jpg \
  --subtitle \
  --intro intro.wav \
  --intro-title "My Podcast" \
  --bg-music jazz.mp3

Options

Video

Option Default Description
-o, --output output.mp4 Output file
--aspect - Preset: 16:9, 9:16, 1:1, 4:5
--width 1920 Video width (if no aspect)
--height 1080 Video height (if no aspect)
--fps 30 Frames per second
--preset ultrafast Encoding: ultrafast to veryslow
--thumbnail - Save thumbnail image

Visualization

Option Default Description
--style waveform waveform, radial, bars, spectrum, particles
--bg color color, gradient, image, random
--bg-value #1a1a2e Hex, "color1,color2", or image path
--wave-color #00ff88 Hex or auto (detect from background)
--wave-sync 0 Sync offset in seconds

Avatar & Subtitles

Option Default Description
--avatar - Avatar image (centered, circular)
--avatar-size auto Size in pixels
--subtitle off Enable transcription
--subtitle-color auto Hex or auto
--subtitle-font-size auto Font size in pixels
--replace - Text replacement: old=new
--replace-file - File with replacements

Audio

Option Default Description
--volume 100 Main audio volume %
--intro - Intro sound file
--intro-duration 3 Intro solo duration (seconds)
--outro - Outro sound file
--bg-music - Background music (loops)
--bg-music-volume 15 Background music volume %
--audio-only - Output audio mix only

Intro Clip

Option Default Description
--intro-title - Title text overlay
--intro-subtitle - Subtitle below title
--intro-bg - Intro background (image or video)
--intro-clip-duration 3 Intro clip length (seconds)
--intro-static animated Static intro (better thumbnails)
--intro-title-color auto Hex or auto

End Screen

Option Default Description
--end-screen auto Enable end screen
--end-screen-duration 5 Duration in seconds

Examples

Podcast with everything

wavevid episode.m4a -o episode.mp4 \
  --style radial \
  --aspect 1:1 \
  --bg random \
  --wave-color auto \
  --avatar host.jpg \
  --subtitle \
  --subtitle-color auto \
  --intro intro.wav \
  --intro-title "Episode 42" \
  --intro-subtitle "The Answer to Everything" \
  --outro outro.wav \
  --bg-music lofi.mp3 \
  --bg-music-volume 10

Instagram Reels (9:16)

wavevid clip.m4a -o reel.mp4 \
  --style bars \
  --aspect 9:16 \
  --bg gradient \
  --bg-value "#667eea,#764ba2" \
  --avatar photo.jpg

Audio mix only (no video)

wavevid podcast.m4a -o mixed.m4a \
  --audio-only \
  --intro intro.wav \
  --outro outro.wav \
  --bg-music jazz.mp3

High quality export

wavevid audio.m4a -o video.mp4 \
  --preset slow \
  --fps 60

Subtitles

Subtitles use Soniox API for transcription.

  1. Get API key from https://console.soniox.com
  2. Create .env file:
    SONIOX_API_KEY=your_key_here
    
  3. Run with --subtitle

Transcripts are cached in .transcribe_cache/ to avoid repeated API calls.

Text Replacements

Fix transcription errors with --replace or --replace-file:

# Single replacement
wavevid audio.m4a -o video.mp4 --subtitle --replace "AI=A.I."

# Multiple from file
wavevid audio.m4a -o video.mp4 --subtitle --replace-file fixes.txt

fixes.txt:

AI=A.I.
gonna=going to
# comments are ignored

Social Media Specs

Platform Ratio Resolution Aspect Flag
YouTube 16:9 1920×1080 --aspect 16:9
Instagram Feed 1:1 1080×1080 --aspect 1:1
Instagram/TikTok 9:16 1080×1920 --aspect 9:16
Facebook Feed 4:5 1080×1350 --aspect 4:5

Custom Backgrounds

Add images to src/wavevid/backgrounds/ for --bg random, or use --bg image --bg-value path/to/image.jpg.

License

MIT

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

wavevid-0.1.0.tar.gz (97.1 MB view details)

Uploaded Source

Built Distribution

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

wavevid-0.1.0-py3-none-any.whl (97.1 MB view details)

Uploaded Python 3

File details

Details for the file wavevid-0.1.0.tar.gz.

File metadata

  • Download URL: wavevid-0.1.0.tar.gz
  • Upload date:
  • Size: 97.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for wavevid-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0997c05bc86761cce5628a09a65f374b56b634f576f57eb239b4becc10fc1c8e
MD5 2eb2f1211bd9471158e0b6d5823a4b6e
BLAKE2b-256 662ac7c0cb5cfa199efb043b66c3e696425158b9b746c7c9e371b54ce1f2e921

See more details on using hashes here.

File details

Details for the file wavevid-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: wavevid-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 97.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for wavevid-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1ee1897d59f18e2344a4d58505b8d75474ade22b15c3d5d0ac0802828c089bf1
MD5 034ecb37283ad8cc7ceaf93149baa078
BLAKE2b-256 331135959c8f6b73f9f7ae24dd98045ebff17f1515abbb47432c42b6ec564825

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