alt.freeweights.speech / moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
From: laion <huggingface.co/laion>Newsgroups: alt.freeweights.speechSubject:

moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo

Date: 2026-11-14Commit: c2feebcSigned: 2DC28CC7B26A283B ✓

Text to speech model with 4.1B parameters. Safetensors weights, 8.28 GB in all. Published by laion under CC-BY-4.0.

4.1B params8.28GBmoss-tts-local-transformer-4.55b-voice-acting-v2-sft-dposafetensorspermissive
FactsParams4.1BSize8.28 GBFormatssafetensorsTasktext to speechLicenseCC-BY-4.0From sourcepermissive
$ fw get laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
# manifest sha256 42bc2cbe87dd… · 8.28 GB · 20 files
$ fw verify ./moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
From sourceHosted (signed)laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpoLast check: 2026-11-14 21:34 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Fine-tune of moss-tts-local-transformer-4.55b-voice-acting-v2-sft.

Works with

Overview

Size
8.28 GB
Weights
8.26 GB (safetensors)
Parameters
4.1B
Formats
safetensors
Task
text to speech
License
CC-BY-4.0 (permissive)
Files
20, each with a sha256
Publisher
laion
Added
2026-11-14
Section
alt.freeweights.speech
Lineage

Original release from the publisher.

Base model: laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-14 21:34 UTCpassed

Model card

From the publisher at commit c2feebc. Shown as plain text with links; images open at the publisher.

MOSS Voice-Acting 4.55B — SFT + DPO (full-parameter)#

Full-parameter preference tuning of the SFT model. All 4.13 B parameters were updated in both stages — this is not an adapter and not a merge of one. It is the SFT + DPO full track on the sample grid.

By Christoph Schuhmann and LAION.

Two training stages on top of laion/moss-tts-local-transformer-4.55b-voice-acting-v2:

  1. SFT — all 4.13 B parameters, 3 epochs over 3,147,802 annotated utterances (…-v2-sft).
  2. DPO — full-parameter preference tuning of that checkpoint on 7,410,723 preference pairs. A rank-64 LoRA alternative trained on the same data and objective is published separately as …-v2-dpo-lora.

In informal listening this is the best of the three (base / SFT / SFT+DPO) on most prompts.


What is and is not established#

claimevidence
SFT improved held-out likelihoodval loss 4.7076 → 4.6314, monotone across all 12 evaluations, on both constituent datasets independently
SFT+DPO sounds bestinformal listening on the shared sample grid; no MOS study, no blind test
the DPO stage is not over-optimisedit partly is — see below
the DPO stage actually changed the weights357 of 425 tensors differ from the SFT base, max relative delta 1.70e-03; recorded in provenance.json in this repo
the run completedit did not — see below

The run stopped early, and that is worth knowing before you use this. It reached step 123 of 988 — one eighth of the planned epoch — wrote its checkpoint, and then died: an ALLREDUCE of 24,916,480 elements timed out after 600 s across 256 ranks immediately following that save, and NCCL aborted the job (EXIT=134). The checkpoint itself is complete and loads and generates normally; there is simply no later one. Full-parameter DPO here shards its Adam state with ZeroRedundancyOptimizer (a second frozen reference copy plus fp32 master weights, gradients and moments would otherwise need 74.3 GB before a single activation), and a ZeRO-sharded optimizer state is not written by save_state, so the run was never resumable either.

The DPO caveat, stated plainly. On this preference set, DPO over-optimises: preference accuracy climbs to 0.994 while reward(chosen) — the implicit reward on the preferred sequence — falls to −2.39, meaning the policy makes the good audio less likely too, only less so than the bad. This checkpoint's single evaluation reads val_loss = 0.9394, preference accuracy 0.8965, reward(chosen) = −0.264, reward(rejected) = −13.549. It is flagged unhealthy by that rule. Stopping at step 123 is, by accident, close to where the LoRA variant's checkpoint selection independently landed (step 246 of

  1. — in the LoRA run reward(chosen) fell monotonically from −0.111 to −2.385 over the

following 615 steps, so a completed run would very likely have been worse, not better.

Preference accuracy is not a health metric here. It was highest exactly where the model was most degraded.


Training summary#

Stage 1 — SFT#
samples seen9,443,406 sample-passes (3,147,802 × 3 epochs)
peak LR7e-6, cosine, warmup over the first half of epoch 1, decayed to 10 %
optimizerAdamW, β (0.9, 0.95), ε 1e-8, weight decay 0.1, clip 1.0
precisionfp32 master weights, bf16 compute
global batch4,096 samples · 2,232 steps
hardware64 nodes × 4 GH200 = 256 GPUs, 1 h 53 min
losschannel-wise cross-entropy, 1 : 32 stop-channel vs the 12 audio codebooks

Every micro-batch was exactly half voice profiles / half real speech — the sampler alternates strictly rather than mixing in expectation (verified 0.5000 / 0.5000 on 20 real batches). Measured 7.75 distinct voices per 8-sample batch, no voice above 25 % of a batch.

Stage 2 — DPO (full-parameter)#
trainableall 4.13 B parameters
objectiveDPO, length-normalised, β = 30, chosen-NLL anchor 0.013
peak LR5e-7, cosine, 10 % warmup
optimizerAdamW, ZeroRedundancyOptimizer (Adam state sharded across 256 ranks)
shipped step123 of 988 (the run aborted immediately after this checkpoint)
global batch2,048 pairs per step, 64 nodes × 4 GH200

Length normalisation is load-bearing: 85.6 % of the raw preference pairs differ from the chosen sequence mainly in LENGTH, and an unnormalised summed log-probability reached 1.000 preference accuracy at step 102 of 1194 by counting tokens. The length families were also downsampled to length_keep = 0.16, which keeps all 1,064,594 emotion pairs and raises emotion from 14.4 % to ≈51 % of the mix.

The anchor weight 0.013 is not a guess: -logp is ≈54 nats per position here, because each supervised position carries 13 channels (12 codebooks + the binary stop head). A first attempt at 0.25 put the anchor at ≈13.6 against a DPO term of 0.69 and turned the run into an SFT pass.


Prompt format#

Identical to the SFT model's — the DPO stage used the same prompt library (format hash 3d8a696ccec4a98f), which is what lets the two stages compose at all.

<user_inst>
- Reference(s):
{<|audio|>  |  Speaker: <name>  |  None}
- Instruction:
{caption}
- Tokens:
{target frame count, 12.5 fps}
- Quality:
None
- Sound Event:
None
- Ambient Sound:
None
- Language:
{English | German}
- Text:
{[7.3 seconds duration] }{transcript}
</user_inst>
elementtraining distribution
Reference slotreference audio 50 % / Speaker: <name> 50 % for voice profiles; reference-or-None for real speech
Instructionfour surfaces: one of 16 rendered caption templates (30 %), GENERAL: …\nSCRIPT:\n… (45 %), GENERAL: only (15 %), SCRIPT: only (10 %)
Duration tag[7.3 seconds duration] prefixed to the text on 50 % of samples
Inline burst cuesparenthesised cues such as (laughs) present, stripped from both text and caption on 10 % of samples

The duration tag is spoken duration — last word offset minus first word onset — not clip duration. Clip duration overstates it by ~1.05 s on voice profiles and ~0.40 s on real speech because of leading and trailing silence; tag with clip duration and the model will pad.

Reference audio is passed as codec codes, [T, 12] int64, in audio_codes_list. No audio tokenizer is needed at inference for conditioning.


Usage#

import torch
from transformers import AutoProcessor, AutoModel

REPO  = "laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo"
CODEC = "OpenMOSS-Team/MOSS-Audio-Tokenizer-v2"

proc  = AutoProcessor.from_pretrained(REPO, trust_remote_code=True, codec_path=CODEC)
model = AutoModel.from_pretrained(REPO, trust_remote_code=True,
                                  dtype=torch.bfloat16,
                                  attn_implementation="sdpa").cuda().eval()

msg = proc.build_user_message(
    text="[4.2 seconds duration] I really did not see that coming.",
    instruction="GENERAL: A young adult feminine voice; delivery is bright and quick; "
                "affect is positive, animated.\nSCRIPT:\n\"I really did not see that coming.\"",
    tokens=53,                      # 4.2 s x 12.5 fps
    language="English")

batch = proc([[msg]], mode="generation")
out = model.generate(input_ids=batch["input_ids"].cuda(),
                     attention_mask=batch["attention_mask"].cuda(),
                     max_new_frames=400, do_sample=True,
                     audio_temperature=1.0, audio_top_p=0.95, audio_top_k=50,
                     audio_repetition_penalty=1.0)

wav = proc.decode(out)[0].audio_codes_list[0]        # 48 kHz waveform
import soundfile as sf
sf.write("out.wav", wav.float().cpu().numpy(), int(proc.model_config.sampling_rate))
Cloning a voice from a reference clip#
codes = proc.audio_tokenizer.encode(wav48k)          # [T, 12] int64 at 12.5 fps
msg = {"role": "user",
       "content": prompt_text_with_audio_placeholder, # "<|audio|>" in the Reference(s) slot
       "audio_codes_list": [codes]}

Keep the reference under ~25 s; the training pipeline capped references at 320 frames.

Naming a voice instead#

Put Speaker: <name> in the Reference(s) slot. The 500 profile names the model was trained on are listed with laion/moss-voice-profile-loras-500; a name outside that set is out of distribution.


Training data#

Annotation source: laion/laion-voice-profiles-annotated.


If you want to merge the LoRA variant instead — do not use merge_and_unload()#

Measured, because it is a silent failure. The 12 audio_lm_heads are weight-tied to the audio embeddings — tie_weights() assigns head.weight = embedding.weight, the same tensor object. The rank-64 adapter targets those heads, so folding W ← W + BA writes the head update into the embeddings as well:

audio_lm_heads.0.weight    max|ΔW| = 6.103515625e-05     (the merge)
audio_embeddings.0.weight  max|ΔW| = 6.103515625e-05     (same tensor)
transformer.embed_tokens.weight  max|ΔW| = 0.0           (not a LoRA target, correct)

The result loads, generates, and sounds like speech — and is a different function from the adapter: on the same input, the final hidden state differs with rms 0.107 against a signal rms of 2.518, 4.3 %. Use the adapter unmerged, or use this full-parameter model.

Known faults, and what is being done about them#

Both are audible and both have an identified cause:

  • Vocal bursts run too long. The training prompts named a burst ((sigh)) without ever saying how long it should last, so nothing constrains its length. Additionally, 39.4 % of the parenthetical cues in the voice-profile corpus are synthesis directions the burst detector never confirmed — a cue with no corresponding audio.
  • Occasional unprompted content. Better than the base model and better than SFT alone, but present. Nothing in the prompt states a per-utterance time budget.

A follow-up round replaces the single clip-level duration tag with a full timed script — a per-sentence [12.0 seconds duration], an explicit [0.6 seconds pause] for every silence over 200 ms, and (contented sigh, 0.4 seconds) for every burst — built from word-level timestamps and detected burst spans only.

Other limitations#

  • English and German only.
  • Validation loss is not audio quality. No MOS study, intelligibility benchmark or speaker-similarity re-measurement has been run.
  • The SFT stage saw the synthetic half ≈3.93× and the real half ≈2.42×, a consequence of balancing every batch across two unequal datasets.
  • The DPO stage covered 12.5 % of one epoch. Whatever it learned, it learned from 251,904 preference pairs, not 7.41 M.
  • Inherits the corpora's biases in speaker demographics, recording conditions and emotion labels.
  • The 12 audio LM heads are weight-tied to the audio embeddings, as in the base model.

Intended use#

Research on expressive and controllable speech synthesis. Not validated for, and should not be used for, generating speech attributed to a real person without their consent, or for any application where a synthetic voice could be mistaken for a specific individual.


Licence and attribution#

Released under CC-BY-4.0 by Christoph Schuhmann and LAION.

Derived from laion/moss-tts-local-transformer-4.55b-voice-acting-v2 (Apache-2.0), whose notice is preserved. The MOSS-TTS architecture and the MOSS-Audio-Tokenizer-v2 codec originate with the OpenMOSS team.

@misc{schuhmann2026mossva_sftdpo,
  title  = {MOSS Voice-Acting 4.55B --- SFT + DPO (full-parameter)},
  author = {Schuhmann, Christoph and {LAION}},
  year   = {2026},
  url    = {https://huggingface.co/laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo},
  note   = {Full fine-tune on 3.15M utterances plus full-parameter DPO; CC-BY-4.0}
}

Files

20 files · 8.28 GBWeights 8.26 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 20 files with their sha256
FileSizesha256
.gitattributes1.57 KB34448b82c17d60fec9b65b1f093c115ddbaadc04beb1b0140b6bfed2e012a930
README.md13.5 KB039635fd7281f4119f125baddeae25315ebae01711c6311a2154694b9a92974f
__init__.py254 Bfa22d925207c64e6701f9c5f97c3e14a9bad4db5c37060c6e5f1362c02bc8040
added_tokens.json790 B39bb49db6acfb8e7510b1640f575bdc183f511d85c94ce3ee967f2a6195c4a8a
chat_template.jinja4.17 KBa55ee1b1660128b7098723e0abcd92caa0788061051c62d51cbe87d9cf1974d8
config.json6.99 KBced0e41ba4ea840212721e3b25f1ca857c2939901be7564f1c9060c9a955790f
configuration_moss_tts.py7.16 KBab6debcb92032cb9dc91ae80aed77dbadd2e59848208baef2b062bd6def3f3be
generation_config.json95 B2272170751602ba1a917710468548e6c4102325f85277fe5fcc5936f56c42f48
gpt2_decoder.py30.9 KBf2e877104669f1e6c7cd34680f0da1a8a159e032123ee56b660b63929b6c8989
merges.txt1.67 MB8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5
model.safetensors8.26 GB5394db563ef953794d03837e21a62fed7bd8d79c60118ba5e7a4e4b7b2e9c1fe
modeling_moss_tts.py26.4 KBb0a66211943ae580b087f3e71495fea2f455701a4f6c29b6d3562218f7668c5f
processing_moss_tts.py37.5 KB059637b92e7eb9a67df531fe9578e9554d456195828b223eb81f21117c58e8f8
processor_config.json209 Bfac7289af2a37d988d708d813c92960e5e91c59d348c17b72c6aa6b86859f2b7
provenance.json338 Bb884cce7af04ccf9d0a0c51f40ad0441d5acaa76ad4e62c28c19c452feb9b559
qwen3_decoder.py25.5 KB100163bd7ecf31a59bafacc0b032ace9339edc992a3eb4cc80662502e04e46f0
special_tokens_map.json394 B02a153514db64e5378c53ef164c960409882649de6f4aac8f81f66218e7f8797
tokenizer.json11.4 MB06902d1fb775216338802205886a24bc715ccc606bd872a892e3d3c83ca1b9e2
tokenizer_config.json5.73 KBec2869dd4c9c7155b3460c291a6fb2b955e5068013ba7efbcaafd1c61e02abce
vocab.json2.78 MBca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
c2feebc740 pinned now manifest updated, same commit2026-11-14 21:34 UTC20 files · 8.28 GB
c2feebc7402026-11-14 21:34 UTC20 files · 8.28 GB

Use it

$ fw get laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
# manifest sha256 42bc2cbe87dd… · 8.28 GB · 20 files
$ fw verify ./moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json --dir ./moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo $ python3 fw.py verify ./moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo ./laion__moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo --revision c2feebc7405ff3071843d99c79dcb594d673c5f0 --local-dir ./moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo

License

Name
Creative Commons Attribution 4.0
Id
CC-BY-4.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-14
Text in
README.md
Text sha256
039635fd7281f4119f125baddeae25315ebae01711c6311a2154694b9a92974f
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: laion <huggingface.co/laion>Newsgroups: alt.freeweights.speechSubject: moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpoDate: 2026-11-14Commit: c2feebcSigned: 2DC28CC7B26A283B ✓
Upstream
laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
Pinned commit
c2feebc7405ff3071843d99c79dcb594d673c5f0
Manifest
moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json · .minisig
Manifest sha256
42bc2cbe87dd9cb7674912766f063b9dd92965cdf371500d7f832d3e4a8a87f1
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-14 21:34 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json $ curl -O https://freeweights.allternit.com/manifests/laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json.minisig $ minisign -Vm moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft · this model is a finetune of it

No model in the catalog names this one as its parent.

Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download laion/moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. moss-tts-local-transformer-4.55b-voice-acting-v2-sft-dpo.json. Provenance. Takedown history: none.
From: MIT <huggingface.co/MIT>Subject: ast-finetuned-audioset-10-10-0.4593
From: onnx-community <huggingface.co/onnx-community>Subject: ast-finetuned-audioset-10-10-0.4593-ONNX
From: Edge0 <huggingface.co/Edge0>Subject: Audio8-TTS-Preview-0.6b
From: Edge0 <huggingface.co/Edge0>Subject: Audio8-TTS-Realistic-Air
From: facebook <huggingface.co/facebook>Subject: audiobox-aesthetics
From: mlx-community <huggingface.co/mlx-community>Subject: chatterbox-4bit