JavaScript语音合成依赖Web Speech API的SpeechSynthesis接口,支持Chrome、Edge等主流浏览器,需检测window.speechSynthesis可用性、监听voiceschanged事件获取音色,设置utterance属性后调用speak()播放,注意Safari中文兼容性及移动端手势触发限制。

JavaScript 中实现语音合成(文字转语音)主要靠浏览器内置的 Web Speech API,特别是其中的 SpeechSynthesis 接口。它无需第三方库、不发请求、纯前端运行,兼容 Chrome、Edge、Safari(部分支持)、Firefox(需手动启用),是目前最轻量实用的方案。
检查并获取语音合成实例
不是所有浏览器都默认开启或完全支持,先安全检测:
- 用
window.speechSynthesis判断 API 是否可用 - 调用
window.speechSynthesis.getVoices()获取可用音色列表(注意:首次调用可能为空,需监听voiceschanged事件后再读取)
基础语音播放代码
三步搞定一句话朗读:
- 创建 utterance:
const utter = new SpeechSynthesisUtterance('你好,今天天气不错'); - 可选设置语速、音调、音量、语言和音色:
utter.rate = 1; utter.lang = 'zh-CN'; utter.voice = voices.find(v => v.name.includes('Tingting')); - 播放:
window.speechSynthesis.speak(utter);
处理音色与语言适配
中文推荐优先选系统自带的中文音色(如 macOS 的 'Tingting'、Windows 的 'Microsoft Yaoyao'、Chrome 的 'Google Zh-CN'),但不同系统返回的 voice.name 差异大:
立即学习“Java免费学习笔记(深入)”;
- 别硬写死 name,建议按
lang筛选:voices.filter(v => v.lang.startsWith('zh')) - 若没找到中文音色,fallback 到第一个可用 voice:
utter.voice = voices[0] || null - 可缓存
getVoices()结果,避免重复查询
控制与交互增强
实际使用中常需暂停、继续、取消、监听状态:
-
window.speechSynthesis.pause()/.resume()/.cancel() - 绑定事件监听进度:
utter.onend = () => console.log('说完啦');,utter.onerror = e => console.error('语音失败', e) - 长文本可分段合成,避免单次太长被截断
基本上就这些。不用引入 SDK,不走服务器,开箱即用——但得提醒一句:Safari 对中文支持较弱,部分机型可能只念拼音;移动端需用户手势触发(比如点击按钮后才能 speak),不能自动播放。











