speechsynthesis.rate 是 speechsynthesisutterance 实例的无量纲浮点数属性,默认值为 1.0,决定语速快慢,必须在 utterance 创建后、speak() 调用前设置,且每次 speak 前需显式赋值,不支持运行中修改或全局配置。

speechSynthesis.rate 是什么值,直接决定语速快慢
它不是百分比,也不是 0–100 的整数,而是一个无量纲的浮点数,默认是 1.0。设成 0.5 就是一半语速,2.0 就是两倍速——但实际有效范围受浏览器和语音引擎限制,超出会自动截断。
常见错误是传字符串比如 "1.5" 或布尔值,这会让 rate 重置为默认 1.0,界面没报错但语速不变。
- 必须传数字类型:用
parseFloat()或一元加号+转换用户输入 - Chrome 最高支持到
2.0,Safari 通常卡在1.8左右,Firefox 更保守,1.5以上可能被静默降级 - 某些中文语音(如 macOS 的 Ting-Ting)对大于
1.3的 rate 响应迟钝,听起来像卡顿,不是代码问题
设置 rate 必须在 utterance 创建后、speak() 调用前
rate 是 SpeechSynthesisUtterance 实例的属性,不是全局配置。改 window.speechSynthesis.rate 完全无效——这个属性根本不存在。
典型误操作:先调 speechSynthesis.speak(utterance),再设 utterance.rate = 0.7,结果毫无作用。
立即学习“前端免费学习笔记(深入)”;
- 正确顺序:
const utterance = new SpeechSynthesisUtterance("你好"); utterance.rate = 0.8; speechSynthesis.speak(utterance); - 如果复用 utterance 对象,每次 speak 前都要重新设 rate,它不会保留上次值
- 动态调整正在播放的语音?不行。rate 不支持运行中修改,必须 cancel() 后新建 utterance
rate 和 pitch、volume 搭配时要注意优先级冲突
三者都属于 utterance 的可写属性,但浏览器内部调度时,pitch 和 volume 改变可能触发语音重缓冲,间接让 rate 表现不稳定——尤其在低端 Android 设备上。
现象:设了 rate = 0.6、pitch = 1.2,结果语速忽快忽慢,或开头正常、后半段自动加速。
- 优先保证 rate 稳定:单独设 rate,其他参数先用默认值验证是否生效
- pitch 超过
2.0或低于0.5时,部分引擎会强制拉高 rate 来“补偿”音高失真,这是底层行为,无法拦截 - volume 小于
0.2时,某些系统语音(如 Windows 的 David)会悄悄提升 rate 以维持可听度,建议 volume 不低于0.3
移动端 Safari 的 rate 行为最不可靠
iOS/iPadOS 的 WebKit 对 speechSynthesis 支持有限,rate 参数常被忽略,尤其在页面非活跃状态(切后台、锁屏)下恢复播放时,rate 会退回到 1.0,且不触发任何事件通知。
没有 error,没有 warning,控制台也看不出异常,就是语速变了——这是 WebKit 已知限制,不是你漏写了什么。
- 绕过方法:每次 speak 前检查并重设 rate,哪怕刚设过也要再赋一次值
- 不要依赖 rate 变化做 UI 同步(比如拖动滑块实时更新语速显示),iOS 上视觉反馈和实际发音常不同步
- 真要强控语速,得用 Web Audio + 预合成语音片段,但那就完全脱离
speechSynthesis体系了











