Why Does the System Voice List Differ?
Learn why speechSynthesis voice lists can differ, how MaskPilot handles common platform voice aliases, and how to verify a profile after restart.
Updated Oct 1, 2026A website can read the browser’s text-to-speech voice list without requesting microphone permission. If a diagnostic page shows different voice names, languages, or defaults than the physical computer, first separate the browser-visible list from audio recording and playback. Then compare the same profile only after the voice list has finished loading.
Understand what the website can read
The Web Speech API exposes speechSynthesis.getVoices(). Each returned SpeechSynthesisVoice can include a name, language tag, voice URI, default marker, and whether the service is local. Those values can reflect the browser platform and the voice resources available to it.
The list is not guaranteed to be ready on the first page script call. Browsers expose a voiceschanged event so a page can refresh its result when the available voices change. A diagnostic that reads once, too early, may display an empty list and later show populated results without any profile edit.
Record the complete list, the page address, and whether the page waited for voiceschanged. Do not treat one early empty result or one page’s “mismatch” label as proof that the profile changed.
Read MaskPilot’s system voice setting correctly
MaskPilot provides System voice list under the profile’s extended fingerprint settings. It is enabled by default and uses common voice aliases for the current browser platform. The setting is loaded when the browser process starts.
This option controls the browser-visible speech voice surface. It does not grant microphone permission, record sound, or replace the separate Web Audio fingerprint setting. It also does not change the profile’s requested language list by itself.
Keep the default unless the intended website workflow has a verified requirement for a different voice-list behavior. Changing the voice option, browser version, locale, requested languages, and operating environment together makes the cause of a difference impossible to isolate.
Verify the list after a full restart
- Record the profile name, running browser version, webpage address, test time, and complete voice entries.
- Reload the same HTTPS page and wait for its voice-list result to finish updating.
- Fully close the profile and wait until its status becomes available.
- Edit the same profile, open the extended fingerprint settings, and locate System voice list.
- If a comparison is necessary, change only this option. Leave the browser version, locale, requested languages, proxy, and other fingerprint settings unchanged.
- Save, relaunch the same profile, and repeat the test twice on the same page.
Profile settings are applied at process startup. If the page still reports the earlier result after a complete relaunch, use why profile settings did not apply before changing another field.
Separate voices from language and audio checks
A speech voice entry contains a language tag, but it does not decide the browser’s page language, request headers, or time zone. If a website opens in the wrong language, compare the locale and requested-language list with the website language checklist.
The voice list is also different from a Web Audio calculation. getVoices() enumerates speech-synthesis choices; a Web Audio test renders an audio-processing graph and summarizes its numeric output. Use the Web Audio fingerprint checklist when the reported value is an audio hash rather than a list of speech voices.
Neither check requires microphone permission. If the problem involves camera, microphone, or speaker enumeration, follow the media device list checklist instead.
Know when to investigate further
No correction is normally needed when the same profile returns the same completed voice list on the same page and the only difference is against another browser version, another platform, or the physical computer’s control panel.
Investigate when the completed list changes between full restarts without a profile edit, when the list contradicts the profile’s current browser platform, or when a site that genuinely depends on speech synthesis cannot select a usable voice. Preserve the original result and change one setting at a time.
For the wider configuration lifecycle, see configure a stable browser fingerprint. MDN documents the fields returned by SpeechSynthesis.getVoices() and explains that the voiceschanged event fires when the available voice list changes.