浏览器系统语音列表为何不同?
了解 speechSynthesis 语音列表为何不同、MaskPilot 如何处理当前平台的常见语音别名,以及如何在重启后验证账号环境。
更新于 2026年10月1日网站无需申请麦克风权限,也能读取浏览器的文字转语音列表。如果检测页显示的语音名称、语言或默认项不同于物理电脑,应先区分浏览器可见的语音列表、录音和声音播放,再等待语音列表完成加载后比较同一个账号。
理解网站能够读取的内容
Web Speech API 提供 speechSynthesis.getVoices()。返回的每个 SpeechSynthesisVoice 可以包含名称、语言标签、语音 URI、默认标记,以及语音服务是否位于本机。这些字段可能反映浏览器平台及其可用的语音资源。
页面脚本第一次调用时,列表不一定已经就绪。浏览器提供 voiceschanged 事件,让页面在可用语音发生变化时刷新结果。检测页如果过早读取一次,可能先显示空列表,随后在账号没有任何编辑的情况下显示完整结果。
应记录完整列表、页面地址,以及页面是否等待了 voiceschanged。不要把一次过早出现的空结果或某个页面的“异常”标签直接当作账号已经变化的证据。
正确理解 MaskPilot 的系统语音设置
MaskPilot 在账号的更多指纹设置中提供“系统语音列表”。该选项默认开启,使用与当前浏览器平台相符的常见语音别名,并在浏览器进程启动时载入。
这项设置控制网站可见的文字转语音表面,不会授予麦克风权限、录制声音,也不会替代独立的 Web Audio 音频指纹设置。它本身也不会修改账号的请求语言列表。
除非目标网站流程确实需要不同的语音列表行为,否则应保留默认值。不要同时修改语音选项、浏览器版本、区域语言、请求语言和运行环境,否则无法判断差异来自哪一个变量。
完整重启后验证列表
- 记录账号名称、实际运行的浏览器版本、页面地址、检测时间和完整语音条目。
- 刷新同一个 HTTPS 页面,等待语音列表结果完成更新。
- 完全关闭账号,等待状态恢复为可启动。
- 编辑同一个账号,展开更多指纹设置,找到“系统语音列表”。
- 确实需要对比时,只修改这一项;保持浏览器版本、区域语言、请求语言、代理和其他指纹设置不变。
- 保存并重新启动同一个账号,在同一页面连续检测两次。
账号设置只在浏览器进程启动时应用。如果完整重启后页面仍报告以前的结果,请先按修改账号设置后没有生效的排查步骤处理,再决定是否修改其他字段。
区分语音、语言和音频检测
语音条目包含语言标签,但不会决定页面语言、请求头或时区。网站显示错误语言时,应使用网站语言排查清单核对区域语言和请求语言列表。
语音列表也不同于 Web Audio 计算。getVoices() 枚举文字转语音选项;Web Audio 检测则渲染音频处理图并汇总数值输出。如果页面报告的是音频哈希而不是语音清单,请改用 Web Audio 音频指纹排查清单。
这两类检测都不需要麦克风权限。如果问题涉及摄像头、麦克风或扬声器枚举,请按媒体设备列表排查清单处理。
判断何时需要继续调查
同一个账号在相同页面返回一致的完整语音列表,并且差异只出现在另一个浏览器版本、另一个平台或物理电脑的系统面板中时,通常无需修正。
如果没有编辑账号,完整列表却在多次重启之间变化;列表与账号当前浏览器平台明显矛盾;或者真实依赖文字转语音的网站无法选择可用语音,则需要继续调查。保留原始结果,并坚持每次只改变一项设置。
关于完整的配置生命周期,请参阅配置稳定的浏览器指纹。MDN 介绍了 SpeechSynthesis.getVoices() 返回的字段,并说明可用语音列表改变时会触发 voiceschanged 事件。