Research

Benchmarking real-time streaming speech-to-text

ResearchJuly 24, 2026 · 10 min read
A speaker addresses three seated note-takers who are wildly out of sync: one page has run long and spilled to the floor, one is short and crumpled, one has barely begun.

Part two measured accuracy on files you upload and wait for. It ended on a thread it did not pull: a product that shows words while the person is still talking does not upload a file, it holds a streaming connection open and feeds audio as it arrives. That is a different API, a different failure mode, and, it turns out, a different accuracy number. This is that measurement.

Two things change when you move from batch to streaming. The engine now has to decide what a word was before it has heard the end of the sentence, which can cost accuracy. And it has to return words fast enough to feel live, which is a latency you cannot read off a batch benchmark. We measured both, on the same two test sets as part two, through each vendor's own streaming API.

The headline: streaming costs accuracy on clean speech and, at best, nothing on hard speech. On clean read audio every engine but one got worse streaming than batch, by 0.16 to 1.38 points. On hard conference call audio no engine got better: four engines tied with their batch score and the rest lost ground. First words arrive anywhere from 0.90s to 6.56s in, and the first word on screen and the first locked word are two different clocks. Two of the ten could not hold up a long sequential run at all: Gladia finished 71 of 500 hard clips, and AssemblyAI needed a retry with backoff to finish.

How we tested

We reused part two's English sets: LibriSpeech test-clean, the easy end of clean read audiobook speech, and Earnings-22, real earnings call audio built as an accent benchmark, the hard end. Streaming runs are slow by design, so we scored a 500-clip sample of each set rather than the full 2,620 and 2,741 utterances part two used. Some engines carry more than 500 clips in the tables below, from earlier runs we kept.

The runner does not hand the engine a whole file. It reads each clip as raw audio, splits it into 100-millisecond chunks, and feeds them to the streaming socket at true wall-clock pace, one chunk every 100 milliseconds, the way a microphone would. This is the part that makes the latency honest. If you push the whole clip at once, every engine looks instant, because you have removed the one constraint a live product actually has. Feeding at 1x also means we cannot run many streams at once per vendor without distorting the timing, so each engine streamed its clips one at a time.

We recorded four timings per clip, defined in the latency section below, and every one of them is measured from the moment the audio starts playing.

The transcript each stream produced was scored with part two's scorer: the OpenAI Whisper English text normalizer then corpus word error rate. Normalize first, then score, the convention the Open ASR Leaderboard uses. Because the scorer is identical to part two's, the streaming WER sits on the same scale as the batch WER, and subtracting one from the other gives the accuracy cost of going live.

The numbers below are matched: we score the batch and the streaming transcript on the exact same clips, the ones the engine streamed, then put a 95% interval on the gap with a paired bootstrap. Resample that shared clip set 1,000 times with a fixed seed, measure the gap between streaming and batch on each resample, and read the difference as real only when the whole interval stays on one side of zero. This is the paired test part two used for its tie claims.

Comparing against part two's batch number for the whole set instead would mislead. The clips we streamed are spaced evenly across each set, which covers every speaker but does not reproduce the set's mix of difficulty. Score the same batch transcripts on only those clips and the number moves.

How much the batch score improves on the streamed clips alone
How much the batch score improves on the streamed clips alone01.12.3points of WEROpenAI gpt-4o2.07Azure AI Speech0.70Cartesia Ink-Whisper0.53Deepgram Nova-30.49Soniox0.44Speechmatics Enhanced0.38AssemblyAI Universal0.17

No streaming in this chart. It is part two's batch transcripts on Earnings-22, scored on all 2,741 clips and then on only the clips the streaming runs used; the bar is how much lower the second score is. Google Chirp is the one engine that moves the other way, by 0.06 points, so it has no bar.

Seven of the eight engines score lower on the sample, so the clips we streamed are easier than the set they came from. The gap reaches 2.07 points on this hard set and 0.24 points on the clean one. None of that has anything to do with streaming. Matching each engine against itself on the same clips removes it, which is why the tables below do that. On the hard set it turns out to be the whole story.

Does streaming cost accuracy?

On clean speech, nearly everywhere. Eight of the nine engines with a batch baseline scored worse streaming than batch by the paired test. Only OpenAI's gpt-4o-transcribe pays no measurable cost: its streaming and batch WER differ by 0.09 points with an interval that spans zero, a tie. Every other engine loses real ground, though for all but Cartesia it stays under three quarters of a point.

LibriSpeech test-clean: streaming vs batch on matched clips
EngineStreaming WERBatch WERChange95% CI on changen
OpenAI gpt-4o-transcribe1.52%1.61%-0.09-0.25 to +0.07500
AssemblyAI Universal1.74%1.55%+0.19+0.09 to +0.31627
Amazon Transcribe1.96%no batchn/an/a666
Gladia Solaria2.58%2.03%+0.55+0.30 to +0.78500
Google Chirp2.72%2.56%+0.16+0.04 to +0.31500
Speechmatics Enhanced2.78%2.39%+0.39+0.19 to +0.60500
Azure AI Speech2.86%2.35%+0.50+0.21 to +0.84500
Soniox3.17%2.88%+0.29+0.01 to +0.59666
Deepgram Nova-33.25%2.58%+0.67+0.48 to +0.86758
Cartesia Ink-Whisper3.43%2.04%+1.38+1.01 to +1.85500

Scored 2026-07-22. Batch and streaming are scored on the identical clips per engine; the interval is computed before rounding, so it can differ by 0.01 from the rounded columns.

Amazon Transcribe has no batch cell, and the reason is structural rather than a gap in this run. It offers no synchronous endpoint for pre-recorded audio, so part two streamed its clips too, on a different set. There is no batch number to subtract. Its 1.96% streaming result would place it third here on its own terms.

One caveat on that streaming column: the engines carry between 500 and 758 clips, because we kept some longer runs from earlier, so the column is not strictly like for like. Rescoring all ten on the 500 clips they share moves AssemblyAI to 1.82% and Soniox to 3.09%, leaves the other eight within 0.03 points, and changes nobody's rank.

On the hard set the matched comparison changes the answer. Measured against the batch score for the whole set, Deepgram looked 1.41 points better streaming than batch, and OpenAI 1.39. On the same clips they are not. Deepgram's change is -0.93 with an interval from -2.07 to +0.11, which crosses zero, so it is a tie. OpenAI's point estimate flips to +0.68 with an interval from -1.00 to +2.38, also a tie. These two are where the sampling gap above bites hardest, worth 2.07 points for OpenAI and 0.49 for Deepgram, which is enough on its own to turn a tie into an apparent gain. Gladia is not in the table below, for reasons the reliability section covers.

Earnings-22: streaming vs batch on matched clips
EngineStreaming WERBatch WERChange95% CI on changen
Amazon Transcribe11.12%no batchn/an/a500
AssemblyAI Universal11.23%10.26%+0.97+0.47 to +1.58500
Azure AI Speech11.34%10.47%+0.87+0.12 to +1.65499
Soniox11.69%11.17%+0.52-0.14 to +1.16500
Google Chirp12.60%12.73%-0.14-0.63 to +0.36499
Speechmatics Enhanced12.60%11.90%+0.70+0.37 to +1.08500
Cartesia Ink-Whisper14.01%11.06%+2.95+2.24 to +3.64500
Deepgram Nova-314.72%15.64%-0.93-2.07 to +0.11500
OpenAI gpt-4o-transcribe17.16%16.48%+0.68-1.00 to +2.38500

Scored 2026-07-22 on matched clips; the change is computed before rounding.

Streaming minus batch on Earnings-22, matched clips
Streaming minus batch on Earnings-22, matched clips-1.0-0.50no differencepp differenceDeepgram Nova-3tieGoogle ChirptieSonioxtieOpenAI gpt-4otieSpeechmaticsreal gapAzurereal gapAssemblyAIreal gapCartesiareal gap
real gap (interval clears 0)tie (interval crosses 0)

Each row is one engine's streaming WER minus its batch WER on the same clips, so a point right of zero means streaming was worse. Bars are 95% intervals, and a bar crossing zero is a tie.

No engine on the hard set is measurably better streaming than batch. Four are ties: Deepgram, OpenAI, Google at -0.14, and Soniox at +0.52, each with an interval crossing zero. A tie is not proof of equal accuracy, only that any gap is smaller than this test can resolve, and OpenAI's interval still allows a two-point streaming penalty. For a live product a tie is still the good case, no measurable cost for going real time. The other four lost real ground: Speechmatics +0.70, Azure +0.87, AssemblyAI +0.97, and Cartesia +2.95, the largest streaming penalty in either set. AssemblyAI holds near the top of the hard table in absolute terms even so, 10.26% batch against 11.23% streaming, while taking one of the larger hits.

How fast do words appear?

Every engine here sells a real-time API. Fed the same audio at the same pace, the first word on screen arrived anywhere from 0.90s to 6.56s in.

A streaming engine gives you words twice. First it guesses, and it keeps changing its guess as more audio arrives. Then it commits, and the words stop moving. That gives four numbers worth timing, and the table uses them as its columns. Each one is measured from the moment the audio starts playing.

Median streaming latency on Earnings-22 (lower is better)
EngineFirst partialFirst finalFinalization lagRevisions
Soniox0.90s5.40s0.12s25.8
Amazon Transcribe0.92s4.65s0.26s11.6
AssemblyAI Universal0.94s5.23s0.16s5.2
Speechmatics Enhanced0.96s1.25s0.36s17.5
Deepgram Nova-30.96s2.10s0.07s5.4
Azure AI Speech1.26s5.27s0.29s13.2
Cartesia Ink-Whisper3.01s3.01s0.11s0.0
Google Chirp5.63s6.04s0.67s0.7
OpenAI gpt-4o-transcribe6.56s6.86s0.69s17.6

Medians over 500 clips per engine, measured 2026-07-22 from one location. Absolute seconds move with network and region; the gaps between engines are the durable part.

First partials keep a similar order on the clean set, most within a few tenths of a second of the hard set, with Cartesia moving most at about 0.6s. On LibriSpeech the first partial runs from 0.86s for AssemblyAI to 6.54s for OpenAI. First finals move further between the sets, and not all in the same direction: Deepgram's rises 1.14s on clean audio, 3.24s against 2.10s, Azure's 0.90s and Amazon's 0.79s, while AssemblyAI's falls 0.38s. Median clip length is within a tenth of a second across the two sets, so duration is not the explanation.

Five engines show a first partial under a second. Three of them then hold those words unlocked for several more: Soniox, Amazon, and AssemblyAI answer near 0.9s but do not reach a first final until 4.6 to 5.4 seconds. You see words immediately and they are not committed for another four to five seconds.

Speechmatics is the opposite: first partial at 0.96s, first final at 1.25s, so it commits text almost as fast as it shows it. For a caption you want to trust without waiting, that 1.25-second first final is the best number in the table. Deepgram is close behind at 2.10s.

At the other end, Google Chirp and OpenAI's gpt-4o-transcribe do not show a word for more than five seconds, and they get there differently. Google's first partial and first final nearly coincide and its revision count is near zero, 0.7 per clip, which reads as returning the transcript in large blocks rather than word by word. OpenAI does stream partials and updates them heavily, 17.6 per clip, it just does not emit the first one until 6.5 seconds in. Either way, their median first word lands at five to seven seconds, which is not the word-by-word live captioning the fast engines do.

The revision column is the flicker you would see on screen. Cartesia sits at exactly zero because it emits no interim guesses: its first result is already final, which is why its first partial and first final are the same 3.01s. Soniox rewrites its running transcript 25.8 times per clip before it settles. Each trade has a cost you have to design around: 25 rewrites per utterance is visible churn, and zero rewrites means the user stares at nothing for three seconds and then sees a finished line.

The finalization lag, the wait after the speaker stops, is short across the field. Deepgram settles 0.07s after the audio ends, and six of the nine engines land under three tenths of a second. Google and OpenAI trail again near 0.7s. This is the pause before your UI can mark a turn complete and act on it.

Which column is yours depends on what your interface does with unfinished text. If you render partials as they arrive and let them change on screen, first partial is your responsiveness number. First final barely matters then, and what you pay instead is revisions. If you show text only once it is committed, the two swap places. First final becomes your responsiveness number, and the sub-second first partials of Soniox, Amazon, and AssemblyAI buy you nothing, because their committed words are 4.6 to 5.4 seconds in. Read that way, only Speechmatics at 1.25s and Deepgram at 2.10s stay under three seconds. And if something fires when the speaker stops, a translation pass or an agent reply, finalization lag is the number you are waiting on: 0.07s for Deepgram against about 0.7s for Google and OpenAI.

The four columns move independently, so a fast first word tells you little about when the words settle. Five engines reach their first partial within six hundredths of a second of each other, and their first finals run from 1.25s to 5.40s. Cartesia shows the far end of the trade: it never guesses, so it never flickers, and nothing appears for 3.01s. Speechmatics takes the fastest commit in the table and pays 17.5 revisions on the way there. Deepgram is the only engine near the front of all four columns, so the trade is not forced on you.

Reliability is the third axis

Accuracy and speed both assume the run finishes. Two engines failed in ways a batch queue would never have surfaced, so opening and closing hundreds of streaming sessions in a row belongs in the comparison.

AssemblyAI returned "too many concurrent sessions" errors partway through, even though we streamed one clip at a time. It reached full 500-clip coverage only after we added a retry with backoff between sessions. The accuracy and latency numbers above are from the completed run, which we got only by writing that retry ourselves.

Gladia went further. On clean audio it finished cleanly, 500 of 500 clips. On the hard set the endpoint that opens a session would hang or error, and despite the same retry logic only 71 of 500 clips ever completed. We could not get a full Earnings-22 run out of it, so we left it out of the accuracy table for the hard set instead of reporting it at 14% coverage. Its 71-clip numbers are not a result we would stand behind. We cannot tell from outside whether this was a temporary capacity problem or a standing limit, and for a product that has to open a session every time someone starts talking, the distinction matters less than the failure rate.

What is missing, and what we will not claim

If you are choosing a streaming engine, two separate tables matter. Pick for accuracy on audio like yours from the delta on the hard set. Then pick the latency column your interface actually depends on, and read the table on that column alone. An engine that shows its first word at six seconds and one that locks it at one second are not the same product, however close their WER. And run your own clips through it first.

See live transcription and translation in action

Verli transcribes and translates any audio your computer plays, live. Free for 60 minutes a month.

More from Verli