diff options
| author | Tom Cooks <tommasogagliardi+github@gmail.com> | 2026-09-30 08:49:02 -0400 |
|---|---|---|
| committer | Tom Cooks <tommasogagliardi+github@gmail.com> | 2026-09-30 08:49:02 -0400 |
| commit | 6db1714d0354d1e1105e330ce84c46a54487c3bb (patch) | |
| tree | e4011a2b512770f271381b712bbe118de71dd8ef /README.md | |
| parent | e15b89af9889d94eca15380048fc2bf6bbc8e22e (diff) | |
| download | reccoon-6db1714d0354d1e1105e330ce84c46a54487c3bb.tar.gz | |
Main-screen recordings list, player actions, background recording, exports (1.4.0-alpha)
- Main screen: recordings list at the bottom (newest first); removed the separate
library screen and the top-right link
- Player: delete/rename/share/export, no autoplay, embedded-marker fallback
- Word-level tap-to-seek from Whisper token timestamps (length fallback)
- Export transcripts as .txt + .srt to Downloads
- RecordingService: microphone foreground service for background recording
- FileProvider for sharing on Android 9 and older
- StreamingResampler extracted to its own class + JUnit regression tests
- Bump to 1.4.0-alpha (versionCode 6)
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 53 |
1 files changed, 28 insertions, 25 deletions
@@ -9,15 +9,12 @@ on device. - **Mono switch:** optionally record a single channel (half the file size) - **Markers:** place labelled cue points while recording; they are embedded in the WAV (`cue ` + `LIST/adtl`) and shown in the player - **Silence:** optional Do Not Disturb total silence (no notifications, no vibration) while recording -- **Saving:** the WAV is written to the public **Downloads** folder as - `reccoon-YYYY-MM-DD-HHMMSS-XXXXX.wav`, where `XXXXX` is a persistent - 5-digit progressive counter -- **Library:** a list of saved recordings, with a player and a scrubber to jump - around long recordings +- **Recordings list:** scrollable list at the bottom of the main screen, newest first +- **Player:** scrubber, ±10 s jumps, speed control, delete / rename / share / export, no autoplay - **Transcription:** on-device, offline speech recognition with [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) using multilingual Whisper — works with **English and Italian** -- **Name:** RECCoon · **by** wuhei · **version** 1.3.1-alpha +- **Name:** RECCoon · **by** wuhei · **version** 1.4.0-alpha - **Icon:** raccoon with a microphone ## Requirements @@ -32,6 +29,7 @@ on device. ```sh ./gradlew :app:assembleDebug # debug APK ./gradlew :app:assembleRelease # release APK (signed with the debug key) +./gradlew :app:testDebugUnitTest # JVM unit tests ``` Outputs: @@ -39,7 +37,7 @@ Outputs: - `app/build/outputs/apk/debug/app-debug.apk` - `app/build/outputs/apk/release/app-release.apk` -A prebuilt copy is available at `dist/RECCoon-1.3.1-alpha.apk`. Note that the +A prebuilt copy is available at `dist/RECCoon-1.4.0-alpha.apk`. Note that the sherpa-onnx AAR in `app/libs/` and the APK in `dist/` are **not** tracked in git because they are large; see `TODO.md`. @@ -49,10 +47,14 @@ git because they are large; see `TODO.md`. 44100 Hz into a temporary file, then rewrites a correct 44-byte RIFF/WAVE header when recording stops. It uses stereo when available and falls back to mono, and reports per-channel peak levels to the UI. -- `MainActivity` handles the runtime permissions, the timer, and copying the - finished file into Downloads. On Android 10+ this uses `MediaStore`; on - older versions it writes directly to the public Downloads directory and - notifies the media scanner. +- `RecordingService` is a microphone-typed foreground service started while + recording, so capture continues when the app is in the background. +- `MainActivity` handles the runtime permissions, the timer, the level meters + and copying the finished file into Downloads. On Android 10+ this uses + `MediaStore`; on older versions it writes directly to the public Downloads + directory and notifies the media scanner. +- Files are named `reccoon-YYYY-MM-DD-HHMMSS-XXXXX.wav`, where `XXXXX` is a + persistent 5-digit progressive counter. ## Waveform, meters and markers @@ -63,20 +65,22 @@ git because they are large; see `TODO.md`. - The **Mark** button (enabled while recording) adds a labelled cue point at the current position. Markers are written into the WAV as standard `cue ` and `LIST/adtl` chunks (readable by Audacity/Reaper) by `WavRecorder`, and also - stored as a JSON sidecar by `MarkerStore`. `PlayerActivity` shows them as - chips that seek the player when tapped. -- The **Mono** checkbox records a single channel instead of stereo. -- The **Silence alerts** checkbox switches the phone to Do Not Disturb total - silence while recording and restores the previous setting on stop. It needs - the `ACCESS_NOTIFICATION_POLICY` permission, granted in system settings when - first enabled. + stored as a JSON sidecar by `MarkerStore`. The player reads the sidecar and + falls back to `WavMarkers`, which parses the embedded chunks. -## Library and player +## Recordings list and player -- `RecordingsActivity` lists the `reccoon-*.wav` files in Downloads. +- The main screen shows a scrollable list of recordings, newest first. Tapping a + row opens `PlayerActivity`. - `PlayerActivity` plays a file with the platform `MediaPlayer`, a scrubber - (`SeekBar`), ±10 s jumps and a playback speed control (0.5×–2×). Tapping a - transcript line seeks the player to that moment. + (`SeekBar`), ±10 s jumps and a playback speed control (0.5×–2×). Playback does + **not** start automatically. +- Library actions: **Share** (FileProvider on Android 9 and older), **Rename** + (MediaStore or file), **Export** (writes `.txt` and `.srt` to Downloads) and + **Delete** (removes the WAV and its sidecars). +- Transcript words are clickable: tapping a word seeks the player to it. Word + timings come from Whisper token timestamps when available, otherwise the + segment is divided between its words. ## On-device transcription @@ -97,11 +101,10 @@ git because they are large; see `TODO.md`. - Language can be forced to English (`en`) or Italian (`it`), or left on **Auto detect**. - Transcripts are stored as JSON sidecars in app-private storage - (`filesDir/transcripts/<recording>.json`) and are shown in the player. A - `TXT` badge marks recordings that already have a transcript. + (`filesDir/transcripts/<recording>.json`). ## Native libraries and APK size The APK bundles the sherpa-onnx/onnxruntime native libraries for `arm64-v8a` -and `x86_64`, so it is around 70 MB. Removing `x86_64` from the `abiFilters` +and `x86_64`, so it is around 72 MB. Removing `x86_64` from the `abiFilters` in `app/build.gradle.kts` roughly halves the APK size for phone-only builds. |
