Measured on the phone

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.

Kokoro voice generation

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 configurationTrialGenerationAudioReal-time factor
CPU110.334 s9.717 s1.06
CPU210.430 s9.717 s1.07
NNAPI requested → CPU fallback113.092 s9.717 s1.35
NNAPI requested → CPU fallback217.008 s9.717 s1.75
CPU · 4 threads19.137 s9.717 s0.94
CPU · 4 threads28.933 s9.717 s0.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.

Pause and resume

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.

Earlier language-model measurements

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/configurationTimeCorrectness
Qwen3 1.7B CPU596.408 s6/6 checked facts, missing formula callouts
Qwen3 1.7B GPU layers 99122.545 sSame raw answer, 4.87× faster in this run
Qwen3 0.6B CPU278.215 s4/6 facts; wrong equation variables
Qwen3 0.6B GPU layers 9969.570 s4/6 facts; wrong variables and invented narration
Gemma 3 1B CPU314.318 s0/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.

Illustrated books

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.

Crash regression

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.

Full methodology and earlier results · Report a bug