Murmur

Offline speech to text on Android: a C++17 core over whisper.cpp, 3.6 to 6.1 times real time on a phone.

How it connects

whisper.cppC++17 coreJNIKotlin app

CategoryEmbedded & On-device
Timeline2026
ContextPersonal product · Solo
StatusUnreleased
3.6-6.1xreal time on a Dimensity 8300 phone
191JVM tests
Offlinetranscription once the model is on the phone

The product

Murmur records or imports audio and transcribes it on the phone, with no server. The Kotlin app sits on a C++17 core (resampler, voice activity detection, transcriber) that talks to whisper.cpp through a JNI bridge. A second engine runs Gemma on-device through LiteRT-LM.

On a Dimensity 8300 phone it transcribes at 3.6 to 6.1 times real time. Long jobs run in foreground services, pick up where they stopped if Android kills them, and slow down when the phone gets hot.

Under the hood

THE ENGINEERING

  • 01

    C++17 core with RAII classes that own their whisper contexts, built for arm64 through CMake and the NDK

  • 02

    A release-only bug caught in development: R8 could rename a JNI callback the C++ looks up by name, which would have silently stopped transcript segments in release builds. Keep rules fixed it, checked in mapping.txt

  • 03

    A Room-backed job queue: work interrupted by a crash or an OS kill is re-queued at startup and resumes from the last committed chunk

  • 04

    A thermal listener steps the thread count down as the phone heats up

  • 05

    Recording with AudioRecord and MediaCodec to AAC, and decoding of common formats through MediaExtractor, so no FFmpeg build was needed

  • 06

    R8-shrunk release APK of about 5.9 MB with 16 KB page support