v150 · web api · shipped
Web Speech API: On-Device Recognition Quality
A new quality property on SpeechRecognitionOptions that lets developers declare the semantic complexity of their use case — command, dictation, or conversation — so the browser can match the on-device speech model to the task and report whether a model of sufficient quality is available. Ships in Chrome 150 on desktop.
at a glance
| Shipped in | Chrome 150 (desktop) |
|---|---|
| Status | Enabled by default (Finch: OnDeviceWebSpeechQuality) |
| Depends on | On-device speech recognition (Chrome 139+); processLocally: true |
| ChromeStatus | 5136859632107520 — Web Speech API: On-Device Recognition Quality |
context: on-device speech in Chrome
Chrome 139 shipped on-device speech recognition for desktop via the processLocally: true option on SpeechRecognition. This ensures audio and transcripts never leave the user's device. On-device models range widely in capability — a small command model can recognise "play", "stop", "next" reliably but may fail on free-form dictation; a large model handles meetings and conversations but requires significant RAM and a capable CPU.
Before Chrome 150, there was no way for a site to express which tier of model it needs, or to learn whether a suitable model is installed. A site requesting transcription for meeting notes would silently receive lower-quality results if only a command model was available. The quality property solves this.
the quality property
syntax
const recognition = new SpeechRecognition();
recognition.processLocally = true; // required for quality to apply
recognition.quality = "command"; // "command" | "dictation" | "conversation"
quality values
| Value | Use case | Model requirements |
|---|---|---|
"command" | Short spoken commands — navigation, media controls, voice buttons | Lightest; fast, low latency |
"dictation" | Free-form text entry — composing messages, notes, form fields | Medium; handles full vocabulary |
"conversation" | Extended back-and-forth dialogue — meeting transcription, interviews | Heaviest; context-aware, most accurate |
When processLocally is false or unset, the quality property is ignored — quality selection for cloud models is handled by the service.
checking model availability
The static SpeechRecognition.available() method (shipping Chrome 150) accepts quality options so sites can confirm a suitable model is installed before starting recognition:
const availability = await SpeechRecognition.available({
lang: "en-US",
processLocally: true,
quality: "dictation",
});
if (availability === "no") {
// No local dictation-quality model. Offer to install or fall back.
await SpeechRecognition.install({ lang: "en-US", quality: "dictation" });
} else if (availability === "available") {
// Model ready — start recognition.
recognition.start();
}
The returned value is one of "readily", "available" (download needed), or "no" (device cannot support this quality).
example: falling back gracefully
const recognition = new SpeechRecognition();
recognition.lang = "en-US";
recognition.processLocally = true;
recognition.quality = "dictation";
const avail = await SpeechRecognition.available({
lang: "en-US",
processLocally: true,
quality: "dictation",
});
if (avail === "no") {
// Device cannot support dictation-quality locally.
// Fall back to cloud or command-quality model.
recognition.processLocally = false;
recognition.quality = "command";
}
recognition.onresult = (e) => {
textarea.value += e.results[0][0].transcript;
};
recognition.start();
browser support
| Chrome (desktop) | 150 (enabled by default) |
|---|---|
| Chrome (Android) | Not yet |
| Firefox | No signal |
| Safari | No signal |