How to change the ASR engine
ENGINE in .env decides which ASR engine makes the final transcript; the default is qwen (Alibaba Cloud Bailian). For how the engines differ, see Architecture and data flow and ASR benchmark.
Switch engines
In
.env, setENGINEto one of the values in the table, and fill in the key it needs:ENGINENeeds qwenDASHSCOPE_API_KEYvolcVOLC_ASR_KEYstepfun-sseSTEPFUN_API_KEYstepfun,stepfun-fileSTEPFUN_API_KEY, plus your own upload bridge and file-mode ASR service:ASR_UPLOAD_BRIDGE_URL,ASR_UPLOAD_BRIDGE_TOKEN,ASR_SERVICE_URL,ASR_SERVICE_BASIC_AUTHlocalNo key Restart the server. With Docker, run
docker compose up -d: Compose recreates the container with the new.env.
When a key is missing, the server doesn't start, and the log says not set: <missing variable> (see .env.example). When ENGINE is misspelled, the log lists the valid values.
Whichever engine you use, you need the three LLM settings (LLM_BASE_URL, LLM_API_KEY, LLM_MODEL).
No ASR key at all: ENGINE=local
local runs the X-ASR zh-en model with sherpa-onnx in the server process. It outputs text only, and speakers come from the server's own voiceprints. On far-field audio, it does worse than qwen.
When the first audio arrives, the server downloads a model tarball of about 136 MB, so the first transcript takes about a minute. If the download is slow, set LOCAL_ASR_URL to the same tarball's address on a mirror; the server checks the file against its sha256.
Drafts and fallback
DRAFT_ENGINE: the engine that makes drafts while a page is open; empty means the same asENGINE. Withqwen-stream, the server streams the audio to Qwen while a page is open, so words show as they are said (needsDASHSCOPE_API_KEY).qwen-streamworks only asDRAFT_ENGINE.ENGINE_FALLBACK: the engine to use when the main engine fails on a window (402, 451, 5xx, a timeout); empty means retry later.
All the related settings are in Configuration.