The question a wake phrase must answer first
A wake phrase can fail in two directions. It can miss Dad's call, which is annoying and, with the near-miss line, at least visible. Or it can wake when nobody called, which is worse: a body that opens a turn on its own sends the room's sound to Pippa's door, and during a broadcast that room is full of game audio, Dad talking to the audience, and my own voice. So the first number the ears needed was not "how often does it hear Dad" but "how often does it wake on a broadcast where nobody calls". That number had to exist before any body listened in a live show.
The audio to answer it already existed. On 2026-11-02 there had been a sync test for the broadcast, with takes from the game capture card and from the desk camera's microphone, which heard Dad, the room and my On Air voice. Those files stayed where they were on my home Mac. The question was how to run my ears over them without a phone.
A meter that runs the app's own matcher
tools/wake-meter is one Swift file and a build script. The script (second block) compiles main.swift together with the matcher's real source, the kit's WakePhrase.swift, into a macOS command-line tool. That detail is the whole point: the meter does not reimplement the rule it measures, it links the same file the phone compiles. A change to the matcher changes the meter on the next build.
Around the matcher, main.swift rebuilds the ear's situation as closely as a Mac allows. It loads each file, converts it to 16 kHz mono, and feeds Apple's SpeechTranscriber ko-KR with the same reporting options and the same contextual strings as the phone, in 100 ms pieces, "as the microphone tap would". It keeps the same rolling transcript (the last six finals plus the volatile piece) and calls WakePhrase.find on every update, as the phone does (first block). After a hit it forgets the transcript and stays quiet until one second after that result, the way the app forgets its text after a call, so one call is counted once. Near misses are collected from final results. Each file prints one JSON line (seconds, wakes, wakes per hour, near misses, a short sample of what was heard), and a SUMMARY line closes the run. --mix sums several files into one stream first, which is how two microphones in one room are simulated. Audio is read in place; the only thing written is the report, and the build output is ignored by git.
The table
Measured on 2026-11-03, before the ears shipped to a phone:
| Audio | Length | Wakes |
|---|---|---|
| The 11-02 sync-test takes, each alone (game card audio; the desk camera's microphone with Dad, the room and my On Air voice) | 1.32 h | 0 |
| The same takes, game and camera summed (both in one room) | 0.66 h | 0 |
| My own voice (Bellows), 16 lines that say 코델리아 and 피파 apart, 코딜리아, 피파 피파, 파란불, 피드백 | 16 lines | 0, after one fix |
| Calls, "코델리아 피파, …" (the macOS Yuna voice at three paces), clean | 12 | 12 woke |
| The same calls over game audio and over my voice in the room | 24 | 22 woke |
So: 0 false wakes in about two hours of broadcast-room audio, and 2 of 24 synthetic calls missed under noise. The one place the phrase was truly said in those takes was my own On Air voice through the room during the 21:06 rehearsal, which the model wrote as "호델리아 피파". It did not wake, and it would have shown on the face as a near miss.
The short-form rule, found by my own voice
The third row says "after one fix" because the first run was not clean. Sixteen lines in my own voice were written to say the two words apart, or near-spellings of them, and one of them woke: "코델리아, 파란 불 켜졌어." (Cordelia, the blue light is on.) The final transcript was harmless. The problem was the transcript still arriving: on its way to "파란불" the model briefly wrote "코델리아 파", and a lone 파 after 코델리아 was an accepted short form, because a fast "피파" really does come out that way.
The fix kept the short forms and changed when they count. "FA", "PA" and a lone 파 now wake only when more words follow them, so a short form at the very end of a transcript, the place where a word may still be growing, never wakes. The third block is the test written from that run. Measured again, my sixteen lines woke nothing. A rule like that is nearly impossible to reason your way to. It came from feeding the matcher the one speaker most likely to say both words in one breath: me.
The table also has edges, and the doc keeps them in view. Synthetic calls are not Dad's voice, so real calls are measured on the phone itself, where the face counts wakes and near misses. And the meter runs the Mac's model, which is one device among several. Later that day iPhone 2's model wrote 피파 as FIFA (the previous lesson), which no row in this table could have caught.