OGG TTS

Expressive multilingual text-to-speech with block diffusion

Playground GitHub Languages Parameters Built with Fish Audio

Preview release. This is checkpoint 40k of a 400k-step pre-training run that is still in progress. The model already speaks intelligibly in all 8 languages, while voice similarity, tag control and multi-speaker scenes keep improving. Updated checkpoints will be published as new revisions of this repository; the 20k preview stays available in the history.

Overview

OGG TTS is a 0.8B-parameter zero-shot text-to-speech model trained on about 8,000 hours of professionally acted speech in English, Polish, Spanish, German, Russian, French, Portuguese and Italian.

It generates discrete tokens of the Fish Audio 44.1 kHz codec with block diffusion:

  • each block of 0.74 s is produced in parallel by iterative unmasking;
  • blocks follow one another left to right, so audio can be streamed as soon as the first block is ready.

The backbone is initialised from OmniVoice (Qwen3-0.6B, masked discrete diffusion). A lightweight multi-token prediction (MTP) decoder then fills in the acoustic detail of the block, also by iterative unmasking.

The name comes from the trolls of The Witcher. OGG is the first of three architectures (OGG, ROGG, POGG) that we compare in an upcoming technical report.

Highlights

  • Expressive by default. The model is trained on audiobook productions with full voice casts and on AAA game dialogue, so it reads with natural, context-appropriate emotion.
  • Optional inline tags. 24 tags for emotion, delivery and vocal events, placed exactly where they should take effect.
  • Zero-shot voice cloning. From a few seconds of reference audio, or one of the built-in speaker identities without any prompt.
  • Multi-speaker scenes. A whole dialogue is generated in a single pass, with natural turn-taking and pauses.
  • Streaming. Finished blocks never change and can be played immediately.

Emotion and expression tags

Tags are optional. Without them the model infers the delivery from the text and its context. With them it follows the requested emotion or sound at the given position:

[frustrated] Not againโ€ฆ [sighing] Fine, I'll do it myself.
[scared] [whispering] Someone is hereโ€ฆ
[shouting] Run! They're right behind us!
Group Tags
Emotion [angry] [frustrated] [excited] [tired] [playful] [sad] [scared] [shouting]
Delivery [whispering] [softly] [voice breaking] [singing] [pause] [slowly]
Vocal events [laughing] [sighing] [gasping] [panting] [coughing] [clears throat] [sniffling] [scoffing] [yawning] [humming]

The labels come from an audio-language-model pass over 502,668 sentences, i.e. the audio with its transcript, under a closed list of 24 tags. The model was instructed to tag only what is audible in the recording, never what the text alone suggests. 57,016 sentences (11 %) received at least one tag; the rest carry a checked transcript without tags, so the model also learns when not to add an effect. Tags are dropped from part of the training samples, which keeps them optional at inference time.

Tag Examples Tag Examples Tag Examples
[shouting] 19,407 [laughing] 2,621 [tired] 708
[angry] 10,287 [scared] 1,847 [slowly] 419
[frustrated] 5,565 [whispering] 1,502 [clears throat] 356
[pause] 4,065 [playful] 1,380 [humming] 346
[excited] 3,980 [gasping] 1,266 [coughing] 333
[sighing] 3,738 [scoffing] 1,010 [panting] 248
[sad] 894 [voice breaking] 144
[softly] 887 [singing] 95

Rare tags ([singing], [yawning] 59, [sniffling] 46) have too few examples to be reliable. Tag control is still weak in early checkpoints and strengthens as pre-training continues.

Model architecture

Component Details
Backbone OmniVoice / Qwen3-0.6B, 28 layers, d = 1024. Bidirectional attention within a block, block-causal across blocks; earlier blocks are seen with all 10 codebooks
Acoustic decoder MTP: 9 chained transformer layers, one per residual codebook, 164M parameters; each layer unmasks its codebook over the frames of a block (masked prediction), seeing the codes already decided
Total parameters ~0.81B (codec excluded)
Audio codec Fish Audio Drama 3 / S2 codec, 44.1 kHz, 21.5 frames/s, 1 semantic codebook (4096) + 9 residual codebooks (1024)
Block size 16 frames (0.74 s)
Decoding 6 confidence-ordered unmasking iterations per block with classifier-free guidance, then the MTP unmasks the 9 residual codebooks of the block in 4 rounds each; KV cache, ~0.17 real-time factor on one GPU
Length predicted by the model (end-of-speech token)

Usage

Requires the code from GitHub, the OmniVoice weights (k2-fsa/OmniVoice) and the Fish Audio codec (codec.pth from fishaudio/drama-3).

git clone https://github.com/FashionFlora/ogg-tts && cd ogg-tts
git clone https://github.com/fishaudio/fish-speech ogg_tts/fish-speech
export OMNIVOICE_PATH=$(huggingface-cli download k2-fsa/OmniVoice)
export FISH_CODEC_PATH=$(huggingface-cli download fishaudio/drama-3 codec.pth)
import sys, torch
sys.path.insert(0, "ogg_tts")
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
import omnifish as of, infer_omnifish as inf, fish_codec as fc

model, tok = of.OmniFish.from_omnivoice()
model.load_state_dict(load_file(hf_hub_download("FashionFlora/ogg-tts", "model.safetensors")))
model, codec = model.cuda().eval(), fc.load_codec("cuda")

codes = inf.generate(model, tok, None, "", "[sighing] Hello! I am OGG, a text to speech model.", "en",
                     steps=6, cfg=2.0)
audio = fc.decode(codec, codes[None].cuda())[0].float().cpu().numpy()   # 44.1 kHz

For voice cloning, pass the reference audio's codes (fc.encode) together with its transcript. For a dialogue, give one prompt per voice and mark the turns:

ptext = "<|quad_start|>S1<|quad_end|>transcript of prompt 1 <|quad_start|>S2<|quad_end|>transcript of prompt 2"
scene = of.dialogue_text([("S1", "Did you hear that?"), ("S2", "Hear what?"), ("S1", "Someone is following us.")])
codes = inf.generate(model, tok, torch.cat([codes1, codes2], 1), ptext, scene, "en", speaker="dialogue")

Training data

About 8.2k hours of studio-quality speech from 584 audiobooks and games, 16,628 speakers:

Sentences 6.1M
Speech (sentence audio, without inter-sentence pauses) ~7,200 h
Codec frames (21.5 Hz) 559M
Codec tokens (10 codebooks) 5.6B
Text tokens (Qwen3 tokenizer) ~112M
Language Hours Speakers (โ‰ฅ 10 min)
English ~2,610 986
Polish ~1,300 359
Spanish ~820 473
German ~750 217
Russian ~645 237
French ~500 192
Portuguese ~300 165
Italian ~290 90

Sources:

  • multi-cast audiobook productions (full voice casts and sound design, with music and effects removed);
  • single-narrator audiobooks;
  • the voiced dialogue of four AAA games.

Processing:

  • vocal source separation;
  • sentence segmentation;
  • diarisation and speaker grouping;
  • a sentence-level speaker-verification pass over 1.85M lines;
  • transcript verification and spoken-form normalisation with an audio-language model.

Training

Hardware 1ร— NVIDIA RTX PRO 6000 Blackwell (96 GB)
Schedule 400k steps, 16k tokens per step, AdamW, cosine decay, bf16
Throughput ~190 hours of audio per training hour
Audio seen 22k hours over the full run (1.7B frames, ~17B target codec tokens)
Sequence tokens 6.6B (400k steps ร— 16k tokens: text, prompt and target frames)

Compute and cost

Stage GPU time Cost
Codec tokenisation (8.2k h) 28 h $95
Sentence-level speaker verification 12 h $40
Experiments: pilot, 5 discarded runs, batch-size tests 20 h $70
Pre-training, 400k steps (estimated) 113 h $380
Total ~173 h ~$580

GPU cost is computed at the AWS on-demand rate for g7e.2xlarge (~$3.36/h).

Annotation Volume Cost
Transcript verification and audio tags (audio-language model) 502,668 sentences, ~324M tokens (253M input, 71M output) ~$455

At list prices (Gemini Flash, $0.75 / $3.75 per 1M input / output tokens). Data preparation on CPU (source separation, segmentation, diarisation) is not included. The figure includes the prompt iterations: three versions of the annotation prompt, and the emotion tags were re-done once after [frustrated] was added to the list.

Experiments. Before the final run we trained five shorter runs that were stopped and discarded:

  • a first model without block diffusion (16.6k steps), which showed that the OmniVoice backbone adapts to the Fish Audio codec;
  • a block-diffusion run of 38k steps, the reference for the final recipe;
  • three short runs (2kโ€“4k steps) that tested the data pipeline: speaker-change-centred dialogue scenes, continuous single-speaker windows and the unmasking MTP decoder.

Together with the pilot and the batch-size tests they took about 20 GPU hours (~$70), so roughly an eighth of the GPU budget went into experiments that did not end up in the release.

Final cost of the released model (complete 400k-step run, projected from the measured training speed):

GPU time Cost
Final model: tokenisation, speaker verification, pre-training 400k steps ~153 h ~$515
Annotation (transcripts and tags) ~$455
Final model total ~$970
Experiments (not part of the release) 20 h ~$70
Project total ~173 h ~$1,040

All of it on a single GPU, in about a week of wall-clock time.

Evaluation

Evaluation is in progress and will be reported with the final checkpoint.

  • Benchmarks: Seed-TTS (EN) and CV3 (PL, DE, FR, ES, IT, RU, PT).
  • Metrics: WER/CER, speaker similarity, UTMOS, tag compliance, real-time factor.

Limitations

  • Preview checkpoint: speaker similarity is not yet final, and the model may still mispronounce rare names.
  • Italian and Portuguese have the least training data.
  • Rare tags are not reliable yet.
  • Multi-speaker scenes with several very short turns can still drop a line in this checkpoint.

License and responsible use

  • Fish Audio codec. The model generates Fish Audio codec tokens and needs the Fish Audio codec to produce audio. Use is subject to the Fish Audio Community License (see NOTICE).
  • Real voices. Do not use OGG TTS to imitate the voice of a real person without their consent, to impersonate, deceive, defraud or harass anyone, or to create sexual content involving minors.
  • Training data. It contains copyrighted recordings, and the weights are released for research.

Citation

@misc{oggtts2026,
  title  = {OGG TTS: Expressive Multilingual Text-to-Speech with Block Diffusion},
  author = {FashionFlora},
  year   = {2026},
  url    = {https://huggingface.co/FashionFlora/ogg-tts}
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Safetensors
Model size
0.8B params
Tensor type
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for FashionFlora/ogg-tts

Finetuned
Qwen/Qwen3-0.6B
Finetuned
k2-fsa/OmniVoice
Finetuned
(79)
this model

Space using FashionFlora/ogg-tts 1