MicTester

Where microphone latency comes from, and what your browser reports

Press start and open the Timing panel. Everything there is read live from your machine at the moment you look — the arithmetic that produces those milliseconds is below.

Sample trace

A drawing, not a recording — nothing here came from a microphone yet.

Spectrum

low → high frequency

Level (dBFS)

Peak -12.3|RMS -21.3|Hold −∞

−50−20−9−0.5−600

Reading: On target — that is the sample trace’s own peak, not yours.

Before the browser asks

  • · Your browser will ask for permission. Nothing happens until you allow it.
  • · The page then reads three things: the waveform, how loud you are, and the device list.
  • · No recording starts on its own. The recorder has its own button below.
  • · Audio is processed in this tab and never uploaded — there is no server to upload it to.
  • · Every processing stage is another buffer. With all three off, the figures describe the path and none of the cleanup bolted onto it.

Where audio delay actually comes from

Digital audio is not processed sample by sample. It is processed in blocks, and a block cannot be worked on until it is full — so every buffer in the chain costs you the time it takes to fill. That single fact explains almost all latency you will ever meet, and it makes the arithmetic unusually clean: a buffer of n frames at r samples per second holds n ÷ r seconds of sound, and adds that much delay.

The Web Audio API sets the smallest unit — the render quantum — at 128 sample frames by default, and 1.1 lets a context ask for a hardware-chosen size instead of that default. Take the default, which is what you almost certainly have, and the figures come out as whole numbers of those blocks. The specification even works the example itself: an audio context at 44.1 kHz with the default render quantum, whose destination node double-buffers internally, has a processing latency of (2 × 128) ÷ 44100, which is approximately 5.805 ms. That is the specification’s own arithmetic, and you can check it on a calculator.

Buffer size to milliseconds, exhaustively

Every cell is frames ÷ sample rate × 1000, computed at build time from src/lib/dbfs.ts and asserted individually in this project’s tests. Round trip assumes the same buffer size on the way in and the way out, which is the common case but not a rule. Nothing here was measured on any machine; it is division. The row at 256 frames and 44 100 Hz reproduces the Web Audio specification’s own worked example exactly.
Buffer Render quanta At 44 100 Hz At 48 000 Hz Round trip at 48 kHz
128 frames 1 2.902 ms 2.667 ms 5.333 ms
256 frames 2 5.805 ms 5.333 ms 10.667 ms
512 frames 4 11.610 ms 10.667 ms 21.333 ms
1024 frames 8 23.220 ms 21.333 ms 42.667 ms
2048 frames 16 46.440 ms 42.667 ms 85.333 ms

Two things fall out of that table. First, doubling the buffer doubles the delay exactly — there is no diminishing return and no clever scheduling that escapes it. Second, the sample rate matters less than people expect: moving from 44.1 to 48 kHz shaves about 8% off every figure — the ratio 44100 ÷ 48000 — while halving the buffer removes 50%. If you are chasing latency, the buffer is the lever.

What your browser will and will not tell you

The Timing panel above reads three values live. AudioContext.baseLatency is defined by the Web Audio specification as the seconds of processing latency incurred passing audio from the destination node to the audio subsystem — and the specification is careful to say it excludes the audio graph’s own latency and anything between the destination and the hardware. AudioContext.outputLatency is defined as an estimate of the interval between the browser asking the host system to play a buffer and the first sample actually being produced by the output device; the specification notes it depends on the platform and the connected hardware and can change while the context is running. The sample rate is what your context actually opened at.

What this page does not claim. Those are your browser’s estimates for your machine, read at the moment you look. They are not a MicTester measurement, they are not comparable across machines, and a browser that has not implemented a property shows “not reported” rather than a plausible-looking number. We have no microphone array, no second operating system and no way to benchmark hardware, so this site publishes no latency league table — only your own reading and the arithmetic that explains it.

Asking for lower latency, and why it may not arrive

There is a constraint for this. The specification defines latency as a ConstrainDouble measured in seconds, described as the time between the start of processing — for instance, when a sound occurs in the real world — and the data being available to the next step. It then adds the sentence that matters: the number is expected to be the target latency of the configuration, and the actual latency may show some variation from it.

So a page can ask, and a browser can agree to the request while delivering something else. That is the reason this page shows you what you got, and the reason the Timing panel sits next to the track readout: getSettings() reports what the track actually holds, which is the only figure worth acting on.

Reducing the delay you can control

  1. Turn processing off when you do not need it. Echo cancellation, noise suppression and gain control are each a stage with a buffer. This page starts with all three off for that reason.
  2. Prefer wired. A radio link adds an encode, a transmit and a decode that no buffer arithmetic on this page covers.
  3. Use the device’s own driver. Interfaces that ship a dedicated driver usually allow smaller buffers than a generic class driver will.
  4. Do not monitor through the computer. If your interface has direct hardware monitoring, it bypasses every millisecond in the table above — the delay becomes zero because the signal never enters the computer.
  5. Stop chasing it for calls. On a conference call the network dominates completely, and shaving five milliseconds locally changes nothing anybody can hear.

Latency you can hear, and what causes it

  • Hearing yourself echo while wearing headphones on a call — the far end’s return path, not your capture. Nothing on this page affects it.
  • Your voice arriving late in a recording alongside a backing track — capture buffer plus output buffer, which is the round-trip column above. Most recording software can compensate for a fixed offset if you tell it the number.
  • A wireless headset feeling laggy — the radio link. Try the same test on a wired device and compare the reported figures.
  • Everything fine until you share your screen — that is CPU contention forcing larger buffers, not a microphone fault. Check whether the reported figures change while sharing.

If the delay arrives with dropouts instead of as a clean offset, the problem is usually level or device selection, and timing is a red herring — the quiet-microphone page and the headset test cover those.

FAQ

Latency questions

Can a web page measure my microphone latency?

It can read what your browser reports, and this page does exactly that — no more. AudioContext.baseLatency and AudioContext.outputLatency are values your browser computes for your machine and your device, shown live in the Timing panel above. What no web page can do is measure the acoustic round trip from your mouth to your ears, because that involves hardware neither the browser nor we can see. We have benchmarked no devices and publish no comparison table of anyone’s hardware.

What is baseLatency, exactly?

The Web Audio specification defines it as the number of seconds of processing latency incurred passing audio from the destination node to the audio subsystem. It explicitly excludes latency from the audio graph itself and anything between the destination and the hardware. So it is one component of your total delay — a real one, and the only one the browser will tell you a number for.

Why do the latency figures keep landing on multiples of 128?

Because the Web Audio render quantum defaults to 128 sample frames, and audio is processed a block at a time. Read the specification carefully and 128 is the default rather than a law: Web Audio 1.1 defines a render size category of either “default”, which it puts at 128 frames, or “hardware”, where the user agent picks a size to suit the machine — asked for with renderSizeHint and read back as renderQuantumSize. With the default in force, the buffer sizes handed out are whole numbers of those blocks and the delay each contributes is frames divided by sample rate. The table above is that division for the buffer sizes you will actually meet.

Does turning noise suppression off reduce latency?

It removes a processing stage, and every processing stage needs a buffer to work on. That is why this page starts with all three switches off — you are timing the path itself, with none of the cleanup bolted onto it. What we cannot honestly tell you is how many milliseconds each one costs on your machine, because that is implementation-specific and we have not measured it. Toggle them yourself and watch the reported figures.

Can I ask the browser for low latency directly?

There is a constraint for it. The specification defines latency as a ConstrainDouble in seconds — and adds the caveat that the number is a target, and the actual latency may show some variation from it. Asking is not receiving; the Timing panel shows what you actually got.

Why do I hear myself delayed in a call?

You are hearing the far end’s return path, not your own microphone. That round trip adds up your capture buffers, an encoder, the network, the far end’s decoder and its output buffers — and the network part alone usually dwarfs everything on this page. The buffer arithmetic above tells you the floor your local hardware imposes; it cannot tell you anything about the internet between you.

More from MicTester

Faults a delay figure will never show you

  • the full mic test with every switch on one page — waveform, spectrum, dBFS meter, recorder and device picker together, with all three processing toggles exposed.
  • mic test for Discord — Runs the same record-and-play-back loop Discord’s own Mic Test does, with Discord’s processing defaults switched on, plus the exact menu path to Voice & Video.
  • mic test for Zoom meetings — Watch your input level the way Zoom’s Input volume bar moves, with automatic gain left on so you can see it ride.
  • Keyboard Tester — The same idea for the other input device: press a key, watch it light up, and see the exact event your browser received.
  • Click Speed Test — Counts clicks per second against the browser’s own timestamps, so the deadline holds even when the frame rate does not.