Groups | Search | Server Info | Login | Register
Groups > comp.mobile.android > #153761
| From | Maria Sophia <mariasophia@comprehension.com> |
|---|---|
| Newsgroups | comp.mobile.android, alt.comp.os.windows-10, alt.comp.microsoft.windows |
| Subject | Tutorial: Windows/Android privacy de-googled STT optimized for speed |
| Date | 2026-04-30 02:53 -0600 |
| Organization | BWH Usenet Archive (https://usenet.blueworldhosting.com) |
| Message-ID | <10sv59k$1d9o$1@nnrp.usenet.blueworldhosting.com> (permalink) |
Cross-posted to 3 groups.
Tutorial:
HeliBoard keyboard & WhisperIME STT on a low-end Samsung for privacy,
speed & stability set up & tested completely from Windows.
As always, please help everyone if I've made any errors or omissions.
Note: The entire setup & testing was done using scrcpy & adb
on Windows over USB with Developer Options USB Debugging turned on.
I never once had to even touch the phone, and, if the phone was on
Wi-Fi, it could have been anywhere in the house on the LAN.
1. Obtain and install the HeliBoard apk
Name: HeliBoard_3.9-release.apk
Size: 22559621 bytes (21 MiB)
SHA256: 4CCCF4943AD4E5FCE218EC47153C57A783C56B12A3C18D82FF0D36686EFB837D
adb install HeliBoard_3.9-release.apk
2. Enable HeliBoard as an available input method
This registers the keyboard with the Android system so it can be selected.
adb shell ime enable helium314.keyboard/.latin.LatinIME
Note we cannot set a keyboard as default until we enable it first.
3. Set HeliBoard as the active default keyboard
This physically switches the on-screen keyboard to HeliBoard immediately.
adb shell ime set helium314.keyboard/.latin.LatinIME
4. Check that the voice input is turned on (it ususaly is, by default)
adb shell am start -n helium314.keyboard/.settings.SettingsActivity
HeliBoard Settings > Toolbar > Select toolbar keys > Voice input = on
5. Obtain & install the WhisperIME engine
Name: org.woheller69.whisper_36.apk
Size: 22593805 bytes (21 MiB)
SHA256: 39DF3E8200B9BD9697E97693DDF81D61E928C6E526FD76F0B5BFCC6911534192
Note that WhisperIME is not the same as Whisper+.cpp but they're similar.
adb install org.woheller69.whisper_36.apk
Note: It's critical to NOT open the woheller69 Whisper app on Android yet!
It's not intuitive that the woheller69 app has almost no settings whatsoever.
Upon its first launch, the WhisperIME app checks its internal data folder
(/Android/data/org.woheller69.whisper/files/) for specifically named models.
This is hard coded. The app will download the models if they don't exist.
If it finds the folder empty, it triggers a "Force Download" prompt for
the ~435MB Multilingual Base model. There is no other option.
WhisperIME is minimalistic, but that is too large for our low-end Samsung.
By staying out of the app now, we can "pre-seed" that /files/ folder with
the ~40MB Tiny English model first. When we finally open the WhisperIME app,
it will see the files with the correct name (even as the size is different).
This tricks the app into assuming setup finished, which allows us to use
the smallest language files possible in the minimalist woheller69 app.
6. Obtain the WhisperIME tflite tiny model
Name: whisper-tiny.en.tflite
Size: 42103936 bytes (40 MiB)
SHA256: 632F4014EC3F9C714A9500B08902F6490F611F06DD3E7021D9FED79888220ABB
7. Fake the first time Whisper starts into thinking it has the larger model
When WhisperIME starts up, it's *hard coded* to look for a file named
whisper.tflite, which, if it doesn't exist, triggers the download of
a massive ~435MB file, which this trick is intended to avoid happening.
There is no way around this hard-coded file name in the GUI.
Unlike Whisper+.cpp, there are no settings in WhisperIME.
Hence, there is no "Install" option in WhisperIME.
There is just the "Download" option in WhisperIME.
To get past that restriction, just give it the file "name" it wants.
Create the target directory:
adb shell "mkdir -p /storage/emulated/0/Android/data/org.woheller69.whisper/files"
Note: We need to make the target directory because WhisperIME hasn't run yet.
/storage/emulated/0/Android/data/org.woheller69.whisper/files/
Push the tiny tflite model into that directory but copy it also
to what WhisperIME expects the name to be (which can be deleted later).
adb push whisper-tiny.en.tflite /storage/emulated/0/Android/data/org.woheller69.whisper/files/
adb shell "cp /storage/emulated/0/Android/data/org.woheller69.whisper/files/whisper-tiny.en.tflite /storage/emulated/0/Android/data/org.woheller69.whisper/files/whisper.tflite"
Note: Pushing this ~40MB file to whisper.tflite satisfies the app's
internal launch check without requiring the ~435mb download.
Note that WhisperIME works differently after the first startup!
On the second and successive startups, WhisperIME doesn't just look
for one file anymore. WhisperIME scans the file directory which,
since we will set WhisperIME to "English, only fast", means it looks
for a file named whisper-tiny.en.tflite in that same directory.
8. Grant microphone permission to WhisperIME
adb shell pm grant org.woheller69.whisper android.permission.RECORD_AUDIO
Note: HeliBoard doesn't need microphone permission because it hands the
microphone task off to the voice-recognition service (i.e., Whisper).
9. Set Whisper to be the global voice-recognition provider
On de-googled devices, the standard "Voice Input" menus are missing.
Hence, use ADB to manually set WhisperIME as the system-wide
voice recognition provider so it works inside HeliBoard & in other apps.
adb shell settings put secure voice_recognition_service org.woheller69.whisper/com.whispertflite.WhisperRecognitionService
Note that using adb to set the voice_recognition_service is the
only way to get true STT on de-Googled ROMs or on debloated Samsung
devices because the system settings menu for Voice Input often
disappears entirely. This happens because that menu is usually
hard-coded to look for com.google.android.googlequicksearchbox
or Samsung's Bixby.
Note this setup does not create or touch any digital assistant
where a digital assistant listens for keywords like "Hey Google".
Because it isn't an assistant, it doesn't run a constant background
check waiting for a wake-word. It only activates when you tap the
mic button.
10. Optimize for stability on low-end Samsung devices.
Low-end Samsung devices are shockingly aggressive with memory management.
Hence, explicitly whitelist WhisperIME to keep it from being killed mid-sentence.
a. Whitelist from Deep Sleep
adb shell dumpsys deviceidle whitelist +org.woheller69.whisper
b. Allow background activity
adb shell cmd appops set org.woheller69.whisper RUN_ANY_IN_BACKGROUND allow
c. Bypass the Phantom Process Killer (Android 12+) for less-powerful CPUs
adb shell cmd device_config put activity_manager max_phantom_processes 2147483647
d. Grant permission for the minimalistic listening pop-up overlay
adb shell "appops set org.woheller69.whisper SYSTEM_ALERT_WINDOW allow"
11. Optimize Whisper using the hidden settings activity
adb shell am start -n org.woheller69.whisper/com.whispertflite.WhisperRecognitionServiceSettingsActivity
This brings up a hidden menu where the following can be set:
Whisper Voice Input
Model: English, only fast
Language: Detect language (grayed out)
Simplified Chinese [_]
12. Now we can safely open the WhisperIME app by tapping on the app icon.
When it runs for the first time, it will scan the directory, see the
pre-seeded ~40MB whisper.tflite & skip the massive ~435MB download.
Whisper opens to its main activity com.whispertflite.MainActivity
If necessary, set it to the same settings as in the service above.
Model: English only, fast
Language: Detect language (grayed out)
Status
Append [_]
Translate to English [_]
13. Set the Whisper listening dialog overlay to automatic
(also called a voice overlay or the STT interface)
First, bring up the Whisper listening dialog to it's default
adb shell am start -n org.woheller69.whisper/com.whispertflite.WhisperRecognizeActivity
Note that the default is to require a manual press the mic & hold while
speaking. Tap the (A) to switch to automatic voice activity detection.
Note that you can bring that overlay up anywhere, even on the home screen,
although it will be mostly used to replace the keyboard when speaking.
14. Add the mic icon to the Heliboard toolbar
Access the mic shortcut
Open the keyboard and long-press the Comma (,) key.
This allows you to pin the mic for one-tap access
Drag the mic icon onto the toolbar as desired
15. Test.
a. From the homescreen, open up the default SMS/MMS app
b. Select a contact or group
c. Tap in the text box (HeliBoard should come up)
d. Type into the text field (if desired)
e. Then press the mic button in HeliBoard
f. This should bring up the Whisper overlay in (A) automatic mode
g. Start speaking (the progress bar should indicate activity)
h. When you stop speaking, two things should happen right away
i. There will be the transcribed text in the text box
ii. And the keyboard should have returned automatically
i. Voila!
16. Debug
Check active keyboard
adb shell settings get secure default_input_method
Expected output:
helium314.keyboard/.latin.LatinIME
Check active voice service
adb shell settings get secure voice_recognition_service
Expected output:
org.woheller69.whisper/com.whispertflite.WhisperRecognitionService
Verify whitelist status
adb shell dumpsys deviceidle whitelist | grep whisper
Expected output:
user,org.woheller69.whisper,10843
Check on the Whisper process
adb shell ps -ef | grep whisper
Expected output:
u0_a843 21962 902 1 00:06:23 ? 00:00:33 org.woheller69.whisper
Check microphone usage logs
adb shell appops query-op android:record_audio allow | grep whisper
Expected output:
org.woheller69.whisper
Verify the model file name and location
adb shell ls -l /storage/emulated/0/Android/data/org.woheller69.whisper/files/
Expected output (simplified)
whisper-tiny.en.tflite (The working model)
whisper.tflite (The decoy/setup flag)
filters_vocab_en.bin (The logic file)
Note WhisperIME automatically downloads .bin files the first time
a voice recognition attempt occurs.
Check the list of currently enabled keyboards
adb shell "ime list -s | grep -E 'helium|whisper'"
Expected output:
helium314.keyboard/.latin.LatinIME
org.woheller69.whisper/com.whispertflite.WhisperInputMethodService
Confirm Whisper is actually using the 40MB tiny model:
adb logcat -c
Tap the HeliBoard mic button to wake up whisper, and then run
adb shell "logcat -d -v tag WhisperEngineJava:D *:S"
Expected output:
Model is loaded.../storage/emulated/0/Android/data/org.woheller69.whisper/files/whisper-tiny.en.tflite
This confirms the phone is 100% independent of Google/Samsung voice servers.
--
On Usenet, wizened old men discuss topics of interest, where each adds
their own flavor of value so that the group, as a whole, benefits greatly.
Back to comp.mobile.android | Previous | Next — Next in thread | Find similar
Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-04-30 02:53 -0600
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Alan Peeling <Alan@invalid.co.uk> - 2026-04-30 12:15 +0100
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-04-30 05:39 -0600
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Alan Peeling <Alan@invalid.co.uk> - 2026-04-30 21:50 +0100
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-04-30 15:33 -0600
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-05-02 18:19 -0600
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-05-06 20:37 -0600
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Paul <nospam@needed.invalid> - 2026-05-08 02:31 -0400
Re: Tutorial: Windows/Android privacy de-googled STT optimized for speed Maria Sophia <mariasophia@comprehension.com> - 2026-05-08 01:09 -0600
csiph-web