Zyphra Releases ZONOS3-Mini: Open-Source TTS With 100M Active Parameters

0


Zyphra has released ZONOS3-Mini, an open-source text-to-speech model built for real-time use on local devices. The ZONOS3-Mini text-to-speech model is a sparse Mixture of Experts (MoE) with 800M total and 100M active parameters. It supports zero-shot voice cloning and word-level delivery control. Weights ship under Apache 2.0. For AI devs, size is the key point. It runs in a browser tab, on a laptop or on a server GPU.

TL;DR

  • Size: 800M total parameters, about 100M active per token (64 experts, top-2 routing); 32,768-position context; up to 10 minutes of audio per generation.
  • Runs on: NVIDIA GPUs via SGLang-Omni, Apple Silicon via MLX, CPU/CUDA/Metal/Vulkan via ggml, and phones or laptops via WebGPU in the browser.
  • Performance: Ranks first among open models on Zyphra’s ZTTS2-Eval Capability Index (self-reported).
  • Best: 80 ms median time to first audio on one H100 at 8 concurrent requests, and 457 seconds of audio per second peak throughput.
  • Worst: Under 570 ms time to first audio in the browser on a Pixel 9, versus under 150 ms on an M3 MacBook Air.
  • Bottom line: Best: frontier-level open TTS quality at 100M active parameters. Worst: every benchmark is run by Zyphra itself, and reference-clip cloning scores far lower than embedding mode.

What is ZONOS3-Mini?

ZONOS3-Mini is a compact zero-shot voice-cloning TTS model from Zyphra that runs in real time on-device. Zyphra trained it on 112 NVIDIA H100s in 2.5 days. It follows ZONOS2, which used 8B parameters and an 86 Hz codec. That size limited where ZONOS2 could be deployed.

How does the ZONOS3-Mini architecture work?

Zyphra changed 3 layers of the stack:

  • A new codec: Zyphra trained Zyphra Audio Codec 1 (ZAC-1) to replace the Descript Audio Codec. ZAC-1 runs at 15 Hz with 10 codebooks of 4,096 entries: 1 semantic and 9 acoustic. Zyphra reports a 10x word error rate reduction versus a DAC-trained model under similar data constraints. A causal iSTFT head renders each frame to 44.1 kHz audio as soon as it is generated.
  • A hybrid MoE backbone: The model card lists 11 layers with model dimension 1,024. Sequence mixing follows a 3:1 ratio: 9 Gated DeltaNet layers and 2 global attention layers. Zyphra also adds latent MoE, Q balancing and attention residuals.
  • A new speaker encoder: Voice representation moves from the Qwen3-TTS speaker encoder to MECT-B2. The model accepts a raw reference clip of up to 60 seconds, or a single 192-dimensional speaker embedding. Post-training used DPO, then GRPO, to improve robustness.

How does word-level voice control work?

Identity controls cover age, gender, accent and voice texture through speaker embedding vectors and accent task vectors. Delivery controls cover pace, emotion, projection and liveliness through activation steering. Learned alignment heads let steering apply to specific words during streaming. A separate edit model, based on a VoiceCraft recipe, can modify sentences after generation.

<iframe id="z3m-frame" title="ZONOS3-Mini interactive explainer" style="width:100%;height:600px;border:0;display:block;overflow:hidden;" scrolling="no" loading="lazy" srcdoc="<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>ZONOS3-Mini Explainer</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&family=JetBrains+Mono:wght@500&display=swap" rel="stylesheet">
<style>
html,body{margin:0;padding:0;background:transparent}
#z3m{–bg:#0A0A0A;–card:#141414;–line:#2a2a2a;–txt:#EDEDED;–mut:#9a9a9a;–acc:#C26833;–acc2:#E08A52;–g:#76B900;
max-width:880px;margin:0 auto;background:var(–bg)!important;color:var(–txt)!important;border:1px solid var(–line)!important;border-radius:14px;font-family:Inter,system-ui,sans-serif;overflow:hidden;box-sizing:border-box}
#z3m *{box-sizing:border-box}
#z3m hr,#z3m p:empty,#z3m del,#z3m s{display:none!important}
#z3m .hd{padding:20px 24px 14px;border-bottom:1px solid var(–line)}
#z3m .tag{font:500 11px 'JetBrains Mono',monospace;color:var(–acc)!important;letter-spacing:.12em;text-transform:uppercase}
#z3m h3{margin:6px 0 4px;font-size:22px;font-weight:800;color:var(–txt)!important;line-height:1.2}
#z3m .sub{color:var(–mut)!important;font-size:14px;margin:0}
#z3m .tabs{display:flex;gap:4px;padding:10px 16px 0;border-bottom:1px solid var(–line);overflow-x:auto}
#z3m .tab{background:transparent!important;border:0!important;color:var(–mut)!important;font:600 14px Inter,sans-serif;padding:10px 14px;cursor:pointer;border-bottom:2px solid transparent!important;white-space:nowrap}
#z3m .tab.on{color:var(–txt)!important;border-bottom-color:var(–acc)!important}
#z3m .pn{display:none;padding:20px 24px 22px;animation:zin .35s ease}
#z3m .pn.on{display:block}
@keyframes zin{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* pipeline */
#z3m .pipe{display:flex;align-items:stretch;gap:8px;margin:6px 0 14px}
#z3m .st{flex:1;background:var(–card)!important;border:1px solid var(–line)!important;border-radius:10px;padding:12px 10px;text-align:center;cursor:pointer;transition:all .25s;position:relative}
#z3m .st b{display:block;font-size:13px;color:var(–txt)!important}
#z3m .st small{display:block;font:500 11px 'JetBrains Mono',monospace;color:var(–mut)!important;margin-top:4px}
#z3m .st.on{border-color:var(–acc)!important;box-shadow:0 0 0 1px var(–acc),0 0 22px rgba(194,104,51,.35);transform:translateY(-2px)}
#z3m .arw{align-self:center;color:var(–acc)!important;font-weight:800}
#z3m .det{background:var(–card)!important;border-left:3px solid var(–acc)!important;border-radius:8px;padding:14px 16px;min-height:96px;font-size:14px;line-height:1.55;color:var(–txt)!important}
#z3m .det strong{color:var(–acc2)!important}
#z3m .ctl{display:flex;gap:8px;margin-top:12px}
#z3m .btn{background:var(–acc)!important;color:#0A0A0A!important;border:0!important;border-radius:8px;padding:8px 14px;font:700 13px Inter,sans-serif;cursor:pointer}
#z3m .btn.gh{background:transparent!important;color:var(–txt)!important;border:1px solid var(–line)!important}
/* frames anim */
#z3m .frames{display:flex;gap:3px;margin:12px 0 0;height:34px;align-items:flex-end}
#z3m .fr{flex:1;background:var(–acc)!important;border-radius:2px;opacity:.15;height:20%;transition:all .3s}
#z3m .fr.live{opacity:1}
#z3m .cap{font:500 11px 'JetBrains Mono',monospace;color:var(–mut)!important;margin-top:6px}
/* experts */
#z3m .moe{display:grid;grid-template-columns:repeat(16,1fr);gap:4px;margin:12px 0 6px}
#z3m .ex{aspect-ratio:1;background:#1f1f1f!important;border-radius:3px;transition:background .2s,box-shadow .2s}
#z3m .ex.hit{background:var(–acc)!important;box-shadow:0 0 10px var(–acc)}
/* controls */
#z3m .chips{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 14px}
#z3m .chip{background:var(–card)!important;border:1px solid var(–line)!important;color:var(–txt)!important;border-radius:999px;padding:7px 12px;font:600 13px Inter,sans-serif;cursor:pointer;transition:all .2s}
#z3m .chip.on{border-color:var(–acc)!important;color:var(–acc2)!important;background:rgba(194,104,51,.12)!important}
#z3m .grp{font:500 11px 'JetBrains Mono',monospace;color:var(–mut)!important;text-transform:uppercase;letter-spacing:.1em;margin:10px 0 6px}
#z3m .sent{font-size:20px;line-height:1.6;margin:8px 0;color:var(–txt)!important}
#z3m .w{display:inline-block;padding:0 3px;border-radius:4px;transition:all .3s}
#z3m .w.wh{background:rgba(194,104,51,.25)!important;color:var(–acc2)!important;font-style:italic;transform:scale(.94)}
/* bars */
#z3m .seg{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}
#z3m .row{display:grid;grid-template-columns:140px 1fr 56px;gap:10px;align-items:center;margin:9px 0;font-size:13px}
#z3m .row .nm{color:var(–txt)!important}
#z3m .trk{background:#1c1c1c!important;border-radius:6px;height:20px;overflow:hidden}
#z3m .bar{height:100%;width:0;background:#4a4a4a!important;border-radius:6px;transition:width .9s cubic-bezier(.2,.8,.2,1)}
#z3m .bar.me{background:linear-gradient(90deg,#C26833,#E08A52)!important}
#z3m .val{font:600 13px 'JetBrains Mono',monospace;color:var(–txt)!important;text-align:right}
#z3m .note{font-size:12px;color:var(–mut)!important;margin-top:10px;line-height:1.5}
/* deploy */
#z3m .grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
#z3m .dc{background:var(–card)!important;border:1px solid var(–line)!important;border-radius:10px;padding:14px;cursor:pointer;transition:all .2s}
#z3m .dc:hover,#z3m .dc.on{border-color:var(–acc)!important}
#z3m .dc b{color:var(–txt)!important;font-size:14px}
#z3m .dc p{margin:4px 0 0;color:var(–mut)!important;font-size:13px}
#z3m pre,#z3m code{background:#050505!important;color:#E08A52!important;border:1px solid var(–line)!important;font:500 12px 'JetBrains Mono',monospace!important;border-radius:8px}
#z3m pre{padding:12px!important;margin:12px 0 0!important;white-space:pre-wrap;word-break:break-all}
#z3m .ft{display:flex;justify-content:space-between;align-items:center;padding:12px 24px;border-top:1px solid var(–line);font-size:12px;color:var(–mut)!important}
#z3m .ft a{color:var(–mut)!important;text-decoration:none}
#z3m .mtp{color:#76B900!important;font-weight:700}
@media (max-width:640px){
#z3m .hd{padding:16px}#z3m .pn{padding:16px}
#z3m h3{font-size:18px}
#z3m .pipe{flex-direction:column}#z3m .arw{transform:rotate(90deg)}
#z3m .row{grid-template-columns:96px 1fr 48px;font-size:12px}
#z3m .grid{grid-template-columns:1fr}
#z3m .moe{grid-template-columns:repeat(8,1fr)}
#z3m .sent{font-size:17px}
#z3m .ft{flex-direction:column;gap:4px;padding:12px 16px}
}
</style></head><body>
<div id="z3m">
<div class="hd"><div class="tag">Zyphra · Open-source TTS · Apache 2.0</div>
<h3>ZONOS3-Mini: how a 100M-active TTS model runs on-device</h3>
<p class="sub">800M total parameters · ~100M active · 15 Hz codec · 44.1 kHz audio</p></div>
<div class="tabs" role="tablist">
<button class="tab on" data-t="p1">How it works</button>
<button class="tab" data-t="p2">Sparse MoE</button>
<button class="tab" data-t="p3">Voice controls</button>
<button class="tab" data-t="p4">Benchmarks</button>
<button class="tab" data-t="p5">Deploy</button>
</div>

<div class="pn on" id="p1">
<div class="pipe" id="pipe">
<div class="st on" data-i="0"><b>Text</b><small>SuperBPE 8,192</small></div><div class="arw">›</div>
<div class="st" data-i="1"><b>Speaker</b><small>clip or 192-d</small></div><div class="arw">›</div>
<div class="st" data-i="2"><b>MoE backbone</b><small>9 GDN + 2 attn</small></div><div class="arw">›</div>
<div class="st" data-i="3"><b>ZAC-1 codes</b><small>15 Hz · 10 books</small></div><div class="arw">›</div>
<div class="st" data-i="4"><b>iSTFT head</b><small>44.1 kHz</small></div>
</div>
<div class="det" id="det"></div>
<div class="frames" id="frames"></div>
<div class="cap">Each bar = one 15 Hz frame, rendered to audio as soon as its last codebook is generated</div>
<div class="ctl"><button class="btn" id="play"> Step through</button><button class="btn gh" id="rst">Reset</button></div>
</div>

<div class="pn" id="p2">
<div class="det"><strong>64 experts, top-2 routing.</strong> Each token activates 2 experts, so about 100M of the 800M parameters do work per step. That is why the model fits real-time budgets on laptops and phones.</div>
<div class="moe" id="moe"></div>
<div class="cap" id="moecap">Routing token 1 …</div>
<div class="ctl"><button class="btn" id="route">▶ Route tokens</button></div>
<div class="note">ZONOS2 used 8B parameters on an 86 Hz codec. ZONOS3-Mini cuts both: 800M total, 15 Hz frames.</div>
</div>

<div class="pn" id="p3">
<div class="grp">Identity (speaker embedding + accent vectors)</div>
<div class="chips" data-g="id">
<button class="chip on" data-d="Neutral base voice. No identity steering applied.">Neutral</button>
<button class="chip" data-d="Age steering, e.g. age −1.5 targets a young adult and +1.5 an older adult.">Age</button>
<button class="chip" data-d="Gender presentation steering, e.g. gender −1.5 for a masculine target.">Gender</button>
<button class="chip" data-d="Accent task vectors, e.g. british 1.5 or australian 1.5, keeping the speaker recognizable.">Accent</button>
<button class="chip" data-d="Texture steering: soft, raspy, bright or deep (e.g. raspy +5).">Texture</button>
</div>
<div class="grp">Delivery (activation steering, word-level)</div>
<div class="chips" data-g="dl">
<button class="chip on" data-w="-1" data-d="Whole line delivered neutrally.">Neutral</button>
<button class="chip" data-w="0" data-d="Whisper +4 applied only to the span “I didn’t say”, via learned alignment heads.">Whisper opening</button>
<button class="chip" data-w="1" data-d="Whisper +4 applied only to “she took the keys”.">Whisper ending</button>
<button class="chip" data-w="-1" data-d="Emotion axes such as happy, angry or scared (e.g. scared +8).">Emotion</button>
<button class="chip" data-w="-1" data-d="Pace −2 to +2 changes speed while keeping every word intelligible.">Pace</button>
<button class="chip" data-w="-1" data-d="Projection −3 (intimate) to +3 (calling across a room).">Projection</button>
</div>
<div class="sent"><span class="w" data-s="0">I</span> <span class="w" data-s="0">didn’t</span> <span class="w" data-s="0">say</span> <span class="w" data-s="1">she</span> <span class="w" data-s="1">took</span> <span class="w" data-s="1">the</span> <span class="w" data-s="1">keys.</span></div>
<div class="det" id="cdet">Neutral base voice. No identity steering applied.</div>
<div class="note">Settings shown are examples from Zyphra’s published control demos. A VoiceCraft-style edit model can also change words after generation.</div>
</div>

<div class="pn" id="p4">
<div class="seg" id="seg">
<button class="chip on" data-m="ci">Capability Index ↑</button>
<button class="chip" data-m="wer">Clean WER ↓</button>
<button class="chip" data-m="sim">Speaker similarity ↑</button>
<button class="chip" data-m="ut">MSR-UTMOS ↑</button>
</div>
<div id="bars"></div>
<div class="note" id="bnote"></div>
<div class="note">Source: Zyphra ZTTS2-Eval explorer, all-language set, ZONOS3-Mini in speaker-embedding mode. Self-reported by Zyphra.</div>
</div>

<div class="pn" id="p5">
<div class="grid" id="dgrid">
<div class="dc on" data-c="b"><b>Browser · WebGPU</b><p>Runs on your own GPU, no install. &lt;570 ms TTFA on a Pixel 9, &lt;150 ms on an M3 MacBook Air.</p></div>
<div class="dc" data-c="s"><b>NVIDIA · SGLang-Omni</b><p>OpenAI-compatible /v1/audio/speech with streaming. 80 ms TTFA on 1 H100 at 8 concurrent.</p></div>
<div class="dc" data-c="n"><b>Native · MLX / ggml</b><p>MLX for Apple Silicon; C++/ggml server and CLI for CPU, CUDA, Metal or Vulkan.</p></div>
<div class="dc" data-c="c"><b>Hosted · Zyphra Cloud</b><p>Managed API served on NVIDIA H200s.</p></div>
</div>
<pre id="code"></pre>
</div>

<div class="ft"><span>Sources: zyphra.com · huggingface.co/Zyphra · ZTTS2-Eval</span><span class="mtp">© Marktechpost</span></div>
</div>
<script>
(function(){
var R=document.getElementById(‘z3m’);
function $(s){return R.querySelector(s)} function $$(s){return R.querySelectorAll(s)}
function rs(){try{parent.postMessage({type:’z3m-h’,h:R.offsetHeight+40},’*’)}catch(e){}}
$$(‘.tab’).forEach(function(t){t.onclick=function(){$$(‘.tab’).forEach(function(x){x.classList.remove(‘on’)});$$(‘.pn’).forEach(function(x){x.classList.remove(‘on’)});t.classList.add(‘on’);$(‘#’+t.dataset.t).classList.add(‘on’);if(t.dataset.t===’p4′)draw(cur);rs()}});
var D=[‘<strong>Text.</strong> Input is NeMo-normalized (9 languages) and tokenized with an 8,192-entry SuperBPE vocabulary.’,'<strong>Speaker.</strong> Either a raw reference clip (up to 60 s, encoded into a token prefix) or a single 192-d MECT-B2 speaker embedding.’,'<strong>Hybrid MoE backbone.</strong> 11 layers: 9 Gated DeltaNet + 2 global attention, latent MoE with 64 experts and top-2 routing. Context: 32,768 positions.’,'<strong>ZAC-1 codes.</strong> Zyphra Audio Codec 1 at 15 Hz: 1 semantic + 9 acoustic codebooks of 4,096 entries each.’,'<strong>Causal iSTFT head.</strong> Each frame renders to 44.1 kHz audio as soon as it is complete, so streaming starts early.’];
var si=0,tm=null;
function setS(i){si=i;$$(‘#pipe .st’).forEach(function(x){x.classList.toggle(‘on’,+x.dataset.i===i)});$(‘#det’).innerHTML=D[i];}
$$(‘#pipe .st’).forEach(function(x){x.onclick=function(){setS(+x.dataset.i)}});
var F=$(‘#frames’);for(var k=0;k<30;k++){var d=document.createElement(‘div’);d.className=”fr”;F.appendChild(d)}
function frames(){var fs=F.children,j=0;var iv=setInterval(function(){if(j>=fs.length){clearInterval(iv);return}fs[j].classList.add(‘live’);fs[j].style.height=(25+Math.round(Math.abs(Math.sin(j*1.7))*75))+’%’;j++},70)}
$(‘#play’).onclick=function(){clearInterval(tm);setS(0);[].forEach.call(F.children,function(f){f.classList.remove(‘live’);f.style.height=”20%”});var n=0;tm=setInterval(function(){n++;if(n>4){clearInterval(tm);return}setS(n);if(n===4)frames()},1100)};
$(‘#rst’).onclick=function(){clearInterval(tm);setS(0);[].forEach.call(F.children,function(f){f.classList.remove(‘live’);f.style.height=”20%”})};
setS(0);
var M=$(‘#moe’);for(var e=0;e<64;e++){var x=document.createElement(‘div’);x.className=”ex”;M.appendChild(x)}
$(‘#route’).onclick=function(){var t=0;var iv=setInterval(function(){[].forEach.call(M.children,function(c){c.classList.remove(‘hit’)});if(t>=8){clearInterval(iv);$(‘#moecap’).textContent=”8 tokens routed · 2 of 64 experts active per token”;return}var a=Math.floor(Math.random()*64),b=(a+1+Math.floor(Math.random()*63))%64;M.children[a].classList.add(‘hit’);M.children[b].classList.add(‘hit’);t++;$(‘#moecap’).textContent=”Routing token “+t+’ → experts ‘+a+’ and ‘+b},450)};
$$(‘#p3 .chips’).forEach(function(g){g.querySelectorAll(‘.chip’).forEach(function(c){c.onclick=function(){g.querySelectorAll(‘.chip’).forEach(function(x){x.classList.remove(‘on’)});c.classList.add(‘on’);$(‘#cdet’).textContent=c.dataset.d;if(g.dataset.g===’dl’){var w=c.dataset.w;$$(‘#p3 .w’).forEach(function(s){s.classList.toggle(‘wh’,w!==’-1’&&s.dataset.s===w)})}}})});
var B={ci:{n:’Capability Index’,v:[66.2,61.7,60.2,37.7],max:70,note:’Item-response-theory index over 420 items. Reference-clip mode scores 44.7.’},wer:{n:’Clean WER’,v:[7.79,11.06,11.01,25.55],max:28,note:’Lower is better. Clean read speech, 35 languages.’},sim:{n:’Speaker similarity’,v:[83.4,81.2,82.9,69.6],max:90,note:’Higher is better. Clean set.’},ut:{n:’MSR-UTMOS’,v:[3.07,3.16,3.04,3.54],max:4,note:’Higher is better. ZONOS3-Mini trails Fish S2 Pro and Qwen3-TTS 1.7B here.’}};
var NM=[‘ZONOS3-Mini’,’Fish S2 Pro’,’MOSS-TTS v1.5′,’Qwen3-TTS 1.7B’],cur=”ci”;
function draw(m){cur=m;var b=B[m],h=””;for(var i=0;i<4;i++){h+='<div class="row"><span class="nm">’+NM[i]+'</span><div class="trk"><div class="bar’+(i===0?’ me’:”)+’" data-w="’+(b.v[i]/b.max*100)+’"></div></div><span class="val">’+b.v[i]+'</span></div>’}$(‘#bars’).innerHTML=h;$(‘#bnote’).textContent=b.note;setTimeout(function(){$$(‘#bars .bar’).forEach(function(x){x.style.width=x.dataset.w+’%’})},40)}
$$(‘#seg .chip’).forEach(function(c){c.onclick=function(){$$(‘#seg .chip’).forEach(function(x){x.classList.remove(‘on’)});c.classList.add(‘on’);draw(c.dataset.m)}});
draw(‘ci’);
var C={b:’Open zyphra.com/zonos3mini/localplaygroundn# First visit downloads and caches the model.n# Needs a browser with WebGPU support.’,s:’sgl-omni serve –model-path Zyphra/ZONOS3-Mini –port 8000nncurl -X POST http://localhost:8000/v1/audio/speech \n -H "Content-Type: application/json" \n -d ‘{"input": "Hello from ZONOS3-Mini!"}’ –output output.wav’,n:’# github.com/Zyphra/ZONOS3-Mininservers/mlx # Apple Siliconnservers/ggml # CPU, CUDA, Metal or Vulkan, no Python at runtimenservers/web # in-browser WebGPU build’,c:’cloud.zyphra.com/models/zyphra/ZONOS3-Minin# Hosted on NVIDIA H200s’};
function code(k){$(‘#code’).textContent=C[k];$$(‘#dgrid .dc’).forEach(function(x){x.classList.toggle(‘on’,x.dataset.c===k)});rs()}
$$(‘#dgrid .dc’).forEach(function(x){x.onclick=function(){code(x.dataset.c)}});code(‘b’);
window.addEventListener(‘load’,rs);window.addEventListener(‘resize’,rs);setTimeout(rs,300);
})();
</script>
</body></html>
“>

window.addEventListener(‘message’,function(e){if(e.data&&e.data.type===’z3m-h’){var f=document.getElementById(‘z3m-frame’);if(f&&e.source===f.contentWindow){f.style.height=e.data.h+’px’;}}});

How does ZONOS3-Mini perform on benchmarks?

Zyphra evaluated the model on its new ZTTS2-Eval benchmark. It covers 35 languages of clean read speech and 20 languages of in-the-wild recordings. A Capability Index uses item response theory over 420 items.

ZONOS3-Mini in speaker-embedding mode scores 66.2 on that index. Fish Audio S2 Pro scores 61.7 and MOSS-TTS v1.5 scores 60.2. On the clean set, ZONOS3-Mini posts 7.79 WER and 83.4 speaker similarity.

There are caveats. Zyphra built and ran the benchmark. Reference-clip mode scores only 44.7 on the index. Its clean-set MSR-UTMOS quality score of 3.07 trails Fish S2 Pro (3.16) and Qwen3-TTS 1.7B (3.54).

ZONOS3-Mini vs other open-source TTS models

MetricsZONOS3-MiniFish Audio S2 ProMOSS-TTS v1.5Qwen3-TTS 1.7BTotal params800M5B (4B Slow AR + 400M Fast AR)8B1.7BActive params~100M (MoE)Not disclosedNot disclosedNot disclosedLicenseApache 2.0Fish Audio Research License (commercial use needs separate license)Apache 2.0Apache 2.0Codec frame rate15 Hz~21 HzNot disclosed12.5 FPSLanguagesNo official list (evaluated on 35)80+3110Official browser runtimeYes, WebGPUNot disclosedNot disclosedNot disclosedReported latency80 ms TTFA, 1 H100, 8 concurrent~100 ms TTFA, 1 H200Not disclosed97 ms end-to-endZTTS2 Capability Index*66.261.760.237.7Clean WER* (lower is better)7.7911.0611.0125.55Clean speaker similarity*83.481.282.969.6Clean MSR-UTMOS*3.073.163.043.54

*From Zyphra’s ZTTS2-Eval explorer, all-language set. ZONOS3-Mini in speaker-embedding mode. Run by Zyphra, not independently verified. Latency figures use different GPUs and are not directly comparable.

How can developers deploy ZONOS3-Mini?

There are 4 official paths, per the GitHub repository:

  • Browser: The WebGPU playground runs fully on your GPU, with no install or server.
  • NVIDIA servers: SGLang-Omni serves an OpenAI-compatible /v1/audio/speech endpoint with streaming.
  • Native: An MLX server for Apple Silicon, and a C++/ggml server and CLI for CPU, CUDA, Metal or Vulkan.
  • Hosted: Zyphra Cloud, served on NVIDIA H200s.

Key Takeaways

  • ZONOS3-Mini is an 800M-parameter MoE TTS model with ~100M active parameters.
  • Apache 2.0 weights; runs in-browser via WebGPU, plus MLX, ggml and SGLang.
  • Tops Zyphra’s open-model Capability Index at 66.2, ahead of Fish S2 Pro.
  • 80 ms time to first audio on one H100; under 570 ms on a Pixel 9 browser.
  • All benchmarks are self-reported; reference-clip cloning scores much lower.

Check out the blog post, model weights, GitHub repo and ZTTS2-Eval benchmark. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.

Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us

The post Zyphra Releases ZONOS3-Mini: Open-Source TTS With 100M Active Parameters appeared first on MarkTechPost.



Source link

You might also like
Leave A Reply

Your email address will not be published.