This is a dreambooth-style trigger word LoRA trained on the Qwen3-8B autoregressive stage of
MiniMax Music 3 — not the music DiT. Prompting the caption with
fiona crapple summons an intimate cafe singer-songwriter style: jazzy piano, upright bass, brushed drums,
raw female vocal, confessional phrasing.
Trained with SimpleTuner using
--minimax_music_train_component=language_model, which teaches the AR planner with next-token cross-entropy on RVQ
semantic codes. The style flows into the audio both through the semantic codes and through the LM hidden states that
condition the music DiT — the DiT itself is untouched.
fiona crapple in the caption/instructions fieldcheckpoint-250/ (milder) and checkpoint-500/ (fully baked; train CE ≈ 0.009)All demo clips below share the same unseen lyrics (not in the training data), seed, 30 inference steps, CFG 1.7, and 40-second duration — differences are the adapter and the caption.
Caption is only the string fiona crapple. The base model has to guess what that means; the LoRA knows.
| base model | + LoRA (ck500, strength 1.0) |
|---|---|
Caption: fiona crapple, jazzy piano, raw female vocal, confessional singer-songwriter, irregular phrasing, upright bass, brushed drums, intimate.
The base model can follow the plain-language tags; the LoRA adds the specific timbre and production of the training tracks.
| base model | + LoRA (ck500, strength 1.0) |
|---|---|
Caption: upbeat synth pop, clean male vocal, four on the floor, bright chorus — LoRA active at strength 1.0.
This shows how much of the style bleeds through when the trigger is absent.
The adapter can be diluted by scaling the LoRA delta. checkpoint-500 is fully baked and benefits from lower
strengths; checkpoint-250 is milder to begin with and breathes more at every setting.
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
The adapters in regularised/checkpoint-500/ and regularised/checkpoint-750/ were trained with a second
audio backend of 35 unrelated songs marked is_regularisation_data: true. On those batches the loss matches the
frozen base model's own next-token distribution (top-64 soft targets) instead of the ground-truth codes — the
language-model analogue of DreamBooth prior preservation. Captions without the trigger keep predicting the way the
base model would, which reduces style bleed.
Balance matters: a first attempt at a 50/50 sampling ratio diluted the trigger too far (only fully descriptive captions still summoned the style). These adapters use a 1:2 regularisation ratio over 750 steps, restoring the same style-track exposure as the unregularised run while keeping roughly a third of steps on prior preservation.
Bleed check, side by side — LoRA at strength 1.0 with the no-trigger synth-pop caption:
| unregularised (ck500) | regularised (ck750) |
|---|---|
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
Training difference from the base variant: fresh run, 750 steps, minimax_music_lm_max_frames: 4500, the
regularisation backend at probability: 0.5; everything else identical. See the SimpleTuner MiniMax Music
quickstart for the prior-preservation dataset setup.
Generated tracks can be passed through the
MiniMax Music 3 latent refiner,
which reconstructs a cleaner version in DAV latent space while keeping the performance, timing, vocals, and
arrangement. Here is the checkpoint-250, strength 1.0, trigger-only render (caption is just fiona crapple)
before and after refining:
| LoRA output (ck250, strength 1.0, trigger only) | + latent refiner v0.10 |
|---|---|
pip install -e "$(huggingface-cli download terminusresearch/minimax-music3-latent-refiner-v0.10)"
minimax-music3-refine generated.flac refined.flac
[Verse 1]
I merged my own pull request at midnight
Nobody reviewed it, nobody cared
The staging server has been down since August
I redirected it to prod and said a prayer
[Chorus]
Rollback, rollback
There is no rollback plan
I am the rollback plan
[Verse 2]
The dashboard is green because I deleted the alerts
The pager is quiet because I drowned it in the sink
Six nines of uptime if you round up from one
[Outro]
And the logs rotate gently
Into the void
The adapter keys are prefixed language_model. and target the Qwen3 attention and MLP projections
(q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj, rank 64, alpha 64). To load onto the raw LM and
apply a strength:
import torch
from safetensors.torch import load_file
from transformers import Qwen3ForCausalLM
from peft import LoraConfig
lm = Qwen3ForCausalLM.from_pretrained(
"MiniMaxAI/MiniMax-Music3", subfolder="language_model",
torch_dtype=torch.bfloat16, trust_remote_code=True,
)
state = load_file("checkpoint-500/pytorch_lora_weights.safetensors")
strength = 0.5
lm.add_adapter(LoraConfig(
r=64, lora_alpha=64,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
))
mapped = {}
for key, value in state.items():
key = (key.removeprefix("language_model.")
.replace(".lora_A.weight", ".lora_A.default.weight")
.replace(".lora_B.weight", ".lora_B.default.weight"))
if ".lora_B." in key:
value = value * strength
mapped[key] = value.to(torch.bfloat16)
lm.load_state_dict(mapped, strict=False)
Then drop the LM into your MiniMax Music 3 generation stack in place of the stock language_model and prompt with
fiona crapple in the caption.
To train your own: see SimpleTuner's --minimax_music_train_component=language_model option in
OPTIONS.md and the MiniMax Music
quickstart.
checkpoint-500 reached a train CE of ~0.009 on the 9 tracks (heavily baked); start at strength 0.5–0.75.checkpoint-250 is the gentler pick if the full-strength adapter overpowers your captions.35 commits
This is a dreambooth-style trigger word LoRA trained on the Qwen3-8B autoregressive stage of
MiniMax Music 3 — not the music DiT. Prompting the caption with
fiona crapple summons an intimate cafe singer-songwriter style: jazzy piano, upright bass, brushed drums,
raw female vocal, confessional phrasing.
Trained with SimpleTuner using
--minimax_music_train_component=language_model, which teaches the AR planner with next-token cross-entropy on RVQ
semantic codes. The style flows into the audio both through the semantic codes and through the LM hidden states that
condition the music DiT — the DiT itself is untouched.
fiona crapple in the caption/instructions fieldcheckpoint-250/ (milder) and checkpoint-500/ (fully baked; train CE ≈ 0.009)All demo clips below share the same unseen lyrics (not in the training data), seed, 30 inference steps, CFG 1.7, and 40-second duration — differences are the adapter and the caption.
Caption is only the string fiona crapple. The base model has to guess what that means; the LoRA knows.
| base model | + LoRA (ck500, strength 1.0) |
|---|---|
Caption: fiona crapple, jazzy piano, raw female vocal, confessional singer-songwriter, irregular phrasing, upright bass, brushed drums, intimate.
The base model can follow the plain-language tags; the LoRA adds the specific timbre and production of the training tracks.
| base model | + LoRA (ck500, strength 1.0) |
|---|---|
Caption: upbeat synth pop, clean male vocal, four on the floor, bright chorus — LoRA active at strength 1.0.
This shows how much of the style bleeds through when the trigger is absent.
The adapter can be diluted by scaling the LoRA delta. checkpoint-500 is fully baked and benefits from lower
strengths; checkpoint-250 is milder to begin with and breathes more at every setting.
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
The adapters in regularised/checkpoint-500/ and regularised/checkpoint-750/ were trained with a second
audio backend of 35 unrelated songs marked is_regularisation_data: true. On those batches the loss matches the
frozen base model's own next-token distribution (top-64 soft targets) instead of the ground-truth codes — the
language-model analogue of DreamBooth prior preservation. Captions without the trigger keep predicting the way the
base model would, which reduces style bleed.
Balance matters: a first attempt at a 50/50 sampling ratio diluted the trigger too far (only fully descriptive captions still summoned the style). These adapters use a 1:2 regularisation ratio over 750 steps, restoring the same style-track exposure as the unregularised run while keeping roughly a third of steps on prior preservation.
Bleed check, side by side — LoRA at strength 1.0 with the no-trigger synth-pop caption:
| unregularised (ck500) | regularised (ck750) |
|---|---|
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
| strength | trigger only (fiona crapple) | descriptive caption | no-trigger caption |
|---|---|---|---|
| 0.25 | |||
| 0.50 | |||
| 0.75 | |||
| 1.00 |
Training difference from the base variant: fresh run, 750 steps, minimax_music_lm_max_frames: 4500, the
regularisation backend at probability: 0.5; everything else identical. See the SimpleTuner MiniMax Music
quickstart for the prior-preservation dataset setup.
Generated tracks can be passed through the
MiniMax Music 3 latent refiner,
which reconstructs a cleaner version in DAV latent space while keeping the performance, timing, vocals, and
arrangement. Here is the checkpoint-250, strength 1.0, trigger-only render (caption is just fiona crapple)
before and after refining:
| LoRA output (ck250, strength 1.0, trigger only) | + latent refiner v0.10 |
|---|---|
pip install -e "$(huggingface-cli download terminusresearch/minimax-music3-latent-refiner-v0.10)"
minimax-music3-refine generated.flac refined.flac
[Verse 1]
I merged my own pull request at midnight
Nobody reviewed it, nobody cared
The staging server has been down since August
I redirected it to prod and said a prayer
[Chorus]
Rollback, rollback
There is no rollback plan
I am the rollback plan
[Verse 2]
The dashboard is green because I deleted the alerts
The pager is quiet because I drowned it in the sink
Six nines of uptime if you round up from one
[Outro]
And the logs rotate gently
Into the void
The adapter keys are prefixed language_model. and target the Qwen3 attention and MLP projections
(q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj, rank 64, alpha 64). To load onto the raw LM and
apply a strength:
import torch
from safetensors.torch import load_file
from transformers import Qwen3ForCausalLM
from peft import LoraConfig
lm = Qwen3ForCausalLM.from_pretrained(
"MiniMaxAI/MiniMax-Music3", subfolder="language_model",
torch_dtype=torch.bfloat16, trust_remote_code=True,
)
state = load_file("checkpoint-500/pytorch_lora_weights.safetensors")
strength = 0.5
lm.add_adapter(LoraConfig(
r=64, lora_alpha=64,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
))
mapped = {}
for key, value in state.items():
key = (key.removeprefix("language_model.")
.replace(".lora_A.weight", ".lora_A.default.weight")
.replace(".lora_B.weight", ".lora_B.default.weight"))
if ".lora_B." in key:
value = value * strength
mapped[key] = value.to(torch.bfloat16)
lm.load_state_dict(mapped, strict=False)
Then drop the LM into your MiniMax Music 3 generation stack in place of the stock language_model and prompt with
fiona crapple in the caption.
To train your own: see SimpleTuner's --minimax_music_train_component=language_model option in
OPTIONS.md and the MiniMax Music
quickstart.
checkpoint-500 reached a train CE of ~0.009 on the 9 tracks (heavily baked); start at strength 0.5–0.75.checkpoint-250 is the gentler pick if the full-strength adapter overpowers your captions.35 commits