1. The API
Connect opens one realtime session and keeps it open — silence is sent whenever no sample is playing, so the vendor's clock keeps running and nothing hangs up. Identification is always asked for here.
no session
2. The sample — or your microphone
Start paces the sample to the vendor at 1× and plays it here at the same time. Stop sample leaves the connection open; pick another and press Start again, as often as you like. Only samples in one language are listed — you make the switch by choosing the next sample — and every sample is brought to -20.0 dBFS before it is sent and before it is played. Or speak into it yourself: the microphone feeds the same open connection, on the same audio clock, and is scored the same way — except for the words, which nobody wrote down in advance.
The browser will ask for the microphone the first time you press Record. Audio is converted here to 16000 Hz mono — what the vendor was told to expect — and posted to this box a few times a second; nothing is stored. A take ends when you press Stop, after 10 minutes, or 20 s after the browser stops sending (a closed tab cannot press Stop, and the connection is billed by the minute). Naming the language you are about to speak is what makes a change wrong rather than merely counted.
The player and the upload start together; the page re-aligns the player to the vendor's audio clock if they drift.
3. Live
| # | Sample | Played | Changes inside | Words spoken | Wrong language | No language | Wrong words | Accuracy | Changes followed | Switch lag | Vendor lag | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No sample played yet. | ||||||||||||
Per sample, as far as it was played: a sample stopped half-way is scored against half its ground truth. Wrong language counts words the vendor tagged with a language other than the one being spoken at that point of the audio; wrong words are substitutions and insertions in the settled transcript against the reference. Both need the vendor's finals, so they settle a few seconds behind the audio.
4. Results per API — today, 2026-09-16
Today's sessions of an API summed into one line — words summed, the percentages recomputed from the sums. Today only, because this table is read while testing: a total over every day the file has ever held lets an API measured on Monday with the wrong key drag its own Tuesday down, and the operator comparing two vendors this afternoon is not asking about Monday. Nothing is deleted — every session ever stored is listed below, dated, and the JSON still sums all of them.
| API | Sessions | Samples | Wrong changes | Words spoken | Wrong language | No language | Wrong words | Accuracy | Changes followed | Switch lag | Over silence | Latest |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Speechmatics | 2 | 2 | 0 of 8 change(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 10 | 2026-09-16T10:00:37 |
| Soniox Speech-to-Text | 1 | 1 | 0 | 0 | 0 | 0 | 0 | — | 0/0 | — | 0 | 2026-09-16T09:58:40 |
| Azure AI Speech | 2 | 2 | 0 of 1 change(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 0 | 2026-09-16T09:58:11 |
| Deepgram | 1 | 1 | 0 of 1 change(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 0 | 2026-09-16T09:56:42 |
Sessions — every one stored, newest first
| When | API | Samples | Wrong changes | Words spoken | Wrong language | No language | Wrong words | Accuracy | Changes followed | Switch lag | Vendor lag | Over silence | Ended | Portal |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-09-16T10:00:37 | Speechmatics | 1 (1 spoken) | 0 in 1 sample(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 3791 ms | 1 | closed by the session itself: nothing polled it for 45 s, and a realtime connection is billed by the minute | |
| 2026-09-16T09:58:40 | Soniox Speech-to-Text | 1 (1 spoken) | 0 | 0 | 0 | 0 | 0 | — | 0/0 | — | 2698 ms | 0 | stopped by the operator | |
| 2026-09-16T09:58:11 | Azure AI Speech | 1 (1 spoken) | 0 in 1 sample(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 480 ms | 0 | stopped by the operator | |
| 2026-09-16T09:57:44 | Azure AI Speech | 1 (1 spoken) | 0 | 0 | 0 | 0 | 0 | — | 0/0 | — | — | 0 | stopped by the operator | |
| 2026-09-16T09:56:42 | Deepgram | 1 (1 spoken) | 0 in 1 sample(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 1361 ms | 0 | stopped by the operator | |
| 2026-09-16T09:56:23 | Speechmatics | 1 (1 spoken) | 0 in 1 sample(s) | 0 | 0 | 0 | 0 | — | 0/0 | — | 3435 ms | 9 | stopped by the operator |
How this page measures and what it deliberately does not do
- Between samples the vendor hears silence, paced at 1×. That keeps the connection alive on every vendor and keeps the vendor's audio clock continuous, which is what lets a word be scored against the right sample even when the vendor answers after you pressed Stop.
- Azure ends a turn on silence; the session restarts the turn the way the Speech SDK does (new request id, the context and the header again), so a pause between samples does not end an Azure session.
- A session nobody watches closes itself after 45 s without a poll from this page, and after 30 minutes regardless: a realtime connection is billed by the minute.
- The audio you hear is the file, played by your browser; the vendor is fed the same bytes at the same pace from this box. The two start together and the page re-aligns the player when they drift more than a few hundred ms.
- Your microphone is a sample like any other: converted in the browser to 16000 Hz mono, posted to this box a few times a second and paced into the same connection on the same clock. Two honest differences. Nobody wrote down what you were going to say, so a take reports no word accuracy at all rather than an invented one — the language answers are the measurement there. And a frame your browser has not delivered yet goes out as silence rather than stopping the clock, because a stopped clock would put every offset the vendor reports afterwards on the wrong sample; how much of a take went out that way is on its row.
- A change inside a sample is a change nobody asked for. Every sample here is in one language, so the vendor has nothing to follow inside one; the Changes inside column counts the times it moved anyway, which is what a viewer sees as captions turning to gibberish and back.
- Batch-only APIs are not in the list — a session cannot be kept open to an endpoint that takes whole files. They are measured window by window on the main page.
v0.29.9 · back to the automatic test · this session as JSON · stored sessions as JSON