Views
No views yet
laion/moss-tts-local-transformer-4.55b-voice-acting
— and running further supervised fine-tuning on additional synthetic voice-acting data. The
extra data was self-generated with the model family and filtered with a Best-of-N reward
(a lightweight VoiceCLAP-based genuineness + vocal-burst-blend + character reward that keeps only the
strongest of many candidate takes per prompt), so the model learns from its own highest-quality
performances — more consistent character delivery, more natural vocal bursts, and cleaner emotional
range. It remains a full 4.55-billion-parameter local-transformer MOSS variant at 48 kHz and
is a drop-in replacement for the previous release (same architecture, tokenizer, and prompt
format).laion/moss-tts-v1.5-8b-voice-acting.| this model — 4.55B local transformer | 8B delay | |
|---|---|---|
| architecture | moss_tts_local, 12-codebook RVQ | moss_tts_delay, 32-codebook RVQ |
| audio tokenizer | OpenMOSS-Team/MOSS-Audio-Tokenizer-v2 — 48 kHz | OpenMOSS-Team/MOSS-Audio-Tokenizer — 24 kHz |
| output | native 48 kHz (use raw — no post-processing needed) | 24 kHz (optionally band-width-extended with Sidon) |
| why pick it | higher audio bandwidth out of the box, fewer codebooks to predict per frame, smaller/faster (~0.87 s per 15 s clip at batch 64 on one A100) | larger capacity |
pip install "transformers>=4.45" torch torchaudio safetensors huggingface_hubOpenMOSS-Team/MOSS-Audio-Tokenizer-v2) is pulled automatically.
~10 GB VRAM (bf16 + codec).GENERAL: / SCRIPT: + plain textinstruction = the performance direction, written as two labelled blocks:
GENERAL: — the overall voice: age / gender / timbre / mood / delivery. For the most natural
result, also state that it is a pristine, high-quality studio recording with no background noise
and a genuine, spontaneous delivery ("like a real person in a real moment, not acted").SCRIPT: — the spoken lines again, annotated in position with (delivery cues), vocal
bursts such as (a soft laugh) / (gasp) / (sigh), and [pause] markers. The emotional arc can
change line-by-line here — this is where you direct the performance.text = just the plain spoken words — no cues, no brackets.text, cue-annotated inside the SCRIPT block) — this is
intentional and matches the training data. These two strings map directly onto generate(text=..., instruction=...) in the inference example below.1instruction =
2GENERAL: <one or two sentences: voice / age / gender / timbre / mood / delivery arc; note "pristine high-quality studio recording, genuine and spontaneous">
3SCRIPT:
4(cue, cue, ...) first line of dialogue [pause] rest of the line
5(cue, cue, ...) second line of dialogue
6...
7
8text =
9<exactly the same spoken words, plain — no cues, no (), no []>1instruction =
2GENERAL: A young man's voice — bright, warm and overjoyed, then it curdles into shocked disbelief and finally erupts into loud, aggressive, disgusted ranting. Completely natural and spontaneous, like a real person in a real moment, not acted. Pristine high-quality studio recording, no background noise.
3SCRIPT:
4(lighting up, warm, breathless with delight) Oh my god— hey! [pause] Is that really you?
5(beaming, affectionate, a soft happy laugh) I can't believe it, look at you!
6(the smile fading, confused, voice tightening) ...Wait. What is that?
7(erupting, very loud, aggressive, furious and betrayed) You actually did it?! After everything I did for you?!
8(ranting fast, seething, disgusted) God, it makes me sick. Get out of my sight.
9
10text =
11Oh my god— hey! Is that really you? I can't believe it, look at you! ...Wait. What is that? You actually did it?! After everything I did for you?! God, it makes me sick. Get out of my sight.(cue) short and place it right before the words it affects; put [pause] where you
want a real beat; describe loud/aggressive/whispered etc. explicitly in the cue to push intensity.
For a live, click-free streaming demo of this exact format, see
laion/moss-voice-acting-playground.1import torch, torchaudio
2from transformers import AutoProcessor, AutoModel
3
4REPO = "laion/moss-tts-local-transformer-4.55b-voice-acting-v2"
5DEVICE = "cuda"
6
7proc = AutoProcessor.from_pretrained(REPO, trust_remote_code=True,
8 codec_path="OpenMOSS-Team/MOSS-Audio-Tokenizer-v2")
9proc.audio_tokenizer = proc.audio_tokenizer.to(DEVICE).eval()
10model = AutoModel.from_pretrained(REPO, trust_remote_code=True,
11 dtype=torch.bfloat16,
12 attn_implementation="sdpa").to(DEVICE).eval()
13
14@torch.no_grad()
15def generate(text, instruction, language="English", reference_codes=None, n=3):
16 kw = dict(text=text, instruction=instruction, language=language)
17 if reference_codes is not None:
18 kw["reference"] = [torch.tensor(reference_codes, dtype=torch.long)]
19 best = None
20 for seed in range(n):
21 torch.manual_seed(seed)
22 batch = proc([[proc.build_user_message(**kw)]], mode="generation")
23 out = model.generate(input_ids=batch["input_ids"].to(DEVICE),
24 attention_mask=batch["attention_mask"].to(DEVICE),
25 max_new_tokens=1200, do_sample=True,
26 audio_temperature=1.0, audio_top_p=0.95,
27 audio_top_k=25, audio_repetition_penalty=1.1)
28 msg = proc.decode(out)[0]
29 if not msg.audio_codes_list:
30 continue
31 wav = msg.audio_codes_list[0] # waveform @ 48 kHz
32 if best is None or wav.shape[-1] > best.shape[-1]:
33 best = wav
34 return best
35
36wav = generate(
37 text="You dare enter my domain? Then you shall not leave alive!",
38 instruction="As a mighty orc warrior with a deep, guttural, growling voice, "
39 "bellow these words with brutal force.",
40 language="English")
41torchaudio.save("orc.wav", wav.cpu().float(), 48000)input_ids n× and calling generate once
(batch 64 → ~0.87 s/clip on an A100); use SDPA (flash-attn 2.x is incompatible with this
remote-code attention); without reference audio use audio_temperature=0.8; pass
tokens ≈ words × 6 (12.5 Hz codec frames) via build_user_message to avoid rushed pacing.
Generating N candidates and keeping the best (as in generate(..., n=...) above) is how the v2
training data itself was produced and is the recommended way to get top-quality takes.1ref_codes = proc.encode_audios_from_path(["my_reference.wav"], n_vq=12)[0]
2wav = generate(text="...", instruction="", language="English", reference_codes=ref_codes)1uv pip install sglang-omni soundfile
2hf download laion/moss-tts-local-transformer-4.55b-voice-acting-v2
3
4# NOTE the `env -u LD_LIBRARY_PATH` — without it the FIRST request SIGABRTs with
5# `undefined symbol: cudnnGetLibConfig` (a leaked cuDNN path in the stage subprocess).
6env -u LD_LIBRARY_PATH CUDA_VISIBLE_DEVICES=0 \
7 sgl-omni serve \
8 --model-path laion/moss-tts-local-transformer-4.55b-voice-acting-v2 \
9 --config examples/configs/moss_tts_local.yaml --port 80001curl -X POST http://localhost:8000/v1/audio/speech -H "Content-Type: application/json" \
2 -d '{"input": "You dare enter my lair?!", "instructions": "A furious ancient dragon, low and booming."}' \
3 --output dragon.wavtext_lm_head / audio_lm_heads "MISSING" note on load is benign weight-tying.laion/moss-tts-local-transformer-4.55b-voice-acting
· experiment overview
· GitHub.