Updated 26 October 2026. Pixel 9a, Android 17 developer preview, debug build 1.7.3 (32). Results are device observations, not promises for other phones.
Bella voice, 24 kHz, two CPU threads, same opening sentence of Pride and Prejudice, cached assets, two sequential trials per requested provider. Time excludes model setup. Real-time factor is generation time divided by audio duration; smaller is faster.
| Requested configuration | Trial | Generation | Audio | Real-time factor |
|---|---|---|---|---|
| CPU | 1 | 10.334 s | 9.717 s | 1.06 |
| CPU | 2 | 10.430 s | 9.717 s | 1.07 |
| NNAPI requested → CPU fallback | 1 | 13.092 s | 9.717 s | 1.35 |
| NNAPI requested → CPU fallback | 2 | 17.008 s | 9.717 s | 1.75 |
| CPU · 4 threads | 1 | 9.137 s | 9.717 s | 0.94 |
| CPU · 4 threads | 2 | 8.933 s | 9.717 s | 0.92 |
Four threads averaged 9.035 seconds versus 10.382 seconds for two: 1.15× throughput, or 13.0% less generation time on this short passage. The modest gain is not a full-book or battery benchmark. Two threads remain the balanced default; four is available for speed.
The device reports eight online CPUs, grouped as four up to 1.95 GHz, three up to 2.60 GHz, and one up to 3.105 GHz. These are reported maximum frequencies, not observed sustained clock rates. Kokoro thread counts are inference workers, not all Android threads.
CPU remains recommended. NNAPI identified 903–921 supported nodes out of approximately 3,600, but session creation failed. Firebrat fell back to CPU successfully. These are fallback timings, not GPU acceleration measurements. CPU setup took 1.210 seconds; NNAPI attempt plus CPU fallback took 2.143 seconds.
All six outputs contained 233,200 finite samples, with nonzero peak 0.601 and identical duration. This checks signal validity, not listening quality, pronunciation or every voice. Two-thread settings reduce CPU concurrency; no controlled comparison against the previous default thread count was completed. Device heat and background activity were not controlled; energy use was not measured.
Pride and Prejudice resumed after 212 of 463 sections and saved section 213. SHA-256 checks of sections 1 and 212 remained unchanged. The conversion was paused before the voice benchmark. Full-book completion is not claimed.
Single technical-passage debug runs on the Pixel 9a. These measure the GGUF language model, not Kokoro. Different outputs make some timings unsuitable for direct ranking.
| Model/configuration | Time | Correctness |
|---|---|---|
| Qwen3 1.7B CPU | 596.408 s | 6/6 checked facts, missing formula callouts |
| Qwen3 1.7B GPU layers 99 | 122.545 s | Same raw answer, 4.87× faster in this run |
| Qwen3 0.6B CPU | 278.215 s | 4/6 facts; wrong equation variables |
| Qwen3 0.6B GPU layers 99 | 69.570 s | 4/6 facts; wrong variables and invented narration |
| Gemma 3 1B CPU | 314.318 s | 0/6 facts; failed source fidelity |
Qwen3 1.7B peak PSS: CPU 2.43 GiB, GPU 2.72 GiB. These single sequential runs are not controlled power or thermal benchmarks. Gemma 3 4B download completion is not an inference correctness result.
A three-page public-domain Peter Rabbit excerpt took 6m31s initially and 5m16s after extraction fixes. Three page-linked pictures were preserved, but source wording still failed. A later cached replay verified exact wording using source fallback; it was not a fresh inference speed benchmark. Full-page pictures preserve layout; precise automatic figure cropping remains unsupported.
The observed Play 1.7.2 crash was an ONNX JNI TensorInfo class lookup failure after release shrinking. Release keep rules and a finished-bundle class check now guard against it. The observed crash does not establish that GPU layers 99 caused an out-of-memory failure.
Validation: clean app analysis; 106 app tests; 98 backend tests with three existing skips; three added local evidence tests. Local character analysis remains optional and conservative: unknown speakers use the narrator.