WAV in, finished MP4 out β with frame-level prompt control and selective regeneration matching the Neural Frames workflow, running fully local on your own GPU.
The suite ships as both a headless CLI (for batching 1000+ tracks) and a PySide6 desktop app (for interactive scene/frame editing). Image generation runs through FLUX, video generation through Hunyuan-Video β both via π€ diffusers, both supporting GGUF-quantised weights so they fit on consumer GPUs.
Frames, each storing its own image prompt, motion prompt, negative prompt, seed, and generated image/clip path.flux, hunyuan, and a pipeline-validating stub that produces real PNGs/MP4s so you can exercise the full system on a laptop without a GPU.gguf_transformer_path at a quantised weight file for either model.Project.save(), so a crash mid-render never corrupts state.mvsuite batch ./inbox processes a folder of WAVs end-to-end.conda env create -f environment.yml
conda activate mvsuite
pip install -e .
This pulls PyTorch with CUDA 12.1, ffmpeg, librosa, diffusers, transformers, openai-whisper, PySide6, and everything else.
pip install -e ".[gui]"
# add ".[gen]" if you also want the heavy diffusers/transformers stack
You'll still need ffmpeg on your PATH (brew install ffmpeg, apt install ffmpeg, or grab a static build).
# 1. Create a project from a WAV.
mvsuite new "My Track" --audio path/to/song.wav
# 2. Run the whole pipeline in one shot.
mvsuite run projects/my-track --vision "neon cyberpunk skyline at night, rainy streets"
# 3. Open the result.
start projects/my-track/output/final.mp4 # macOS: 'open' Linux: 'xdg-open'
The first run downloads the FLUX and Hunyuan-Video weights to your HuggingFace cache (~30 GB on disk for full precision, ~12 GB for GGUF Q4).
mvsuite-gui
projects/<slug>/output/.mvsuite batch ./inbox --output-root ./projects \
--vision "warm vintage VHS aesthetic, slow zooms"
Walks ./inbox for .wav files and produces one finished MP4 per track. Failures are logged and the loop continues to the next track.
The pipeline is driven by src/mvsuite/_resources/default.yaml (shipped inside the package via importlib.resources so it works for editable, wheel, and zip installs). Override with --config <yourfile.yaml> (whole file) or via project.json's config block (per-project overrides). Notable knobs:
| Section | Key | Purpose |
|---|---|---|
project | resolution, fps, video_crf | Final MP4 settings. |
audio | target_sample_rate, section_novelty_threshold | Analyzer tuning. |
scenes | target_scene_count, frames_per_scene, clip_seconds | Timeline shape. |
transcription | model_size | tiny/base/small/medium/large-v3. |
generators.image_backend | flux / stub | Switch backends. |
generators.video_backend | hunyuan / stub | Switch backends. |
generators.flux.gguf_transformer_path | path | Use a local FLUX GGUF file. |
generators.hunyuan.gguf_transformer_path | path | Use a local Hunyuan GGUF file. |
projects/<slug>/
project.json β single source of truth (atomic writes)
audio/source.wav
images/<scene>/<frame>.png
clips/<scene>/<frame>.mp4
output/final.mp4
logs/
project.json is a Pydantic-validated ProjectManifest you can read or hand-edit if you ever need to.
mvsuite/
βββ audio/ librosa analysis, Whisper transcription
βββ scenes/ Scene/Frame models, beat-aware segmenter, prompt builder
βββ generators/ ImageGenerator/VideoGenerator base + flux + hunyuan + stub
βββ render/ FFmpeg-based clip assembly with optional crossfades
βββ gui/ PySide6 timeline + scene/frame editor (workers in QThread)
βββ pipeline.py End-to-end orchestrator (called from both CLI & GUI)
βββ cli.py Typer commands: new / analyse / segment / generate / regen / run / batch
βββ project.py On-disk project model
βββ config.py Layered YAML config
Why this shape:
if/else chain. Adding a future video model (e.g. CogVideoX, Mochi-1) means writing one ~80-line adapter and registering it.Frame is the atomic regen unit. "Remake this frame" β image regen β video regen β final reassemble, no rebuild of the rest of the song. This is the property the brief was specifically asking for.JobThread emitting Qt signals. The UI stays responsive while a 10-minute generation runs.Project.save(), so you can edit a project in the GUI, close it, run mvsuite generate from a Slurm job, then reopen in the GUI. State is portable.# Run the test suite (uses the stub backends β no GPU required).
pytest
# Lint.
ruff check src tests
# Type-check.
mypy src
The smoke test in tests/test_pipeline_stub.py runs the full pipeline (audio β segment β image gen β video gen β assemble) against a synthetic 10s WAV and asserts that a real MP4 lands on disk.
| Status | Item |
|---|---|
| β | librosa BPM / beat / downbeat / section detection |
| β | Whisper transcription with word timestamps |
| β | Beat-aware scene segmenter, split / merge / reorder |
| β | Per-frame prompts, seeds, status tracking, lock |
| β | FLUX + Hunyuan-Video adapters (full + GGUF) |
| β | "Remake this frame" β reassemble |
| β | PySide6 GUI: timeline, scene/frame editor |
| β | CLI + headless batch mode |
| β³ | Audio playback in GUI with synced playhead (QtMultimedia) |
| β³ | Style consistency via IP-Adapter / character LoRAs |
| β³ | Export EDL / JSON for import into Premiere / Resolve |
MIT β see LICENSE.
1 commits
Python
100.0%
WAV in, finished MP4 out β with frame-level prompt control and selective regeneration matching the Neural Frames workflow, running fully local on your own GPU.
The suite ships as both a headless CLI (for batching 1000+ tracks) and a PySide6 desktop app (for interactive scene/frame editing). Image generation runs through FLUX, video generation through Hunyuan-Video β both via π€ diffusers, both supporting GGUF-quantised weights so they fit on consumer GPUs.
Frames, each storing its own image prompt, motion prompt, negative prompt, seed, and generated image/clip path.flux, hunyuan, and a pipeline-validating stub that produces real PNGs/MP4s so you can exercise the full system on a laptop without a GPU.gguf_transformer_path at a quantised weight file for either model.Project.save(), so a crash mid-render never corrupts state.mvsuite batch ./inbox processes a folder of WAVs end-to-end.conda env create -f environment.yml
conda activate mvsuite
pip install -e .
This pulls PyTorch with CUDA 12.1, ffmpeg, librosa, diffusers, transformers, openai-whisper, PySide6, and everything else.
pip install -e ".[gui]"
# add ".[gen]" if you also want the heavy diffusers/transformers stack
You'll still need ffmpeg on your PATH (brew install ffmpeg, apt install ffmpeg, or grab a static build).
# 1. Create a project from a WAV.
mvsuite new "My Track" --audio path/to/song.wav
# 2. Run the whole pipeline in one shot.
mvsuite run projects/my-track --vision "neon cyberpunk skyline at night, rainy streets"
# 3. Open the result.
start projects/my-track/output/final.mp4 # macOS: 'open' Linux: 'xdg-open'
The first run downloads the FLUX and Hunyuan-Video weights to your HuggingFace cache (~30 GB on disk for full precision, ~12 GB for GGUF Q4).
mvsuite-gui
projects/<slug>/output/.mvsuite batch ./inbox --output-root ./projects \
--vision "warm vintage VHS aesthetic, slow zooms"
Walks ./inbox for .wav files and produces one finished MP4 per track. Failures are logged and the loop continues to the next track.
The pipeline is driven by src/mvsuite/_resources/default.yaml (shipped inside the package via importlib.resources so it works for editable, wheel, and zip installs). Override with --config <yourfile.yaml> (whole file) or via project.json's config block (per-project overrides). Notable knobs:
| Section | Key | Purpose |
|---|---|---|
project | resolution, fps, video_crf | Final MP4 settings. |
audio | target_sample_rate, section_novelty_threshold | Analyzer tuning. |
scenes | target_scene_count, frames_per_scene, clip_seconds | Timeline shape. |
transcription | model_size | tiny/base/small/medium/large-v3. |
generators.image_backend | flux / stub | Switch backends. |
generators.video_backend | hunyuan / stub | Switch backends. |
generators.flux.gguf_transformer_path | path | Use a local FLUX GGUF file. |
generators.hunyuan.gguf_transformer_path | path | Use a local Hunyuan GGUF file. |
projects/<slug>/
project.json β single source of truth (atomic writes)
audio/source.wav
images/<scene>/<frame>.png
clips/<scene>/<frame>.mp4
output/final.mp4
logs/
project.json is a Pydantic-validated ProjectManifest you can read or hand-edit if you ever need to.
mvsuite/
βββ audio/ librosa analysis, Whisper transcription
βββ scenes/ Scene/Frame models, beat-aware segmenter, prompt builder
βββ generators/ ImageGenerator/VideoGenerator base + flux + hunyuan + stub
βββ render/ FFmpeg-based clip assembly with optional crossfades
βββ gui/ PySide6 timeline + scene/frame editor (workers in QThread)
βββ pipeline.py End-to-end orchestrator (called from both CLI & GUI)
βββ cli.py Typer commands: new / analyse / segment / generate / regen / run / batch
βββ project.py On-disk project model
βββ config.py Layered YAML config
Why this shape:
if/else chain. Adding a future video model (e.g. CogVideoX, Mochi-1) means writing one ~80-line adapter and registering it.Frame is the atomic regen unit. "Remake this frame" β image regen β video regen β final reassemble, no rebuild of the rest of the song. This is the property the brief was specifically asking for.JobThread emitting Qt signals. The UI stays responsive while a 10-minute generation runs.Project.save(), so you can edit a project in the GUI, close it, run mvsuite generate from a Slurm job, then reopen in the GUI. State is portable.# Run the test suite (uses the stub backends β no GPU required).
pytest
# Lint.
ruff check src tests
# Type-check.
mypy src
The smoke test in tests/test_pipeline_stub.py runs the full pipeline (audio β segment β image gen β video gen β assemble) against a synthetic 10s WAV and asserts that a real MP4 lands on disk.
| Status | Item |
|---|---|
| β | librosa BPM / beat / downbeat / section detection |
| β | Whisper transcription with word timestamps |
| β | Beat-aware scene segmenter, split / merge / reorder |
| β | Per-frame prompts, seeds, status tracking, lock |
| β | FLUX + Hunyuan-Video adapters (full + GGUF) |
| β | "Remake this frame" β reassemble |
| β | PySide6 GUI: timeline, scene/frame editor |
| β | CLI + headless batch mode |
| β³ | Audio playback in GUI with synced playhead (QtMultimedia) |
| β³ | Style consistency via IP-Adapter / character LoRAs |
| β³ | Export EDL / JSON for import into Premiere / Resolve |
MIT β see LICENSE.
1 commits
Python
100.0%