Skip to main content

mixing

Tools for video and audio editing in Python — slicing, fades, audio replace/mix, Ken Burns, thumbnails, subtitles, speech-to-text + filler removal, TTS dubbing, and chapter detection.

pip install 'mixing[media]'   # audio + video editing (moviepy, opencv, scipy, pydub)
pip install mixing            # base: only the pure modules (srt, chapters, errors, util, egress, transcript, TTS)

The base install is light on purpose: it carries no media backend (and so no bundled ffmpeg binary). mixing.audio and mixing.video need the media extra; importing them without it raises an ImportError that says so.


🤖 AI-first: start with the skills & agents

mixing is built to be driven by AI coding agents. The fastest, most reliable way to use it is through the bundled skills and agents in .claude/ — task-oriented playbooks that encode the right functions, the calling conventions, and the gotchas, so an agent gets it right the first time.

Skills (.claude/skills/) — how to use mixing for a task:

Skill Use it for
mixing Start here — router, architecture, the output protocol, extras
mixing-audio slice, fade, crop, concat, overlay, normalize, align, segment audio
mixing-video slice, crop, loop, speed, replace/normalize audio, Ken Burns, thumbnails, subtitles
mixing-transcript transcribe, remove fillers, SRT/prose, chapters
mixing-dubbing TTS re-voicing & SRT translation

Agents (.claude/agents/):

  • mixing-editor — performs an editing task end-to-end ("edit this media …").
  • mixing-dev — works on the mixing codebase.

Using Claude Code? These are discovered automatically from .claude/. The architectural contract they share lives in .claude/CLAUDE.md.


Quick start

import mixing  # cheap: no moviepy/opencv loaded yet

assert mixing.has_ffmpeg()  # most ops need ffmpeg on PATH

# --- audio ---
from mixing.audio import Audio

Audio("song.mp3")[10:30].fade_in(2).fade_out(3).save(output="clip.mp3")

# --- video ---
from mixing.video import replace_audio, ken_burns_video

replace_audio("clip.mp4", "music.mp3", mix_ratio=0.7, output="mixed.mp4")
ken_burns_video("cover.jpg", duration=8, output="cover.mp4")

# --- transcript: remove "uh"/"um" (ElevenLabs Scribe + ffmpeg) ---
from mixing.transcript import remove_fillers

result = remove_fillers("talk.mov", "out/")  # uses $ELEVENLABS_API_KEY
print(result.cleaned_media)

Core ideas (learn once)

The output protocol. Every result-producing function takes one output argument whose role is constant and type is open:

crop_video("in.mp4", 5, 15, output="out.mp4")  # file → writes it, returns Path
crop_video("in.mp4", 5, 15, output="clips/")  # dir  → auto-named file inside
crop_video("in.mp4", 5, 15)  # None → saves beside the input
fade_in("in.mp3", output=lambda audio: audio)  # callable → receives the result

Object producers (audio editing) return the in-memory object when output=None, so you can chain and save when ready. Functions that emit several artifacts qualify the destinations (remove_fillers(media, output_dir=…, output_media=…)).

Lazy & tiered. import mixing (and import mixing.chapters / mixing.srt) pull no heavy backends; moviepy/opencv/pydub load only when you touch a name that needs them. Import the facade (mixing.Video) or the subpackage (from mixing.video import Video).

Sliceable media. Audio and Video are lazy, sliceable, context-managed views:

from mixing.video import Video

with Video("movie.mp4") as v:
    v[10:30].save(output="cut.mp4")  # seconds; v[100] returns a single frame

Logging, not printing. mixing never writes progress messages to stdout — every module logs through logging.getLogger(__name__), and the package root carries a NullHandler, so mixing is silent by default. This keeps library calls usable from a stdout-parsing consumer. To see mixing's own progress messages (e.g. while working interactively, or when an operation like mixing.video.genai.generate_video fails and you want the full diagnostic), opt in with:

import logging

logging.basicConfig(level=logging.INFO)  # or level=logging.ERROR for errors only

Requirements

  • ffmpeg on PATH (most operations). macOS: brew install ffmpeg; Debian/Ubuntu: sudo apt install ffmpeg; Windows: download from ffmpeg.org and add bin to PATH.
  • ElevenLabs API key for mixing.transcript / mixing.dubbing (ELEVENLABS_API_KEY or ELEVEN_API_KEY, or pass api_key=). Responses are cached on disk, so re-runs are free and offline.
  • Google Cloud auth for AI video generation (mixing.video.genai, Vertex AI Veo).

Optional extras

pip install mixing[media]      # moviepy / opencv / scipy / pydub: mixing.audio + mixing.video
pip install mixing[audio]      # an alias: media + soundfile (kept for existing installs)
pip install mixing[widget]     # interactive Jupyter audio widget
pip install mixing[gen]        # Google Vertex AI Veo generation
pip install mixing[llm]        # aix — chapter titling + SRT translation
pip install mixing[clipboard]  # get file paths from the clipboard
pip install mixing[beats]      # librosa — beat/downbeat/onset analysis
pip install mixing[ml]         # torch + transformers — find_segments(strategy="audioset"): songs vs jingles vs talk

What's inside

Subpackage Highlights
mixing.audio Audio, fade_in/out, crop_audio, concatenate_audio, overlay_audio, loop_audio, duck_audio, find_audio_offset, find_segments/extract_segments (incl. strategy="audioset", extra ml), text_before_segments, find_talk_edges (host talk at a song's start/end), beat_grid/BeatGrid (extra beats), loudness (BS.1770 LUFS), level_turns (per-speaker loudness matching), process_turns, voice_profile (per-speaker f0/loudness/timbre), shift_pitch (formant-preserving with rubberband)
mixing.video Video, crop_video, loop_video, change_speed, replace_audio, normalize_audio, overlay_ambient_bed, ken_burns_video/ken_burns_film, concatenate_videos (+ transitions: crossfade_transition, fade_through_black, …), make_thumbnail, write_subtitles_in_video, SOCIAL_SIZES
mixing.video.genai generate_video (Vertex AI Veo)
mixing.transcript transcribe, remove_fillers, srt_for_media, words_to_srt/words_to_prose
mixing.chapters detect_chapters, Chapter
mixing.dubbing text_to_speech, list_voices, translate_srt, dub_video_from_srt
mixing.srt Cue, parse_srt, dump_srt, seconds_to_srt_time

See the skills for the full, example-driven API of each.

License

MIT

Metadata

Release files for mixing 0.0.89

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mixing 0.0.89
File Size Uploaded Provenance Actions
mixing-0.0.89.tar.gz 4.2 MB Without provenance Details for mixing-0.0.89.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for mixing 0.0.89
File Interpreter ABI Platform Actions
mixing-0.0.89-py3-none-any.whl Python 3 none any Details for mixing-0.0.89-py3-none-any.whl

Total release size: 4.8 MB

Release files / mixing-0.0.89.tar.gz

Download URL mixing-0.0.89.tar.gz
Size 4.2 MB
Tags Source
SHA-256 checksum
How to use checksums
8823775f566d9c72cbc52baa0f3e2b5cedc660ffc06b29651eb51f5d06ff03cc
BLAKE2b-256 checksum
How to use checksums
8f3e243b288ff750a7880b0537217b46926d1da7e396f15f1e69d888ad7d1ee2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / mixing-0.0.89-py3-none-any.whl

Download URL mixing-0.0.89-py3-none-any.whl
Size 519.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3fc7d25755d97758380a112947dca9d71ab0fffca6ec183c6c9415078c053ad5
BLAKE2b-256 checksum
How to use checksums
13757ee381f1250ad8ed50da74f6edbd561a5cc62626e8db407b419216f5732a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for mixing 0.0.89

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.0.89 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page