JavaScript纯前端实现语音播报和朗读功能
本文介绍如何利用JavaScript原生API实现纯前端语音播报功能。通过调用window.speechSynthesis和SpeechSynthesisUtterance对象,开发者可以控制文本朗读、语速及音量。文章提供了完整的函数示例及常用方法列表,并重点说明了在部分浏览器中需预先调用getVoices()以解决语音包获取为空数组的问题,确保语音功能稳定运行。
核心API介绍
要实现语音播报功能,需要依赖两个原生的JavaScript API。
这两个API分别是window.speechSynthesis和SpeechSynthesisUtterance。
以下是具体的项目代码示例。
完整代码实现
// 执行函数
initVoice({
text: '项目介绍',
vol: 1,
rate: 1
})
// 函数
export function initVoice(config) {
window.speechSynthesis.cancel();//播报前建议调用取消的函数,如有正在播报的话音,播报会任务被塞进入队列,只有等上一个语音结束才会执行下一个语音
//获取语音包
let listArr = window.speechSynthesis.getVoices();
listArr = listArr.filter(item => item.lang.indexOf('zh-') > -1);
if (listArr.length == 0) {
console.error('没有可用的中文语音!');
}
//实例化播报内容
let instance = new SpeechSynthesisUtterance();
instance.text = config.text || '轻轻敲醒沉睡的心灵,慢慢张开你的眼睛,看看忙碌的世界,是否依然孤独的转个不停!'; // 文字内容
instance.lang = config.lang || "zh-CN"; // 使用的语言:中文
instance.volume = config.vol || 1; // 声音音量:1
instance.rate = config.rate || 1; // 语速:1
instance.pitch = 1; // 音高:1
window.speechSynthesis.speak(instance); // 播放
instance.addEventListener("end", () => {});// 监听播报完成状态,播完可以做些其它处理
}将提供的函数代码复制到项目中,直接调用该函数即可实现语音播报功能。
下面列举了一些常用的执行方法。
常用方法列表
//获取可用的语音包,如果返回数组是空,则没有可用的语音包。不同浏览器的语音包数量是不一样的。
window.speechSynthesis.getVoices();
//instance是SpeechSynthesisUtterance的实例,绑定了语音包。将话语添加到话语队列中;当任何其他话语在它被说出之前排队时,它将被说出。
window.speechSynthesis.speak(instance);
// 取消语音
window.speechSynthesis.cancel();
//暂停语音
// window.speechSynthesis.pause();
//恢复语音
window.SpeechSynthesis.resume();
浏览器兼容性注意事项
需要注意:在某些浏览器中,必须先提前调用window.speechSynthesis.getVoices();方法,随后再异步执行上述的完整语音播报流程,才能正常播报语音。
这是因为第一次调用window.speechSynthesis.getVoices();时,获取到的数据通常是空数组。
只有当第二次异步调用window.speechSynthesis.getVoices();时,才会返回包含可用语音的非空数组。

至此,关于JavaScript纯前端实现语音播报和朗读功能的介绍已结束。如需了解更多相关JavaScript语音播报与朗读内容,建议搜索本站历史文章或继续浏览下方的相关文章,希望大家今后多多支持本站!
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
