Skip to content

Repository files navigation

🌸 bloom

a gentle voice-practice companion β€” private, on-device, and kind to you.

made with kotlin ui ai cloud trans rights license

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 πŸ’—

πŸ³οΈβ€βš§οΈ first things first

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 πŸ’—


✨ features

  • 🎀 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.

πŸ“₯ download

bloom isn't on any app store β€” every build is published straight from github actions:

  1. open the actions tab and pick the latest green run (a Release run for tagged versions, or any CI run).
  2. 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).
  3. unzip and install app-release.apk on 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).

πŸ” privacy first

  • πŸŽ™οΈ 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.

🎚️ how the pitch magic works

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 🎚️

🧠 how the voice guide works

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.

πŸ› οΈ tech stack

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

πŸš€ building

  1. clone the repo:
    git clone https://github.com/mochibuilds/Bloom.git
  2. open in Android Studio and sync gradle.
  3. the first build fetches & compiles llama.cpp automatically via CMake (needs git + internet, and the Android NDK).
  4. 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 πŸ“š

πŸ€– CI & reproducible builds

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). bump versionCode/versionName in app/build.gradle.kts before tagging.

project structure

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

πŸ’ thanks

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 🌱

πŸ“„ license

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 πŸ³οΈβ€βš§οΈπŸŒΈ

About

🌸 a gentle, private, on-device voice-practice companion β€” live pitch feedback, cozy phonetics-friendly stories, a tiny on-device AI storyteller & soft daily reminders. made with πŸ’— for trans & gender-diverse folks πŸ³οΈβ€βš§οΈ

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages