Voice input means dictating messages straight into the chat. The microphone button appears on the input toolbar when speech recognition is enabled in settings. Click it, say your message — the text lands in the input at the cursor position, and you can send it like any other message. Recognition supports several engines: from a free one built right into the browser to local Whisper on your server and cloud APIs (an API is simply the standard way programs talk to an online service).
Recognition engines
The engine is chosen with the speechRecognitionProvider setting. Eight engines are available, grouped into three families:
Browser — runs entirely in the browser on the Web Speech API; local server — Whisper on your server, offline; cloud — five presets with an API key plus your own OpenAI-compatible service.
| Engine | Where it runs | Notes |
| Browser (Web Speech API) | in the browser | free; Chrome, Edge, Safari; live interim text; audio goes to the browser vendor’s cloud service, never to the Agent server; unsupported in Firefox |
| Local Whisper | on the Agent server | offline and free; the model downloads on first use; the only server engine that works without internet |
| OpenAI | cloud | model gpt-4o-mini-transcribe; requires an API key |
| Groq | cloud | model whisper-large-v3-turbo; requires an API key |
| OpenRouter | cloud | model openai/whisper-large-v3-turbo; requires an API key |
| Deepgram | cloud | model nova-3; requires an API key |
| ElevenLabs | cloud | model scribe_v1; requires an API key |
| Custom (OpenAI-compatible) | your server | any /audio/transcriptions address: whisper.cpp, LocalAI, vLLM, and others; your own endpoint, model, and key |
Which engine to choose
- Local Whisper — when you need to work without internet or want maximum privacy: audio never leaves your server;
- Browser — a fast free option for Chrome, Edge, or Safari when in-browser recognition is enough;
- Cloud presets — when you want high accuracy without loading your server; you pay the provider’s rates;
- Custom — if you already run your own OpenAI-compatible recognition service (for example, whisper.cpp or vLLM).
How it works
The microphone button sits on the message input’s control bar, at the left end, just below the text field. While you speak, the button pulses; when a piece of audio goes out for recognition, a spinner appears on top of it. The finished text is inserted into the input at the cursor position, so you can keep dictating from any point of the message.
Continuous dictation. You don’t have to stop recording after each phrase. Cloud engines upload the accumulated audio every few seconds and insert each recognized piece as it comes back — there is no live preview for them, text lands in whole phrases. Local Whisper streams audio to the server live and appends words about a second after you say them, with the same interim preview the browser engine shows: a gray line above the input field.
How cloud requests travel. For cloud engines the Agent server acts as a middleman: it receives the audio from the browser and sends it to the provider’s API. The audio passes through exactly as recorded (webm/opus), with no conversion. A request to the provider times out after 30 seconds.
Settings
All speech settings live together in the “Speech Recognition” card (Settings → Tools). There are eight setting keys:
| Key | Default | What it does |
enableSpeechRecognition | enabled | shows the microphone button on the input toolbar |
speechRecognitionProvider | browser | the selected recognition engine (8 options) |
whisperModel | base | the Local Whisper model size |
language | follows the locale (ru/en) | recognition language for engines that support one |
autoDetectLanguage | enabled | automatic language detection instead of a fixed language |
speechApiEndpoint | empty | the cloud engine’s service address; filled in when you pick a preset |
speechApiKey | empty | the cloud provider’s API key |
speechApiModel | empty | the cloud engine’s model; filled in when you pick a preset |
Cloud presets. When you pick a preset (OpenAI, Groq, OpenRouter, Deepgram, ElevenLabs), the speechApiEndpoint and speechApiModel fields are filled with default values automatically — you can adjust them afterwards. The key field stays empty: you enter the key yourself. For the Custom engine, all three fields are filled in manually.
Language and auto-detection. The language settings are honored by the engines that support them: Local Whisper and OpenAI-compatible engines accept a language code (ru, en, and so on) or detect the language automatically; Deepgram and ElevenLabs use their own equivalents. The browser engine takes a BCP-47 tag (for example, en-US) and does not support auto-detection — the switch is hidden for it.
Testing. The settings card includes a test: the button records three seconds of audio and runs it through the selected engine, showing the transcript or the engine’s error. For Local Whisper, the same card also offers the model status check (whether it is downloaded and how large it is), download, and re-download.
Local Whisper models
The Whisper model downloads automatically the first time you use the engine — the microphone button appears once the model is ready (if the download fails, the error is logged to the console only). Available sizes run from tiny (~39 MB) to large (~1.55 GB), plus turbo (~809 MB); the default is base (~74 MB). The bigger the model, the higher the accuracy, but the longer the download and the more resources recognition takes.
The first start of Local Whisper can take a few minutes: the engine needs to prepare an audio converter and load the model. While that happens, the microphone button shows a short hint — “installing ffmpeg” or “loading model”. This is normal, and the wait does not mean the request is stuck: once the preparation finishes, recognition works as usual.
Errors and troubleshooting
| Situation | What happens |
| Microphone access denied | an explicit toast explains how to allow access; recording does not start |
| No microphone or a capture error | a generic “check your device” message; the settings test reports “no microphone found” |
| API key not set | recording does not start; a toast points you to the key in settings |
| Invalid or rejected cloud key (401/403) | a dedicated “invalid API key” toast |
| Cloud service did not answer within 30 seconds | a dedicated timeout toast |
| Silence with Local Whisper | a “speak louder” warning |
| Browser engine went silent (a pause in speech) | recognition restarts automatically, dictation continues |
| Firefox with the Browser engine | the engine is marked unsupported in settings; you are advised to switch engines |
| No network with the browser engine | an “internet required” toast |
| Recognizer unsupported or blocked | a toast advising a different engine in settings |
Security and privacy
Requests to cloud providers are made by the Agent server — it attaches the API key. The browser never talks to the provider directly: audio travels from your browser to the Agent server and on to the provider’s API. With the Browser engine, audio is processed by the browser vendor’s own cloud service (Google Chrome, Microsoft Edge, Safari) and never reaches the Agent server. With Local Whisper, audio never leaves your server at all — the most private option.