Most production voice stacks are three systems stitched together. One model transcribes, a second separates speakers, and a detector decides when the user stopped talking. Each hand-off adds latency and a new failure mode.
Muse Voice Transcribe, announced by Meta Superintelligence Labs this week, collapses those three jobs into a single autoregressive model. Meta calls it its first real-time audio perception model. It performs streaming ASR, speaker diarization for 20+ speakers, and endpointing in one pass, with no required post-processing.
Is it deployable? Yes, but only as a hosted API. It is live on the Meta Model API as muse-voice-transcribe-1.0 at $3.00 per 1,000 audio minutes ($0.18 per hour), and it already powers dictation in Meta AI for Mac and Muse Code. No weights have been released, so there is no self-hosted path.
Streaming ASR as the foundation
Muse Voice Transcribe is an autoregressive multimodal model from the Muse Spark family. Audio arrives in 80ms chunks at 12.5 Hz. Each chunk is transformed into a single soft token.
After every chunk the model makes one binary choice. It either predicts a <|next_audio|> token and keeps listening, or it emits a text token. When the model predicts <|next_audio|>, that token is replaced by the actual next audio chunk in the input. When the stream ends, an <|empty_audio|> token is inserted, and the model flushes all remaining text without requesting more audio.
Listening and writing share one decoder loop, so there is no separate alignment stage to drift.
Adaptive delay, trained with RL
Because the model controls when it listens, it also controls how much audio context sits behind each word. Meta calls that gap ‘delay.’ Longer delay means a more accurate transcript and higher latency.
Instead of fixing that trade-off, Meta trains it. Reinforcement learning combines a word error rate reward and a delay reward multiplicatively, producing a policy that varies delay per word by difficulty. Meta reports this puts the model on the Pareto front for speed against accuracy, measured by time to final transcription, ahead of the previous frontier formed by Soniox, Cartesia, and ElevenLabs systems.
Diarization and endpointing are more tokens
Meta did not add a second model for speaker attribution. It added special tokens to the same stream.
For diarization, a <|start_of_turn|> token marks a potential speaker switch, and a <|speaker_{A-Z}|> tag identifies the speaker. The turn token fires as soon as a switch is possible, while the speaker tag is delayed to the end of the chunk. Audio from one speaker can be split across several segments that all resolve to the same tag.
For endpointing, <|speech_onset|> marks the start of speech and <|speech_endpoint|> marks the point where the user finished. Both tasks are trained jointly with streaming ASR, using extra rewards layered on top of the ASR reward.
Capabilities
The model was trained on 70+ languages, of which 25 are extensively verified and recommended at launch. Code-switching is native, both within a sentence and between sentences, which matters for bilingual speakers who mix languages mid-clause. Accuracy can be improved further with language, keyword, and context biasing.
Long-context handling is a practical differentiator. Meta states the model natively supports audio input exceeding one hour and 20+ speakers, with no required post-processing step.
Benchmarks
Meta reports first place on Artificial Analysis for streaming speech-to-text and on public diarization benchmarks, as of September 1, 2026.
On Artificial Analysis AA-WER Streaming, Muse Voice Transcribe records 3.1% final-transcript WER at 0.16s after end of speech. Cartesia Ink-2 with semantic endpoints is 3.4% at 0.43s. ElevenLabs Scribe v2 Realtime is 3.6% at 0.14s. Cartesia Ink-2 with external endpoints is fastest at 0.07s but least accurate at 4.0%. On first partial transcript, Muse Voice Transcribe records 3.6% WER at 0.13s.
On diarization, Meta reports a 17.5% average diarization error rate across AMI-IHM, AMI-SDM, and VoxConverse. Five other systems in the same chart range from 21.1% to 28.6%.
Price is the other axis. At $3.00 per 1,000 minutes, it undercuts Cartesia Ink-2 at $4.00 and is less than half the $6.50 for ElevenLabs Scribe v2 Realtime and Deepgram Flux.
Interactive explainer
/* —- slide 2 : adaptive delay —- */
var PTS=[
{n:’Muse Voice Transcribe’, wer:3.1, lat:0.16, hero:true, note:’Final transcript: 3.1% WER at 0.16 s after end of speech. Ranked first on AA-WER Streaming as of September 1, 2026. First partial transcript is 3.6% WER at 0.13 s.’},
{n:’Cartesia Ink-2 (semantic endpoints)’, wer:3.4, lat:0.43, note:’3.4% WER but 0.43 s to final transcript, the slowest of the group. Priced at $4.00 per 1,000 minutes.’},
{n:’ElevenLabs Scribe v2 Realtime’, wer:3.6, lat:0.14, note:’3.6% WER at 0.14 s. Marginally faster than Muse, less accurate, and priced at $6.50 per 1,000 minutes.’},
{n:’Cartesia Ink-2 (external endpoints)’, wer:4.0, lat:0.07, note:’Fastest at 0.07 s, but 4.0% WER. This is the classic speed-for-accuracy trade Meta is trying to escape.’}
];
var plot=document.getElementById(‘plot’), tip=document.getElementById(‘tip’);
function drawPlot(){
PTS.forEach(function(p){
var x=8+(p.lat/0.50)*84, y=8+((p.wer-2.9)/1.3)*84;
var d=document.createElement(‘div’);
d.className=”pt “+(p.hero?’hero’:’rival’);
d.style.left=x+’%’; d.style.top=y+’%’; d.title=p.n;
d.addEventListener(‘click’,function(){ tip.innerHTML=’‘+p.n+’
‘+p.note; resize(); });
plot.appendChild(d);
var l=document.createElement(‘span’); l.className=”axl”;
l.style.left=Math.min(x+2.5,66)+’%’; l.style.top=(y-3.5)+’%’;
l.textContent=p.hero?’Muse’:p.n.split(‘ ‘)[0];
if(p.hero){ l.style.color=”#7FB2FF”; l.style.fontWeight=”700″; }
plot.appendChild(l);
});
}
drawPlot();
var dsl=document.getElementById(‘dsl’), d1=document.getElementById(‘d1’), d2=document.getElementById(‘d2’);
dsl.addEventListener(‘input’,function(){
var v=+this.value/100;
var lat=(0.05+v*0.45), wer=(4.3-1.25*Math.sqrt(v));
d1.textContent=lat.toFixed(2)+’ s’; d2.textContent=wer.toFixed(1)+’%’;
});
/* —- slide 3 : token tabs —- */
var SEQ=[
{html:’<|next_audio|> <|next_audio|> Hello, <|next_audio|> how are you doing? <|empty_audio|>‘,
tip:’Every 80 ms the model either asks for the next chunk or writes a word. Nothing else is running.’},
{html:’<|start_of_turn|>Hello, how are you doing?<|speaker_A|><|start_of_turn|> Did anything fun over the weekend?<|speaker_A|><|start_of_turn|> Hey I’m good!<|speaker_B|>‘,
tip:'<|start_of_turn|> fires the moment a speaker switch is possible. The speaker tag is delayed to the end of the chunk, which is why two consecutive segments can both resolve to speaker A.’},
{html:’<|speech_onset|>Hey Meta, what’s the weather in Menlo Park?<|speech_endpoint|> [silence] <|speech_onset|>What should I wear today?<|speech_endpoint|>‘,
tip:’Endpointing tells a voice agent when the user has actually finished, not just paused. No separate voice-activity model sits in the loop.’}
];
var tok=document.getElementById(‘tok’), tiptok=document.getElementById(‘tiptok’), tabs=document.querySelectorAll(‘.tabs button’), typer=null;
function type(i){
if(typer) clearInterval(typer);
tok.innerHTML=”; tiptok.innerHTML=SEQ[i].tip;
var tmp=document.createElement(‘div’); tmp.innerHTML=SEQ[i].html;
var nodes=Array.prototype.slice.call(tmp.childNodes), n=0;
typer=setInterval(function(){
if(n>=nodes.length){ clearInterval(typer); typer=null; resize(); return; }
tok.appendChild(nodes[n].cloneNode(true)); n++;
}, 170);
}
tabs.forEach(function(b){ b.addEventListener(‘click’,function(){
tabs.forEach(function(x){x.classList.remove(‘on’);}); b.classList.add(‘on’); type(+b.dataset.t);
});});
type(0);
/* —- slide 4 : bars —- */
var BAR=[
{n:’Muse Voice Transcribe’,wer:3.1,hero:true},
{n:’Cartesia Ink-2 (semantic)’,wer:3.4},
{n:’ElevenLabs Scribe v2 Realtime’,wer:3.6},
{n:’Cartesia Ink-2 (external)’,wer:4.0}
];
var drawn=false;
function drawBars(){
if(drawn) return; drawn=true;
var wrap=document.getElementById(‘bars’); wrap.innerHTML=”;
BAR.forEach(function(b,i){
var row=document.createElement(‘div’); row.className=”bar-row”;
row.innerHTML=’
‘+b.n+’
‘+b.wer.toFixed(1)+’%
‘;
wrap.appendChild(row);
var f=row.querySelector(‘.fill’);
setTimeout(function(){ f.style.width=(b.wer/4.4*100)+’%’; }, 90*i+80);
});
}
})();


