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:
- Recording: the app records your voice. Depending on settings, it can auto-stop on silence or stop manually.
- Recognition: audio is sent to an ASR engine (cloud or local) and transcribed into text.
- 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
| Provider | Streaming | Duration limit (non-streaming) | Notes |
|---|---|---|---|
| Volcengine | ✅ | 1 hour | New users often get free quota; supports bidirectional streaming |
| SiliconFlow | ❌ | 20 min | Built-in free ASR (SenseVoiceSmall / TeleSpeechASR); supports Qwen3-Omni transcription (own key) |
| ElevenLabs | ✅ | 20 min | High-accuracy English; supports both file and streaming |
| OpenAI | ✅ | 20 min | Default gpt-4o-mini-transcribe; supports multiple channels and Realtime streaming |
| DashScope (Alibaba) | ✅ | 5 min | Qwen-Audio-3.0 / Fun-ASR / Qwen3-ASR / Qwen3.5-Omni; streaming and non-streaming |
| Gemini (Google) | ❌ | 4 hours | File-based multimodal speech understanding |
| Soniox | ✅ | 1 hour | Supports multi-language prompts; both streaming and file modes |
| StepAudio | ❌ | 20 min | StepAudio 2.5 online ASR with Chinese/English and ITN |
| Zhipu (GLM) | ❌ | 20 min | GLM-ASR; supports context prompt parameters |
| OpenRouter | ❌ | 20 min | Calls compatible ASR / multimodal transcription models through OpenRouter |
| MiMo (Xiaomi) | ❌ | 20 min | MiMo v2.5 ASR / audio-understanding models with language selection and System Prompt |
| Cohere | ❌ | 12 min | Cohere Transcribe file recognition with general and Arabic-focused models |
Local ASR (Offline)
| Provider | Streaming | Duration limit (non-streaming) | Notes |
|---|---|---|---|
| SenseVoice | Pseudo ¹ | 5 min | Based on sherpa-onnx; multilingual |
| FunASR Nano | ❌ | 5 min | Offline recognition with language selection, native ITN, and MLT Nano multilingual variant |
| Qwen3-ASR | ❌ | 5 min | Local 0.6B / 1.7B models, strong Chinese recognition and numeric formatting |
| Parakeet | ❌ | 5 min | Local English / European-language recognition |
| FireRedASR V2 | Pseudo ¹ | 5 min | Replaces the old TeleSpeech local engine |
| X-ASR | ✅ | Unlimited ² | 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
- Auto split: near the limit, the current segment is cut and a new segment starts
- Background upload: segments are uploaded/recognized in background while recording continues
- Seamless UX: UI stays in recording state without noticeable interruption
- 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
- Open
Settings → Smart → Speech Recognition Settings - Find "Backup speech recognition engine" and enable "Enable backup engine"
- Tap "Backup provider" and choose a provider different from your primary one
- Make sure the backup provider is also configured (API key / local model files, etc.)
- If your primary provider is a local or slower model, tune "backup timeout sensitivity" to switch to backup results earlier or later
- If the backup provider is a local model, choose "On demand" or "Keep resident" under "Local backup mode"
Local backup mode
| Mode | Description | Best for |
|---|---|---|
| On demand | Default. Loads the local backup model only when needed, then releases it after idle time | Occasional backup use, large local models, lower memory usage |
| Keep resident | Keeps the local backup model ready so fallback can start faster | Frequent 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).
- Open
Settings → Smart → Speech Recognition Settings - Go to the
FireRedASR V2section - 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.
Related
- Floating Ball - voice input anywhere
- AI Post-processing - refine transcripts with LLM
- Recording Modes - press-and-hold vs tap-to-toggle
- Auto-stop on Silence - stop recording automatically