a gentle voice-practice companion β private, on-device, and kind to you.
bloom helps you explore and train your voice with live pitch feedback, cozy reading material, an optional on-device AI storyteller, a gentle voice tutorial, and soft daily reminders. made with love for everyone finding their voice β especially trans & gender-diverse folks π
trans people exist, and trans people deserve rights. full stop. trans women are women, trans men are men, and non-binary people are real. trans youth are not a political debate β they are kids who deserve safety, support, healthcare, joy, and the freedom to grow into who they are.
bloom was built in that spirit. whether you're trans, non-binary, questioning, or exploring your voice for any other reason (singers, actors, voice therapy, or just for fun) β you are welcome here exactly as you are.
if you're a trans kid or teen and things feel heavy right now: your identity is real, your voice is yours, and you are so loved. you are not alone β organizations like The Trevor Project, Trans Lifeline and Point of Pride exist to support you π
- π€ live pitch practice β a from-scratch YIN pitch detector listens to your mic and draws your voice as a blooming line. the pink bloom zone (165β220 Hz) shows when you're in your target range.
- π beautiful progress β sessions, voiced minutes, and a gentle streak that forgives rest days π
- π story time β curated reading passages designed with voice-training phonetics in mind (high vowels, rising intonation, soft consonants), plus an optional on-device AI storyteller (Qwen2.5-0.5B-Instruct) that writes tiny wholesome stories just for you, streaming token by token. AI stories may contain errors or unexpected content β read gently!
- π voice guide β a gentle tutorial on how your larynx & resonance work, with safe, strain-free exercises loved by the trans voice community (NG sirens, swallow larynx-mapping, tiny-puppy whines & more).
- π self-care β daily practice reminders that survive reboots, plus voice-health rules.
- π gratitude β a little page that says thank you to the people (and models) who made bloom possible.
bloom isn't on any app store β every build is published straight from github actions:
- open the actions tab and pick the latest green run (a Release run for tagged versions, or any CI run).
- scroll to Artifacts at the bottom of the run and download it β it's a zip containing
app-release.apk(+ an AAB if you want one). - unzip and install
app-release.apkon your device: API 26+, 64-bit only π
android will ask you to allow install unknown apps for your browser or file manager β that's normal for sideloaded apks. note: builds are unsigned, so if you installed an older signed version of bloom, uninstall it first (android blocks signature changes).
- ποΈ audio is analyzed in memory and thrown away immediately β never recorded, never saved.
- π progress lives in a private file on your device only.
- π§ the AI storyteller runs fully on-device (CPU-only). your stories never touch a server.
- πΆ the 491 MB model downloads only over WiβFi, and only if you ask for it.
bloom implements the YIN algorithm (de CheveignΓ© & Kawahara, 2002) in pure Kotlin: a sliding window computes the cumulative mean normalized difference function, finds the first clear dip below threshold, and refines it with parabolic interpolation for sub-sample accuracy. the result is smoothed with a rolling median and drawn on a logarithmic scale, because ears hear pitch logarithmically ποΈ
the guide is built on techniques widely used in gender-affirming voice training and shared by SLPs & the trans voice community:
- resonance over pitch β a brighter, "smaller-space" voice reads as more feminine; gently raising the larynx shortens the vocal tract.
- the swallow β feel your larynx lift & become friends with it.
- NG sirens β sliding sirens on "ng" connect registers without strain.
- tiny puppy / big dogβsmall dog β soft whines teach forward, bright placement.
- high vowels & rising intonation β "ee"-heavy words and questions naturally brighten the voice.
- safety first β never push through pain; short daily practice wins; an SLP is the gold standard when accessible.
| layer | what |
|---|---|
| UI | Kotlin + Jetpack Compose, Material 3 |
| pitch detection | YIN, implemented from scratch (no libraries) |
| audio | AudioRecord raw mic, 16 kHz mono, sliding-window analysis |
| on-device LLM | llama.cpp via JNI + CMake, Qwen2.5-0.5B-Instruct (Q4_K_M GGUF) |
| reminders | AlarmManager exact alarms + BroadcastReceiver, boot-resilient |
| storage | plain JSON in app-private storage, SharedPreferences for settings |
- clone the repo:
git clone https://github.com/mochibuilds/Bloom.git
- open in Android Studio and sync gradle.
- the first build fetches & compiles llama.cpp automatically via CMake
(needs
git+ internet, and the Android NDK). - run on any 64-bit device or emulator with API 26+.
the AI storyteller model (491 MB) is downloaded inside the app (stories tab β download), over WiβFi only. without it, bloom gracefully falls back to the built-in storybook π
github actions keeps every build on the exact same toolchain as your machine:
| piece | pinned to | where |
|---|---|---|
| JDK | Temurin 25 | gradle/gradle-daemon-jvm.properties + workflows |
| Gradle | 9.5.0 (SHA-256 verified) | gradle/wrapper/gradle-wrapper.properties |
| build-tools | 36.0.0 | app/build.gradle.kts (buildToolsVersion) |
| CMake | 3.22.1 | app/build.gradle.kts (externalNativeBuild) |
| NDK | 28.2.13676358 | app/build.gradle.kts (ndkVersion) |
| llama.cpp | commit 61141f1 |
CMakeLists.txt (FetchContent) |
- CI β runs on every push to
main+ pull request: builds release & debug APKs, runs unit tests, uploads the APKs as artifacts. - Release β runs when you tag a commit with
v*(or manually): builds an unsigned release APK + AAB; download them from the run's Artifacts tab (kept for 1 year). bumpversionCode/versionNameinapp/build.gradle.ktsbefore tagging.
app/src/main/java/com/translabs/bloom/
βββ MainActivity.kt # navigation + first-boot permissions
βββ audio/
β βββ PitchTracker.kt # mic β sliding window β pitch flow
β βββ YinPitchDetector.kt # the YIN algorithm ποΈ
βββ data/
β βββ SessionStats.kt
β βββ SessionStore.kt # private on-device JSON store
βββ reminders/
β βββ ReminderScheduler.kt # AlarmManager daily alarm
β βββ ReminderReceiver.kt # posts the notification
β βββ BootReceiver.kt # reschedules after reboot
βββ story/
β βββ ModelDownloader.kt # WiβFi-gated GGUF download
β βββ StoryViewModel.kt
β βββ LlamaCpp.kt # JNI bridge
β βββ Passage.kt # built-in storybook
βββ ui/
βββ LivePitchScreen.kt
βββ ProgressScreen.kt
βββ StoryScreen.kt
βββ GuideScreen.kt
βββ CareScreen.kt
βββ CreditsScreen.kt
βββ theme/ # colors, type & pitch math
app/src/main/cpp/
βββ CMakeLists.txt # fetches & builds llama.cpp
βββ llama_bridge.cpp # JNI glue
bloom grew with a little help from:
- Mochi β for the love, the vibes & for believing in bloom π
- Qwen3.8-Max, Qwen3.8-27B β for every bug we squashed together β¨
- Femtanyl β for the music πΆ
- Qwen2.5-0.5B-Instruct β the tiny on-device storyteller π€
- the trans voice community β the SLPs, coaches & friends whose shared knowledge made the guide & passages possible π³οΈβ§οΈ
and thank you, for showing up for your voice π±
MIT Β© Mochi β take it, learn from it, make it yours π (see LICENSE)
made with π, tea π« and a tiny 0.5B model running on your phone. trans people exist, trans people deserve rights, and trans youth deserve to bloom π³οΈββ§οΈπΈ