Skip to content

Voice Input Basics

The core of BiBi Keyboard is high-quality speech recognition. It supports multiple ASR engines and recognition modes, so you can use voice input in any app.

How It Works

Voice input has three stages:

  1. Recording: the app records your voice. Depending on settings, it can auto-stop on silence or stop manually.
  2. Recognition: audio is sent to an ASR engine (cloud or local) and transcribed into text.
  3. Output: the transcript can optionally be refined by AI post-processing, then inserted into the current editor.

Supported ASR Providers

BiBi Keyboard supports 18 ASR providers, grouped into cloud and local:

Cloud ASR

ProviderStreamingDuration limit (non-streaming)Notes
Volcengine1 hourNew users often get free quota; supports bidirectional streaming
SiliconFlow20 minBuilt-in free ASR (SenseVoiceSmall / TeleSpeechASR); supports Qwen3-Omni transcription (own key)
ElevenLabs20 minHigh-accuracy English; supports both file and streaming
OpenAI20 minDefault gpt-4o-mini-transcribe; supports multiple channels and Realtime streaming
DashScope (Alibaba)5 minQwen-Audio-3.0 / Fun-ASR / Qwen3-ASR / Qwen3.5-Omni; streaming and non-streaming
Gemini (Google)4 hoursFile-based multimodal speech understanding
Soniox1 hourSupports multi-language prompts; both streaming and file modes
StepAudio20 minStepAudio 2.5 online ASR with Chinese/English and ITN
Zhipu (GLM)20 minGLM-ASR; supports context prompt parameters
OpenRouter20 minCalls compatible ASR / multimodal transcription models through OpenRouter
MiMo (Xiaomi)20 minMiMo v2.5 ASR / audio-understanding models with language selection and System Prompt
Cohere12 minCohere Transcribe file recognition with general and Arabic-focused models

Local ASR (Offline)

ProviderStreamingDuration limit (non-streaming)Notes
SenseVoicePseudo ¹5 minBased on sherpa-onnx; multilingual
FunASR Nano5 minOffline recognition with language selection, native ITN, and MLT Nano multilingual variant
Qwen3-ASR5 minLocal 0.6B / 1.7B models, strong Chinese recognition and numeric formatting
Parakeet5 minLocal English / European-language recognition
FireRedASR V2Pseudo ¹5 minReplaces the old TeleSpeech local engine
X-ASRUnlimited ²Local streaming recognition with a Chinese/English 480ms model and optional ITN

Notes

¹ Pseudo-streaming: shows partial results based on VAD segmentation, but it is not true real-time streaming.

² Streaming mode has no duration limit (continuous recognition).

The "Duration limit (non-streaming)" here is the app's single-segment recording cap used to control segmented recording behavior. It does not represent provider billing limits or total free quota. For example: Volcengine often provides ~20 hours of free quota for new users; SiliconFlow provides a built-in free ASR service with no total duration quota. For other providers, check their consoles for quota/billing.

For more details on supported models, recommended configs and updated quotas, see the Providers & Models Guide. For provider sign-up, configuration steps and local model downloads, see First Setup and ASR Providers.

Cloud vs Local

Advantages of cloud ASR

  • Higher accuracy: large cloud models often perform better
  • Multilingual: better for code-switching, dialects, and more languages
  • No maintenance: no model download; updates are handled by the provider

Advantages of local ASR

  • Fully offline: no network required; privacy-friendly
  • Lower latency: no network transfer
  • No data usage: good for limited networks
  • No API quota: no need to worry about API costs and limits

Streaming vs Non-streaming

Streaming recognition

How it works: upload audio while recording, and get partial results in real time.

Pros:

  • ✅ real-time feedback
  • ✅ no duration limit
  • ✅ lower latency

Supported engines:

  • Cloud: Volcengine, Soniox, DashScope, ElevenLabs, OpenAI Realtime
  • Local: X-ASR

Non-streaming recognition (file upload)

How it works: upload the whole audio file after recording stops.

Pros:

  • ✅ potentially higher quality (global analysis on full audio)
  • ✅ simpler and stable
  • ✅ supports more providers

Cons:

  • ⚠️ duration limit (see tables above)
  • ⚠️ recognition starts only after recording stops

For local non-streaming models, long audio is progressively processed in silence-based chunks after recording stops to reduce the load of a single inference pass and requires no extra setting.

Suggestions

  • For providers that support both modes, switch under Settings → Smart → Speech Recognition Settings → Speech Recognition Provider → [provider].
  • Streaming is great for long recordings and low-latency feedback.
  • File mode is great for short audio when accuracy matters more.

Segmented Recording

For non-streaming engines, if a recording exceeds the app's single-segment limit for that provider, BiBi Keyboard automatically performs segmented recording.

How it works

  1. Auto split: near the limit, the current segment is cut and a new segment starts
  2. Background upload: segments are uploaded/recognized in background while recording continues
  3. Seamless UX: UI stays in recording state without noticeable interruption
  4. Merge results: transcripts from segments are concatenated automatically

Backup ASR Engine (Parallel Primary/Backup)

If your primary ASR occasionally times out or fails, you can enable a backup ASR engine. BiBi Keyboard records only once, then decides whether to run the backup in parallel or use lazy local fallback based on the selected engines and settings. If primary returns a usable result in time, it uses primary; otherwise it falls back to the backup result.

How to enable

  1. Open Settings → Smart → Speech Recognition Settings
  2. Find "Backup speech recognition engine" and enable "Enable backup engine"
  3. Tap "Backup provider" and choose a provider different from your primary one
  4. Make sure the backup provider is also configured (API key / local model files, etc.)
  5. If your primary provider is a local or slower model, tune "backup timeout sensitivity" to switch to backup results earlier or later
  6. If the backup provider is a local model, choose "On demand" or "Keep resident" under "Local backup mode"

Local backup mode

ModeDescriptionBest for
On demandDefault. Loads the local backup model only when needed, then releases it after idle timeOccasional backup use, large local models, lower memory usage
Keep residentKeeps the local backup model ready so fallback can start fasterFrequent local backup use, enough device memory, less first-use waiting

Notes

Online backup engines may still trigger extra API requests/cost. Local backup engines may use more memory; choose "Keep resident" only when your device has enough RAM.

Switching IME After Input

Voice input is often used in chat apps, where you usually want to switch back to your favorite keyboard for quick edits. The related toggles live in Settings → Input → Input Settings → Input Behavior:

  • Switch to specified IME after input: once recognition (and optional AI post-processing) finishes and the preview text is settled, BiBi Keyboard switches to the IME chosen under Target IME; if none is set, it switches to the previously used IME. Empty results do not trigger a switch.
  • Switch to specified IME when hidden: when the BiBi Keyboard panel is hidden, it switches to the specified IME (or the previous IME if unset), handy for occasional voice input.

Local Punctuation (Optional)

FireRedASR V2 can add punctuation with an extra shared punctuation model. If the model is missing, recognition still works, but results may look more "spoken" (less punctuated).

  1. Open Settings → Smart → Speech Recognition Settings
  2. Go to the FireRedASR V2 section
  3. Under the punctuation model section, tap "Download model" (or import the ZIP)

Download source

When downloading local models, you can choose a download source and see latency. Picking a lower-latency source is usually more stable.

Recognition Enhancements (Optional)

  • Continuous recording while visible: Settings → Input Settings → Continuous recording while visible. BiBi Keyboard records locally while the keyboard or floating ball is visible so recognition can start faster after you press the mic, reducing recording latency; audio before the trigger is not uploaded.
  • Offline denoise for non-streaming ASR: Settings → Input Settings → Offline denoise for non-streaming ASR (applies to file-mode and local offline recognition)
  • Compress audio before upload: Settings → Input → Input Settings → Audio & External Link → Compress audio before upload. For supported online non-streaming providers, audio is encoded as M4A/AAC, OGG Opus, or WAV before upload to reduce request size and waiting time; custom compatible OpenAI transcription endpoints use WAV for better compatibility.
  • Remove trailing punctuation and emoji: Settings → Input Settings → Remove trailing punctuation and emoji. Set a word/character threshold so short results drop trailing punctuation/emoji while longer text keeps its ending.

Recognition History & Metrics

You can view history records in Settings → Smart → Recognition History. History sources include:

  • Keyboard input
  • Floating ball input
  • External input (for example, via external AIDL integration)

Each record shows basic info (provider, source, AI processing status, word count, audio duration). When available, it also shows these elapsed-time metrics:

  • Total elapsed time: end-to-end time from recording start to final text commit.
  • Recognition elapsed time: ASR-stage processing time.
  • AI post-processing elapsed time: shown when AI post-processing is enabled and attempted.

Newer records also provide a elapsed time timeline in the history details, breaking down elapsed time by stage (audio input, speech recognition, post-processing, AI polish, text delivery). Records created by earlier versions do not store stage timings.

Failed records and retries

Records that failed, timed out, or were canceled are also kept in history, with the failure reason shown (such as invalid credentials, microphone in use, network unavailable, or recognition timeout). Records that still have their recording audio can be re-recognized or re-polished.

In-keyboard recognition history

If you add the "Recognition history" extension button in the custom keyboard layout, you can open a history panel directly inside the keyboard:

  • Tap an entry to insert its text into the current input field
  • Swipe right on an entry: polish again (requires a configured LLM and usable text)
  • Swipe left on an entry: recognize again (requires the recording audio to be kept for that entry)

Recognition History also links to API Log and Recording Test, where you can inspect ASR / LLM call summaries, local model loading records, and current recording-test results.

Released under the Apache 2.0 License.