terminusresearch/minimax-music3-lm-lora-fiona-crapple

Model

1

stars

35

commits

7

linked in READMEs

Aug 22, 2026

updated

language-model
lora
minimax-music3
music
simpletuner
text-to-audio
trigger-word

README

fiona crapple — a trigger-word LoRA for MiniMax Music 3's language model

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.

  • Trigger: fiona crapple in the caption/instructions field
  • Data: 9 tracks (~52 minutes) in a consistent style
  • Config: rank 64, lr 8e-5 constant, batch 1, bf16, single 48G GPU
  • Checkpoints: checkpoint-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.

Does the word itself carry the style?

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)

With a descriptive caption

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)

Leakage check: a caption with no trigger

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.

Strength sweep

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.

checkpoint-500

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

checkpoint-250

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

Regularised variant: prior preservation with a frozen teacher

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)

regularised checkpoint-750

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

regularised checkpoint-500

strengthtrigger only (fiona crapple)descriptive captionno-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.

Polishing the output with the latent refiner

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

Demo lyrics

The unseen lyrics used in every clip
[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

Usage

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.

Notes

  • 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.
  • The training tracks were AI-generated songs in a consistent style; the trigger word is a parody name and the adapter does not reproduce any artist's recordings.

Contributors

bghira

35 commits

terminusresearch/minimax-music3-lm-lora-fiona-crapple

Model

1

stars

35

commits

7

linked in READMEs

Aug 22, 2026

updated

language-model
lora
minimax-music3
music
simpletuner
text-to-audio
trigger-word

README

fiona crapple — a trigger-word LoRA for MiniMax Music 3's language model

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.

  • Trigger: fiona crapple in the caption/instructions field
  • Data: 9 tracks (~52 minutes) in a consistent style
  • Config: rank 64, lr 8e-5 constant, batch 1, bf16, single 48G GPU
  • Checkpoints: checkpoint-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.

Does the word itself carry the style?

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)

With a descriptive caption

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)

Leakage check: a caption with no trigger

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.

Strength sweep

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.

checkpoint-500

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

checkpoint-250

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

Regularised variant: prior preservation with a frozen teacher

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)

regularised checkpoint-750

strengthtrigger only (fiona crapple)descriptive captionno-trigger caption
0.25
0.50
0.75
1.00

regularised checkpoint-500

strengthtrigger only (fiona crapple)descriptive captionno-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.

Polishing the output with the latent refiner

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

Demo lyrics

The unseen lyrics used in every clip
[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

Usage

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.

Notes

  • 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.
  • The training tracks were AI-generated songs in a consistent style; the trigger word is a parody name and the adapter does not reproduce any artist's recordings.

Contributors

bghira

35 commits