Reverb-TTS / README.md
IS02's picture
Update README.md
b3aac15 verified
|
Raw History Blame Contribute Delete
6.2 kB
metadata
license: cc-by-nc-4.0
language:
  - en
  - de
  - fr
  - es
  - it
  - pl
  - pt
base_model: k2-fsa/OmniVoice
pipeline_tag: text-to-speech
tags:
  - text-to-speech
  - voice-cloning
  - zero-shot

Reverb-TTS

Reverb is a text-to-speech model designed for high-quality voice cloning. Built on top of one of the leading open-weight TTS models, it combines an exceptional quality of mimicking any reference speaker, including prosody, emotions and voice timbre, while staying lightweight and fast enough to run locally on mobile and desktop devices.

What is Reverb?

Reverb starts from OmniVoice, a 0.6B masked-diffusion TTS model that fills in a grid of audio-codec tokens over several passes, conditioned on the text and on a reference speaker's audio. We made Reverb from it in three stages:

  1. Pruning with distillation. 4 of the 28 transformer layers are removed, the feed-forward layers shrink from 3072 to 2048, and the text vocabulary from 151,676 to 62,035 tokens. The pruned model learns to match OmniVoice's predictions.
  2. Supervised retraining in Reverb's seven languages, on cleaned and selected subsets of open speech datasets such as Emilia and variants of YODAS2, such as yodas2-sidon.
  3. RLHF-style post-training: several rounds of iterative DPO with an automatic judge fitted on human preference rankings.

The result has 297M parameters, less than half of OmniVoice's 613M. Additional performance improvements let it generate speech 10× to 20× faster than the original model.

How Reverb is made: OmniVoice is pruned and distilled, retrained on seven languages, then refined with iterative DPO against a critic fitted on human preference rankings.

Quality, size and speed

We compare Reverb with open-weight voice-cloning models on the MiniMax Multilingual Test Set, restricted to Reverb's seven languages: 700 sentences, 100 per language, each spoken in the voice of one of two reference speakers of that language. Every model generates one take per sentence with its default settings. WER (Whisper large-v3) and speaker similarity (SIM-o) come from OmniVoice's evaluation scripts and are averaged over the languages.

Model Parameters (model + codec decoder) WER ↓ SIM-o ↑
Reverb 319M 1.35% 0.818
OmniVoice 634M 1.64% 0.835
Audio8-TTS-Realistic 732M 1.97% 0.750
Qwen3-TTS 0.6B Base 1,020M 11.96%¹ 0.781
Qwen3-TTS 1.7B Base 2,031M 1.52%¹ 0.781
VoxCPM2 2,336M 1.55% 0.810

Parameters count the generating model and the decoder of its audio codec; encoders used only to process the reference recording are not counted.
¹ Qwen3-TTS does not support Polish, so its WER is averaged over the other six languages.

Generation speed, in × real time (seconds of audio per second of compute; higher is better), on MiniMax English sentences. Timing runs from the text and an already-encoded reference voice to the waveform, codec decoding included. Every model runs its default settings in bf16.

Hardware Reverb OmniVoice Audio8 Qwen3-TTS 0.6B Qwen3-TTS 1.7B VoxCPM2 Fish S2 Pro
NVIDIA RTX 5090, batch 32 164.9× 13.2× 4.2× 3.3× 4.0× 3.0ײ 0.18ײ
Apple M4 Pro, batch 1 21.6׳ 0.84× 0.76× 0.51× 0.52× 0.69× –

² No batched generation: sentences run one at a time.
³ Reverb's ExecuTorch MLX program (fp16) with the Core ML codec decoder. In PyTorch on the GPU (MPS), as the other models run on the M4 Pro: 12.3×.

Usage

pip install reverb-tts
import soundfile as sf
from reverb_tts import TTS

tts = TTS.from_pretrained("software-mansion/Reverb-TTS")
voice = tts.voice("reference.wav", "The exact transcript of the reference recording.", language="en")
audio = tts.generate("Hello! This is my cloned voice.", voice, language="en")
sf.write("output.wav", audio, tts.sample_rate)

The reference should be 3 to 20 seconds of clean speech from one speaker, with its exact transcript. Languages: en, de, fr, es, it, pl, pt.

Model variants

Variant Weights Activations Size
fp32 fp32 full precision 1.19 GB
int8 (default) int8, one scale per output channel full precision 307 MB
int8a8 int8, one scale per output channel int8, one scale per token 307 MB
int4 int4, one scale per group of 32 inputs full precision 191 MB

Select one with TTS.from_pretrained(..., variant="int4"). The weights are in model/safetensors/<variant>/. In automatic scoring, int8 and int8a8 show no measurable loss against fp32, and int4 a small one. ExecuTorch programs for on-device use are in model/executorch/: MLX (Apple GPUs) in fp16, int8 and int4, and Vulkan (Android GPUs) in int4. voices/ holds ready-made reference voices.

License and acknowledgments

  • Code: Apache 2.0; see LICENSE.
  • Model weights: CC BY-NC 4.0, for non-commercial use with attribution.

Reverb's weights were initialized from OmniVoice by the k2-fsa team, and its target-length rule and prompt format come from OmniVoice's code. We thank its authors for releasing the model and code openly. Reverb uses the Higgs Audio v2 tokenizer as its audio codec, and Verbalis prepares its text.