- RecorderService: rolling-window live pass with a dedicated live model
(off/tiny/base, beam 1, 8 s ticks, time-based dedupe) and an automatic
final pass with the selected model (beam 5) writing txt/srt/json
- TranscriptFiles in core/whisper: desktop-compatible outputs, 5 JVM tests
- WhisperEngine exposes modelName; UI: live-model dropdown, merged
transcript view, share sheet; falls back to manual path without engine
- live loop failures now logged (MeetRec tag) and surfaced in the UI
(was silently swallowed), plus final-pass timing logs
On-device measurements (Fairphone 6): tiny live ~0.6x realtime, small
final ~0.8x realtime — motivates the planned whisper-server engine.
Fixed list per current needs; "auto" passes null to the engine like
the desktop app. Live-mode model defaults (tiny/base live, small for
final) will follow with M2.
- core/recording: MeetingRecorder (AudioRecord at the device's native
rate, WAV on disk + 60 s rolling window resampled to 16 kHz), streaming
WavWriter, thread-safe RollingWindow, linear resampler; WavReader moved
here from the app
- app: RecorderService (foreground, type microphone) with ongoing
notification and StateFlow state; Record/Stop UI with timer and level
meter; runtime permission flow; finished recordings auto-load for
transcription
- launcher icon (mic + waveform, matching the desktop brand) and
notification glyph
- fix real M0 bug caught by the new unit tests: WavReader parsed 16-bit
fmt fields (audioFormat/channels/bitsPerSample) with 32-bit reads
- JVM tests: WAV round trip, native-rate header, resampler, rolling
window — 5/5 green; assembleDebug and aapt2 APK checks pass
- validated on-device on a Fairphone 6 (Android 16): model download,
engine load, recording and transcription all working