Sopro V2 Turbo 2610: cleaner cloned voices, same 120M model, same CPU speed

Reddit r/LocalLLaMA Models

Summary

Sopro V2 Turbo is a 120M-parameter open-source TTS model with zero-shot voice cloning that streams with ~300ms time-to-first-audio on laptop CPU and runs in-browser via ONNX, reaching SOTA-level intelligibility despite its small size.

No content available
Original Article
View Cached Full Text

Cached at: 10/03/26, 05:04 PM

samuel-vitorino/sopro-v2-turbo · Hugging Face

Source: https://huggingface.co/samuel-vitorino/sopro-v2-turbo Sopro V2

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#sopro-ttsSopro TTS

BlogGitHubONNX Demo

**Compatibility:**Current model artifacts requiresopro\>=2\.2\.0or@soprotts/onnx\-web\>=0\.3\.0; upgrade withpip install \-U soproornpm install @soprotts/onnx\-web@latest.

Sopro (from the Portuguese word for “breath/blow”) is a lightweight voice-cloning text-to-speech model family. This repo shipssopro-v2-turbo, a 120M-parameter open model that streams, runs comfortably on a laptop CPU or in the browser, and reaches SOTA-level intelligibility against much larger systems. The full story, evaluations, and audio samples are in theblog post.

Main features:

  • 120M parameters
  • English, European Portuguese, French, and German
  • Streamingwith ~300 ms time-to-first-audio on a laptop CPU
  • Zero-shot voice cloningfrom 5-20 seconds of reference audio
  • 0.24 RTF offline / 0.21 RTF streamingon an M3 CPU, 0.07 RTF on an H100
  • Runs in the browservia an ONNX runtime

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#local-demoLocal demo

Run the model and open the demo with one command:

uvx --from sopro soprotts serve

If Sopro is already installed:

soprotts serve

Then navigate tohttp://localhost:7860. The model downloads on first use and stays in the Hugging Face cache. Sopro selects CUDA or CPU automatically and defaults to CPU on macOS (pass\-\-device mpsexplicitly to use MPS). Usesoprotts serve \-\-helpfor model, device, port, and CPU int8 options.

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#browser-demoBrowser demo

There is also a fully in-browser demo with no server involved:https://samuel-vitorino.github.io/sopro/. On mobile the model is quantized, so results can be slightly below the local demo, and devices with low memory may crash. The dependency-isolated ONNX runtime and exporter are documented inweb/README\.md. Both demos use the frontend indemos/web.


https://huggingface.co/samuel-vitorino/sopro-v2-turbo#installationInstallation

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#from-pypiFrom PyPI

pip install -U sopro

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#from-the-repoFrom the repo

git clone https://github.com/samuel-vitorino/sopro
cd sopro
pip install -e .

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#examplesExamples

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#cliCLI

soprotts "Sopro is a lightweight 120 million parameter text-to-speech model that streams and runs on device." --ref ref.wav --out out.wav

Add\-\-streamfor the streaming path. You have the expected\-\-temperature,\-\-top\-p, and\-\-top\-kparameters, alongside:

  • \-\-lang(en,pt,fr,de; optional, helps pronunciation on ambiguous text)
  • \-\-int8(int8 AR weights on CPU)
  • \-\-steps(acoustic solver steps; default 2)
  • \-\-max\-seconds(cap per generated segment; long text is split into segments, so total length is unbounded)

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#pythonPython

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#non-streamingNon-streaming

from sopro import SoproTTS

tts = SoproTTS.from_pretrained("samuel-vitorino/sopro-v2-turbo", device="cpu")

wav = tts.synthesize(
    "Hello! This is a non-streaming Sopro TTS example.",
    ref_audio_path="ref.wav",
)

tts.save_wav("out.wav", wav)

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#streamingStreaming

import torch
from sopro import SoproTTS

tts = SoproTTS.from_pretrained("samuel-vitorino/sopro-v2-turbo", device="cpu")

chunks = []
for chunk in tts.stream(
    "Hello! This is a streaming Sopro TTS example.",
    ref_audio_path="ref.mp3",
):
    chunks.append(chunk.cpu())

wav = torch.cat(chunks, dim=-1)
tts.save_wav("out_stream.wav", wav)

You can also precalculate the reference to reduce time-to-first-audio:

import torch
from sopro import SoproTTS

tts = SoproTTS.from_pretrained("samuel-vitorino/sopro-v2-turbo", device="cpu")

ref = tts.prepare_reference(ref_audio_path="ref.mp3", stream=True)

chunks = []
for chunk in tts.stream(
    "Hello! This is a streaming Sopro TTS example.",
    ref=ref,
):
    chunks.append(chunk.cpu())

wav = torch.cat(chunks, dim=-1)
tts.save_wav("out_stream.wav", wav)

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#disclaimersDisclaimers

  • We did not add watermarking: with an open-source inference pipeline it would be trivial to remove, so it would only provide a false sense of safety. Please use the model for good: do not impersonate people.
  • The text frontend is deliberately minimal, so some abbreviations, numbers, and symbols may not be pronounced correctly. Prefer words:1 \+ 2should be writtenone plus two. That said, Sopro generally reads common abbreviations like “CPU” or “TTS” fine, and you can put a language-specific normalizer in front of it.
  • Mixed-language text is a weak spot: words from one language inside a sentence of another (an English product name in a Portuguese sentence, for example) can be mispronounced.
  • The streaming path (chunked attention and the causal vocoder) is not bit-exact with the offline path. For best quality, prefer the offline path.
  • We are not planning to release the training code in the near future due to its complexity.

https://huggingface.co/samuel-vitorino/sopro-v2-turbo#training-dataTraining data


https://huggingface.co/samuel-vitorino/sopro-v2-turbo#acknowledgementsAcknowledgements

Similar Articles

Fast On-Device Voice Cloning (9 minute read)

TLDR AI

Sopro V2 is an open-source, fast, on-device text-to-speech model with voice cloning, specifically targeting European Portuguese and other languages for low-latency and private communication.