让你的网页会说话:用 SpeechSynthesis 让文本变成声音的魔法

前言

你有没有想过,如果你的网页能说话,它会说些什么?是"欢迎光临,我是你最好的朋友!"还是"快来看看我的新功能!"无论如何,今天我们要聊的就是如何让你的网页拥有这种超能力------通过 SpeechSynthesis 接口,让文本瞬间变成声音,仿佛你的网页突然变成了一个有声有色的播音员。

代码实战

js 复制代码
if('speechSynthesis' in window){
       var voices = [];
       var synth = window.speechSynthesis;
       synth.onvoiceschanged = () => {
            voices = synth.getVoices();
        };
       const utterance = new SpeechSynthesisUtterance('测试文字');
        // const utterance = new SpeechSynthesisUtterance('测试文字');
        // utterance.text ='测试文字'
        // BCP 47标准的语言标签
        // 可设置的常见语言及解释:
        // "zh-CN" - 简体中文(中国大陆)
        // "en-US" - 美式英语 
        // "en-GB" - 英式英语 
        // "zh-HK" - 繁体中文(香港)
        // "zh-TW" - 繁体中文(台湾)
        // "fr-FR" - 法语(法国)
        // "de-DE" - 德语(德国)
        // "es-ES" - 西班牙语(西班牙)
        // "it-IT" - 意大利语(意大利)
        // "ja-JP" - 日语(日本)
        // "ko-KR" - 韩语(韩国)
        // "ru-RU" - 俄语(俄罗斯)
        // "pt-BR" - 葡萄牙语(巴西)
        utterance.lang = 'zh-CN';

        // 设置语音参数
        utterance.volume = 1; // 音量 (0.0 到 1.0)
        utterance.rate = 1;   // 语速 (0.1 到 10)
        utterance.pitch = 1;  // 音调 (0 到 2)
        // 重要!
        utterance.voice = voices.filter(item => item.lang === lang && item.localService)[0]

        synth.speak(utterance);
}

以上代码就是可运行的代码,记得要传给它的文字最好是与lang相同的文字,这样播报效果更好。查看MDN发现兼容性可以满足大部分人需求,但用于生产环境的话还需谨慎,毕竟是实验性功能。 MDN示例:mdn.github.io/dom-example...

问题

选择除中文外的其它语言播放没反应

如果你的需求是支持多语言,那大概率会遇到这个问题。首先可能疑惑是voice属性没设置,voice属性MDN的解释是获取和设置将用于说出话语的声音。那这个属性就显得尤为重要,我们通过监听onvoiceschanged事件得出本机支持的语音列表,打印语音列表(安装完需要语音之后的打印列表)重点关注localService属性

localService:指示语音是由本地语音合成器服务(true)还是远程语音合成器服务提供(false)

问题基本明确,是因为目前localService为true的只有中文选项,其它均需要远程语音合成。那么我们只需要提供支持本地语音合成选项即可。解决方法就是给本机安装你需要的语音

附录 A:支持的语言和语音

按照操作指引,选择你需要的语音选项并下载。下载后需要重启电脑才能生效。以上是windows电脑解决方法,其它系统可同样尝试解决。

Chrome浏览器偶现无声音

调用语音播放一般是由ws或接口接收到数据传入后播放,并不是用户主动触发,由此产生这个奇怪的问题。原因是自v71版用户必须手动点击播放按钮才能播放语音合成内容,用户不主动操作那么直接禁止音频的播放

被垃圾广告滥用后谷歌浏览器71将限制语音合成自动播放

解决办法就是可以创建一个隐藏的按钮或其它元素,如果不是主动触发就需调用按钮的点击事件来触发语音播放

相关推荐
华玥作者14 分钟前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_35 分钟前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠42 分钟前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang201509281 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC2 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务2 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整3 小时前
面试点(网络层面)
前端·网络
VT.馒头3 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy4 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07075 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js