• PSA: Keyboard STT is shockingly complex on Android (if you ask me)

    From Maria Sophia@[email protected] to comp.mobile.android on Sat Apr 11 15:50:01 2026
    From Newsgroup: comp.mobile.android


    Even I will admit I don't understand the astoundingly complex and confusing setup on Samsung phones for the triangle of speed, accuracy & privacy for
    voice to text input.

    Since I log into nothing on Android, when I use the dedicated Copilot app, their crippleware mic button goes online whereas I use Whisper (slow but accurate and private) or Sayboard (fast and private but not accurate) and
    when I need to convert huge audio input to text, I use Transcribo (which is
    not limited to the length restrictions of the others listed above), etc.

    Those offline STT transcription engines are overkill for the constant
    texting that we do in PulseSMS (last known good klinker bros version) or in WhatsApp where in those cases, I generally bring up the Openboard or
    Heliboard keyboard whose mic button will bring up a fast STT engine.

    I have other keyboards installed...
    Simple Keyboard
    HeliBoard
    FlorisBoard
    Whisper+ Voice Input
    Samsung Keyboard
    SayBoard
    AnySoftKeyboard
    Transcribo
    Gboard (requires net access for some features so I don't use it)

    But HeliBoard 1.3 is my daily drive since, well, since a long time.
    The HeliBoard mic button brings up my STT engine and it works well.

    But what happened yesterday is I set scrcpy on Windows to use the physical keyboard (which Android automatically handles, saving a step when using the Windows keyboard to type on the Android phone over the USB or Wi-Fi LAN).
    scrcpy -s 192.168.0.10 -K
    Where adding the "-K" option apparently impersonates the Android keyboard.
    The -K flag in scrcpy stands for UHID (User HID), which is wonderful.
    But I had to change one simple setting in Android, which blew things up!
    Settings > General management > Physical keyboard >
    Show on-screen keyboard = scrcpy

    Now when I click on "scrcpy", a "Physical keyboard" activity pops up with
    HeliBoard -
    OpenBoard - English (US)
    Samsung Keyboard - English (US)
    Show on-screen keyboard = off

    While that works PERFECTLY to skip a step of bringing the Android keyboard
    up when mirroring on Windows, it screwed up my keyboard setup on Android.

    I broke Android's Input Method Manager (IMM) by enabling scrcpy's -K
    physical keyboard impersonation while disabling the on-screen keyboard.

    I didn't notice the keyboard setup was screwed up on Android for a whole
    day because I only typed (either on the soft keyboard on the phone or using
    the hard keyboard on the Windows computer when mirroring over scrcpy).

    But today, I tried to use the voice mic, which I've been using for years,
    in the soft keyboard and up popped Transcribo for the first time. Huh?

    Without scrcpy running, the 'physical keyboard' defaulted to off.
    Settings > General management > Physical keyboard >
    Show on-screen keyboard = off

    The reason HeliBoard looks different in the scrcpy list compared to
    OpenBoard and Samsung is that it doesn't have a "Physical Layout" assigned. When a physical keyboard is active, Android stops looking at the virtual microphone button and starts looking for a hardware "Voice Search" key.
    Since HeliBoard didn't have a layout assigned, the system defaulted to Transcribo as the "helper" for that physical device .

    When I tap on Heliboard I only get language & layouts.
    One of which is "English (US), Qwerty style", which I selected.

    But I can longpress on the "English (US), Qwerty style" which changed the
    list above to have that under the "HeliBoard -" entry in Physical keyboard.

    Now when I click on "scrcpy", a "Physical keyboard" activity pops up with
    HeliBoard -
    English (US), Qwerty style
    OpenBoard - English (US)
    Samsung Keyboard - English (US)
    English (US), Qwerty style
    Show on-screen keyboard = off

    By long-pressing that layout and seeing it populate the "HeliBoard -"
    entry, I apparently manually re-linked the "Driver" to the "Hardware".

    More specifically, in Android 13, when I use scrcpy -K, the system treats
    the input as a "Hardware Keyboard" event. Because HeliBoard was originally listed with a blank dash (-), the system didn't know how to handle specific function calls (like a microphone trigger) from that "hardware" device. It apparently panicked and grabbed Transcribo because Transcribo likely has a "Hardware Voice Assistant" flag enabled.

    By assigning English (US) to HeliBoard in that physical menu, I've now told Android: "HeliBoard owns this USB connection now".

    Settings > General Management > Keyboard list and default
    Default keyboard = HeliBoard
    Longpressing on HeliBoard brings up
    Choose input method
    (_)AnySoftKeyboard
    (_)FlorisBoard
    (o)HeliBoard
    (_)English (US) OpenBoard
    (_)Samsung Keyboard (settings)
    (_)Sayboard
    On-screen keyboard = off
    Show Keyboard button = on

    The catch: When Android disables the visual keyboard, it also "suspends"
    the custom logic for the active keyboard (HeliBoard). With HeliBoard
    suspended, the system looks for the next available "Voice Service" to
    handle any stray voice commands and somehow Transcribo became active.

    The instant I used -K in scrcpy, Android changed its "Input State."
    If Transcribo was the most recently updated "Voice Service" on my phone, Android 13 grabbed it as the default for "Hardware Voice Input".

    By manually assigning HeliBoard a layout and by disabling Transcribo, I
    thought I had finally closed that loophole. But wait. There's more.

    When I unplug usb (disconnecting scrcpy) and go to pulsesms and then tap to create a text, the heliboard comes up with the mic button but when I press
    the mic button, now sayboard comes up so I press the little tiny keyboard
    on the bottom bar and select HeliBoard but STILL when I click the mic in heliboard, sayboard comes up. Worse, Sayboard is now crashing and when I
    grant the mic permission, it says the vosk models are no longer at

    /storage/emulated/0/Android/data/com.elishazaria.sayboard/files/Models/en-US/vosk-model-small-en-us-0.15

    Sayboard is crashing because it's stuck in a loop.
    I went to Settings > Apps > Sayboard & tapped Force stop.
    I tapped Storage > Clear Cache
    And Permissions > Microphone > Set to "Don't allow"
    which, paradoxically, prevents the system from being able to "launch" it
    when I tap the mic in HeliBoard.

    Also Settings > Apps > Choose default apps digital assistant is none.
    Oddly, in Settings > General Management > Keyboard list and default
    there is no Google Voice Typing (or Samsung Voice Input) but there is
    Samsung Keyboard.

    Because I am using HeliBoard v1.3, which is old, the keyboard has no
    internal voice logic. It relies entirely on a "System Intent".

    Since I disabled Transcribo and have no Google account, Sayboard is the
    only app left on my phone that can handle that, but the crash implies Sayboard's file path was likely messed up by the scrcpy physical keyboard session, and now it's trying to launch but can't find the VOSK model.

    I'm gonna punt and download the latest HeliBoard version 3.9 which
    reputedly solves the "jumping window" problem because the speech-to-text
    engine is inside the keyboard so a separate engine is no longer needed.

    This is long already, so I'll update it, but my point is that the speech to text with privacy on Android is not as simple as it should have been.
    --- Synchronet 3.21f-Linux NewsLink 1.2