Skip to main content
General

Voice input — choosing the language you speak

The language you read in is not always the language you speak in

Every microphone on the site — the homepage capture box, the Blink voice note, the bug reporter, OrbitPilot's mic, and the dictation buttons in the admin — uses one shared setting for the language it listens in. It starts as your chosen content language, so most people never need to think about it.

The one-tap switch

When your content language is not English, a small language chip (for example FA or EN) appears next to each microphone button. Tap it to switch what the microphone listens for — say, reading the site in Farsi while dictating a note in English. The choice is remembered on your device and applies to every microphone at once. When your content language is English there is nothing to switch, so no chip is shown.

Why this exists

Before this, each microphone guessed: most followed the site's content language, one was fixed to English. Switching the site to Farsi silently pointed the microphones at Farsi — so English speech stalled — while the fixed-English recorder lost its live transcript the moment it heard Farsi. Speaking now has its own remembered choice, and a silence or a hiccup no longer stops the live transcript: the recorder simply keeps listening.

For developers

static/js/of-voice-lang.js is the single source (window.OFVoiceLang.get(), remembered in localStorage["of-voice-lang"], default = content language). Every recorder reads it at the moment recording starts and falls back to the old content-language rule if the helper is absent. The switch chip is rendered by OFVoiceLang.attachChip(anchor) and renders nothing when there is no real choice. Parity is enforced by adminapp/test_voice_parity.py: every recorder must consult OFVoiceLang and must survive a transient no-speech error without killing its live transcript.

🪐 OrbitPilot