--- title: MiniMax-H3 ยท reference โ†’ video + audio ยท Custom lora emoji: ๐ŸŽญ colorFrom: pink colorTo: purple sdk: gradio sdk_version: 6.20.0 app_file: app.py pinned: true short_description: Video + soundtrack, your lora + CivitAI, structured prompts suggested_hardware: zero-a10g tags: - video - image-to-video - minimax - lora - civitai - audio - zerogpu --- # MiniMax-H3 โ€” omni-references, unquantized, split across two Spaces Joint video **and** soundtrack out of a single denoising pass, conditioned on an ordered list of image, video and audio references, at **bfloat16 with no quantization anywhere**. This Space is the denoising half of the `ref2va` task: the 61.73 GiB `transformer_ref` partition and the two autoencoders. The 62.14 GiB Qwen3-VL conditioner runs in [`qwen3vl-conditioner`](https://huggingface.co/spaces/multimodalart/qwen3vl-conditioner), which this Space calls over the gradio API for every request โ€” the same conditioner Space, and the same resident weights, that the keyframe half [`minimax-h3`](https://huggingface.co/spaces/multimodalart/minimax-h3) uses. ## What this fork adds **A structured prompt builder.** H3 was trained on the output of H3-Context-IR, a preprocessor that rewrites a plain request into labelled sections, and MiniMax's own model card calls that structure *critical to the quality of the final output*. Nothing in this pipeline adds it โ€” the string reaches the transformer as typed. The builder writes those sections for you: the reference line naming ``, `` in connection order, then `integrated_multimodal_description` with the shot type, the camera move written as type + amplitude + speed, and the dialogue verbatim inside `` tags, then `overall_soundscape` and `non_diegetic_music`. Speech is generated together with the picture, so naming that someone speaks without giving the words produces correct mouth shapes with nothing in them; the builder makes that hard to get wrong. **Custom lora, five slots.** A Hugging Face repo, a file inside one, a **CivitAI download link**, or an uploaded file. Adapters have to be trained against the `transformer_ref/` partition โ€” a `transformer/` adapter is a different partition and will not match. **CivitAI, searched from inside the Space.** Type a word, get the model's title, version, file, size, downloads and trigger words, and drop the one you want straight into a slot. A link that is already in a slot can be named with one press, so a row reads *Hairy dad butt ยท v1.0 ยท hairy.safetensors* rather than a number. Gated entries need `CIVITAI_TOKEN` under *Settings โ†’ Variables and secrets*: the Space downloads on its own machine, so being signed in to CivitAI in a browser does not authenticate it โ€” a gated model answers a server with an HTML login page, which is caught and reported rather than saved as weights. **kohya, CivitAI and LoKr files are converted on the fly.** Most of what CivitAI carries is kohya-named, and it differs from diffusers in ways that quietly ruin a result rather than raise: flat underscored names, a fused QKV interleaved *per attention head* (a plain three-way split hands q's rows to k), a gated MLP whose two halves sit in the opposite order, and an `alpha` that sets the scale. LyCORIS **LoKr** goes further and stores each layer as the Kronecker product of two small factors, which PEFT cannot load at all; it is rebuilt into an ordinary low-rank pair at load time โ€” exactly, since the SVD of a Kronecker product is the outer product of the factors' SVDs, so nothing the size of the full 7168ร—7168 layer is ever built. `.pt` files are read as well as `.safetensors`. **Turbo presets.** Few-step distillations that render joint video + soundtrack in 4โ€“8 steps instead of the usual ~28. Picking one fills a free slot at that build's own strength and moves the steps slider to the count it was distilled for. **Continue the scene.** One press takes the last frame of the clip you have, makes it the first reference, generates again with the settings untouched, and joins the two into a single file โ€” soundtrack included. Press again for a third clip. Each press costs one normal generation; the joining is free. **Clip stitching, soundtrack included.** Queue several clips and they are joined into one file; tick the box and every new generation joins on its own. It runs on the CPU, so it costs nothing from the GPU allowance. Everything is scaled to the first clip's frame, and a clip without audio gets silence rather than breaking the join. **Named profiles.** Save every setting under a name and bring it back from a dropdown, or export it as `.json`. **A live GPU cost readout** above the button, using the same `budget()` the pre-flight check and `get_duration` use, so a request that will not fit is visible as a number rather than as a failed run. **Randomize seed**, drawn fresh per press and written back into the box, so the number shown is always the one the clip was made with. ## Why split MiniMax-H3 is 195.9 GiB in bfloat16 and a ZeroGPU Space is evicted at **150 GB of storage**. An unquantized single Space is therefore impossible. Cut the `ref2va` branch of `MiniMaxH3Blocks` at its `text_encoder` step and both halves fit unquantized: | Space | Subfolders | Download | Resident | |---|---|---|---| | [`qwen3vl-conditioner`](https://huggingface.co/spaces/multimodalart/qwen3vl-conditioner) | `text_encoder/` + `tokenizer/` + `processor/` | 66.7 GB | 62.15 GiB bf16 | | this one | `transformer_ref/` + `vae/` + `audio_vae/` | 77.3 GB | 61.73 GiB bf16 + 10.43 GiB float32 | ## References A request carries up to **12** references โ€” at most 9 images, 3 videos and 3 audio clips โ€” **in the order the model reads them**. The order is semantic: it numbers the labels of MiniMax-H3's prompt presentation (``, `