Twenty minutes of measurement beat three weeks of arguing with myself
Three recordings of the same quiet room. The median held within 2.6 dB; the peak varied by 8.6 dB — which means a peak-triggered voice detector fires on an empty room. Scope: one room, one mic, three takes, and that limit is the point.
I’m building a thing that listens to a room. Not a smart speaker — a copilot for conversations, that runs on a phone and tells you when you’re about to say something you’ll have to walk back. It has to know when someone is actually speaking.
For about three weeks the design document asserted that voice detection should trigger on a level threshold, and that the threshold could be calibrated once per environment. I had written that. I believed it. It was the kind of belief that feels like knowledge because you have typed it several times.
Then I recorded the room.
The measurement
Three 29-second recordings. Same room, same hour, same microphone, a 3D printer running in the background the entire time. Nothing moved between takes. If anything was going to be stable, it was this.
| Take | Median (dBFS) | Peak (dBFS) |
|---|---|---|
| 1 | −41.2 | −28.3 |
| 2 | −43.6 | −20.1 |
| 3 | −41.0 | −28.7 |
| spread | 2.6 dB | 8.6 dB |
The median is stable. Within about two and a half decibels across all three takes, which for a room with a machine running in it is tighter than I expected.
The peak is not stable. Eight and a half decibels of spread between takes of the same silence. And about 1% of frames in every take sit roughly 10 dB above that take’s own median.
What that costs you
Two things, and I had written the design so that both would have happened.
A peak-triggered detector fires on an empty room.One percent of frames spiking 10 dB over the floor is not a rare event — at typical frame rates that’s several times a second. A detector watching for peaks would report speech, continuously, in a room where nobody is talking.
And calibrating once per environment doesn’t work— not because environments differ, which I had accounted for, but because the same environment differs from itself. A threshold derived from take 2’s peak is wrong for takes 1 and 3, and I would have had no way to know which take I’d calibrated on.
The fix is to key off the median rather than the peak, and to keep the floor estimate rolling instead of fixed. That is not a clever fix. It is the obvious one, and it only became obvious once there were three numbers next to each other.
The scope, stated plainly
One room. One microphone. One 3D printer. Three takes, 29 seconds each, one hour. That is the entire population these numbers describe.
They are not a claim about microphones in general, about rooms in general, or about anything my software does. A café would produce different figures. A car certainly would. What generalises here is not the decibel values — it is that peak was eight times less stable than median in the one case I actually checked, and that I had assumed otherwise in writing, repeatedly, for weeks.
The actual lesson
Twenty minutes. Three recordings and a script to compute two statistics. That is what it cost to replace an argument I’d been having with myself since the design started.
I’d been treating measurement as the expensive option — the thing you do once the design settles, when there’s a real implementation to point at. It was the cheap option the entire time. Cheaper than the writing I’d done defending the wrong position.
The rule I’m keeping: when a design decision rests on an assumption about the physical world, the assumption is usually measurable in an afternoon, and the afternoon is cheaper than being wrong about it in code later. If you find yourself arguing a point with nobody, that’s the signal — you’re not short of opinions, you’re short of a number.