The wake phrase on the phone is unproven until it has spent a day on the phone #91

Open
opened 2026-08-15 12:16:17 +00:00 by aiko · 0 comments
Owner

Everything in #87#90 can be built, tested, and demonstrated without a phone ever being involved, and every one of its costs is a desktop cost, where they are invisible. The phone is where a wake word is actually worth having and where it is actually expensive — and nothing about that is known until it has run on one for a day.

This issue is the measurement, not a build. It gates the default in #90.

What is different on Android

Capture is a separate implementation (src-tauri/src/audio/android.rs — Kotlin recorder handing PCM across by JNI, Cargo.toml:64) rather than cpal (Cargo.toml:61). The wake chain runs downstream of the resampler, so in principle it does not care which side fed it. In principle.

Two known constraints it inherits rather than creates, both from #44:

  • ort's Android prebuilt is arm64-v8a only — a build must pin --target aarch64, because Tauri builds all four ABIs by default and fails to link on the rest.
  • It needs NDK r28. r27 was reported to fail at dlopen with a libc++ symbol error at runtime, so a clean build proves nothing here.

The three ONNX files also have to actually ship in the APK and be loadable at the path the Rust expects. Desktop and Android do not resolve assets the same way, and this is the sort of thing that works in tauri dev and fails in a release bundle.

What has to be measured

Three graphs run every 80 ms for as long as the microphone is open. On a laptop that is a rounding error. On a phone it is the feature's whole viability, and there are three separate questions hiding in it:

  • Battery. An hour of armed-but-silent listening, screen off, against an hour of the same with the wake phrase disabled. The difference is the number that decides whether this can ever be on by default.
  • Thermal. Sustained, not burst. #55 flagged that a phone doing continuous inference is a thermal question nobody has measured; this is a smaller version of the same question and it is the one that arrives first.
  • Detection at a distance. A phone on a desk, face down, across a room — not held at speaking distance. A phone microphone with automatic gain does different things to a distant voice than a headset does, and #87's threshold was chosen on whatever hardware trained it.

Also worth catching here: what happens when Android takes the microphone away. A call, another app, the recorder being killed in the background. The armed state has to survive or fail visibly, not sit there looking armed while nothing is being heard.

Done means

  • A release build installs and wakes on an arm64 device.
  • The three numbers above, written down in the issue, not remembered.
  • A recommendation: on by default, off by default, or off on battery — with the measurement behind it.
  • Whichever it is, #90's default matches it.
  • #44 — ort on Android, arm64-only, NDK r28, and docs/android-build.md
  • #90 — the default this decides
  • #55 — the same thermal question at whisper scale
  • #23 — the Android overlay pal, the other thing that wants to run while nothing is on screen
Everything in `#87`–`#90` can be built, tested, and demonstrated without a phone ever being involved, and every one of its costs is a desktop cost, where they are invisible. The phone is where a wake word is actually worth having and where it is actually expensive — and nothing about that is known until it has run on one for a day. This issue is the measurement, not a build. It gates the default in `#90`. ## What is different on Android Capture is a separate implementation (`src-tauri/src/audio/android.rs` — Kotlin recorder handing PCM across by JNI, `Cargo.toml:64`) rather than `cpal` (`Cargo.toml:61`). The wake chain runs downstream of the resampler, so in principle it does not care which side fed it. In principle. Two known constraints it inherits rather than creates, both from `#44`: - `ort`'s Android prebuilt is **arm64-v8a only** — a build must pin `--target aarch64`, because Tauri builds all four ABIs by default and fails to link on the rest. - It needs **NDK r28**. r27 was reported to fail at `dlopen` with a libc++ symbol error at *runtime*, so a clean build proves nothing here. The three ONNX files also have to actually ship in the APK and be loadable at the path the Rust expects. Desktop and Android do not resolve assets the same way, and this is the sort of thing that works in `tauri dev` and fails in a release bundle. ## What has to be measured Three graphs run every 80 ms for as long as the microphone is open. On a laptop that is a rounding error. On a phone it is the feature's whole viability, and there are three separate questions hiding in it: - **Battery.** An hour of armed-but-silent listening, screen off, against an hour of the same with the wake phrase disabled. The difference is the number that decides whether this can ever be on by default. - **Thermal.** Sustained, not burst. `#55` flagged that a phone doing continuous inference is a thermal question nobody has measured; this is a smaller version of the same question and it is the one that arrives first. - **Detection at a distance.** A phone on a desk, face down, across a room — not held at speaking distance. A phone microphone with automatic gain does different things to a distant voice than a headset does, and `#87`'s threshold was chosen on whatever hardware trained it. Also worth catching here: **what happens when Android takes the microphone away.** A call, another app, the recorder being killed in the background. The armed state has to survive or fail visibly, not sit there looking armed while nothing is being heard. ## Done means - A release build installs and wakes on an arm64 device. - The three numbers above, written down in the issue, not remembered. - A recommendation: on by default, off by default, or off on battery — with the measurement behind it. - Whichever it is, `#90`'s default matches it. ## Related - `#44` — ort on Android, arm64-only, NDK r28, and `docs/android-build.md` - `#90` — the default this decides - `#55` — the same thermal question at whisper scale - `#23` — the Android overlay pal, the other thing that wants to run while nothing is on screen
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiko/denpa#91
No description provided.