Instructions to use laion/moss-mediathek-emotion-lora with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use laion/moss-mediathek-emotion-lora with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
MOSS Mediathek emotion LoRAs
LoRA adapters for
laion/moss-tts-local-transformer-4.55b-voice-acting-v2,
trained on an emotion-selected subset of German public-broadcast (Mediathek) speech β real
recorded human speech, not synthetic.
Nine checkpoints: ranks 16 / 32 / 64 Γ epochs 1 / 2 / 3.
Read this before using them
On the headline composite score, none of the nine checkpoints is distinguishable from the base model. Measured on a 400-clip held-out set, 40 generations per arm, scored with the VoiceNet/EmoNet/genuineness/blend stack:
| arm | composite | genuineness | blend | target emotion |
|---|---|---|---|---|
| base (prompt only) | 0.5015 | 3.179 | 4.732 | 1.468 |
| r16_e1 | 0.5076 | 2.597 | 5.823 | 2.279 |
| r16_e2 | 0.5086 | 2.736 | 5.612 | 2.399 |
| r16_e3 | 0.4879 | 2.643 | 5.354 | 2.465 |
| r32_e1 | 0.5114 | 2.648 | 5.815 | 2.382 |
| r32_e2 | 0.4978 | 2.703 | 5.451 | 2.293 |
| r32_e3 | 0.4979 | 2.604 | 5.618 | 2.251 |
| r64_e1 | 0.4951 | 2.609 | 5.553 | 2.165 |
| r64_e2 β default | 0.5275 | 2.909 | 5.701 | 2.509 |
| r64_e3 | 0.5050 | 2.618 | 5.737 | 2.486 |
No arm reaches ~2 SE against base. diff_vs_base ranges β0.014 to +0.026, |z| β€ 0.83.
But the composite is hiding a real and consistent trade-off, and that is the actual result:
- Target emotion rises sharply and without exception: 1.468 β 2.17β2.51, i.e. +48 % to +71 % on every single checkpoint. If you want the requested emotion to actually come through, these adapters do that.
- Blend improves everywhere: 4.732 β 5.35β5.82.
- Genuineness falls everywhere: 3.179 β 2.60β2.91. The emotion reads as more performed and less felt.
The composite weights these against each other and they cancel. So the honest summary is not "the training did nothing" β it is "the training buys emotional intensity and burst blending, and pays for it in perceived sincerity." Whether that is a good trade depends entirely on your use case: for expressive character work it usually is; for intimate or documentary-style delivery it usually is not.
Which one to use
r64_e2 is the default: the best composite of the nine, the highest genuineness of any LoRA
arm (so the smallest sincerity penalty), and essentially the top target-emotion score. If you want
maximum emotional push and can accept lower genuineness, r16_e3 or r64_e3 score marginally
higher on target emotion.
Use the usual dose band β 0.35β0.75. Above ~1.0 genuineness and intelligibility collapse.
Usage
import torch
from transformers import AutoModel, AutoProcessor
from peft import PeftModel
REPO = "laion/moss-tts-local-transformer-4.55b-voice-acting-v2"
proc = AutoProcessor.from_pretrained(
REPO, trust_remote_code=True,
codec_path="OpenMOSS-Team/MOSS-Audio-Tokenizer-v2")
model = AutoModel.from_pretrained( # AutoModel, NOT AutoModelForCausalLM
REPO, trust_remote_code=True,
dtype=torch.bfloat16, attn_implementation="sdpa").cuda().eval()
model = PeftModel.from_pretrained(model, "laion/moss-mediathek-emotion-lora/r64_e2").eval()
conv = [[proc.build_user_message(
text="Ich habe wirklich alles versucht.", # spoken words ONLY
instruction='GENERAL: A tired middle-aged man, close mic.\n'
'SCRIPT:\n(quietly, on the edge of giving up) "Ich habe wirklich alles versucht."',
language="German",
tokens=6)]]
b = proc(conv, mode="generation")
out = model.generate(input_ids=b["input_ids"].cuda(),
attention_mask=b["attention_mask"].cuda(),
max_new_frames=400, do_sample=True,
audio_temperature=1.0, audio_top_p=0.95, audio_top_k=30)
wav = proc.decode(out)[0].audio_codes_list[0].cpu().float().numpy() # 48 kHz
Notes that will otherwise cost you an afternoon:
- Load the base with
AutoModel, notAutoModelForCausalLM. - Missing
audio_lm_heads.*/text_lm_head.weightwarnings on load are benign. instructionholds the wholeGENERAL: β¦\nSCRIPT:β¦caption;textholds only the spoken words. Empty fields render as the literal string"None".
Training
| base | laion/moss-tts-local-transformer-4.55b-voice-acting-v2 |
| data | emotion-selected German Mediathek speech (real recordings) |
| held-out set | 400 clips |
| LoRA alpha | 128 |
| dropout | 0.05 |
| ranks | 16 / 32 / 64 |
| epochs | 1 / 2 / 3 |
A methodological note
Checkpoints here are ranked by generating audio and scoring it, not by validation loss. On a sibling run, validation loss rose from 4.42 to 5.44 across epochs 1β8 β which reads as severe overfitting β while listeners scored the two checkpoints identically. Validation loss has now disagreed with listening three times on this model family. Do not select checkpoints with it.
Links
- Manual: https://laion-ai.github.io/moss-voiceacting-manual/
- Pipeline notes: https://github.com/LAION-AI/Voice-Acting-Pipeline-WIP
- Emotion LoRAs (LAION's Got Talent): https://huggingface.co/TTS-AGI/moss-emotion-loras-v3
- Vocal-burst LoRAs: https://huggingface.co/laion/vocal-burst-lora-adapters
- Downloads last month
- -