JS中的语音合成——Speech Synthesis API

JS中的语音合成——Speech Synthesis API

简介

HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthesis)”, 这两个名词实际上指的分别是“语音转文字”,和“文字变语音”。

本文介绍的是语音合成(Speech Synthesis),语音识别(Speech Recognition)请移步另一篇

想要浏览器开口说话,只需要:

let speechInstance = new SpeechSynthesisUtterance('大家好,我是渣渣辉。');
speechSynthesis.speak(speechInstance);

就是这么简单,不妨copy进浏览器试一下?

SpeechSynthesisUtterance主要用来构建语音合成实例,speechSynthesis大概用来触发浏览器语音模块,让浏览器把内容读出来。

SpeechSynthesisUtterance实例有以下属性,可以通过设置一下属性调整发音。

  • text – 要合成的文字内容,字符串。
  • lang – 使用的语言,字符串, 例如:"zh-cn"
  • voiceURI – 指定希望使用的声音和服务,字符串。
  • volume – 声音的音量,区间范围是0到1,默认是1。
  • rate – 语速,数值,默认值是1,范围是0.1到10,表示语速的倍数,例如2表示正常语速的两倍。
  • pitch – 表示说话的音高,数值,范围从0(最小)到2(最大)。默认值为1。

还有一下方法:

  • onstart – 语音合成开始时候的回调。
  • onpause – 语音合成暂停时候的回调。
  • onresume – 语音合成重新开始时候的回调。
  • onend – 语音合成结束时候的回调。

speechSynthesis对象有以下方法:

  • speak() – 只能接收SpeechSynthesisUtterance作为唯一的参数,作用是读合成的话语。
  • stop() – 立即终止合成过程。
  • pause() – 暂停合成过程。
  • resume() – 重新开始合成过程。
  • getVoices() – 此方法不接受任何参数,用来返回浏览器支持的语音包列表,是个数组。

speechSynthesis.getVoices()返回因每个浏览器不同及版本的不同返回不太一样,大致是这样:

注意

语言包获取不稳定,有时候返回为空,可以用定时器多试几次。

主要代码

//vue 部分代码
methods: {
    onChange (e) {
        let chosenItem = this.voiceData.filter(item => {
            return e == item.lang;
        });
        this.queryParams.voiceURI = chosenItem[0].voiceURI;
    },

    onSpeak () {
        this.speechInstance = new SpeechSynthesisUtterance();
        Object.keys(this.queryParams).forEach(key => {
            this.speechInstance[key] = this.queryParams[key];
        })
        console.log(this.speechInstance);

        speechSynthesis.speak(this.speechInstance);
    }
},

mounted () {
    let timer = setInterval(() => {
        if(!this.voiceData.length) {
            //获取语言包
            this.voiceData = speechSynthesis.getVoices();
        } else {
            clearInterval(timer);
        }
    }, 500);
}

试一下吧

Ting-Ting

粗略测试,Mac下Chrome支持volume、pitch两个参数,语速rate不支持;Firefox和Safari对volume、rate和pitch三个参数都不支持。

手机端试了IOS下的UC和Safari,竟然都完美支持😄 !

但是可能因为Google被墙的缘故,Chrome的语音功能很不稳定,Firefox和Safari反而比较稳定。

多试几种其他语言,如日语(ja-JP)、粤语(zh-HK)、台湾话(zh-TW)等还是很有意思的😂 。前提是你的浏览器有这种语言包。

奇怪的是汉语选择用英语(en-US)朗读的时候,返回的是一串听不太懂的男声,希望英语能力强的大神多多指教🙏 。

能做什么

以后支持问题改进了,能想到的用途还是不少的。

  • 盲人阅读
  • 翻译?可能还要结合语音识别功能
  • 结合前一篇的文字识别,识别出的文字再转化成语音就完美了
  • 等等

参考资料


感谢指正


原文链接:denzel.netlify.com

上一篇:面试官问你有没有了解过 vue-cli 构建的打包工程
下一篇:记一次使用 vue-admin-template 的优化历程

相关推荐

  • 🙋Hanjst汉吉斯特改进+enSafeExpression安全表达式等

    Hanjst汉吉斯特模版语言及模版引擎,近期持续改进升级。 这次改进主要是增加了对安全输出表达式兼容,由于涉及到对软件开发过程中的效率和软件运行效率的平衡和取舍,所以多写了几句,以描述这个权衡利弊对...

    2 个月前
  • 🙋Hanjst汉吉斯特升级:+showImageAsync及性能改进等

    自2019年元旦🙋Hanjst汉吉斯特 模板语言及其编译引擎发布,已经过去一年多了。 这期间随着 🙋Hanjst汉吉斯特 的推广应用,我们也陆续发布了如下一些更新内容: 🛠️Hanjst/汉吉...

    4 个月前
  • 🙋Hanjst汉吉斯特优化+JsonDataFromScript等

    近日继续对 🙋Hanjst汉吉斯特优化改进。这次的改进思考是从服务器端返回的 HanjstJsonData的容器设计问题。目前的做法是服务器端的HanjstJsonData放入终端页面的一个Div元...

    2 个月前
  • 😉我用 Nuxt.js 仿了个掘金

    前言 首先肯定是要夸夸掘金啦,最开始从 CSDN 到 博客园 再到 掘金,个人感觉掘金的技术氛围非常的nice,真是个宝藏社区👏。技术文章大多以前端为主,对前端开发者非常友好,质量也是歪瑞古的。

    3 个月前
  • 😀一个原生js弹幕库

    danmujs 😀一个原生js弹幕库,基于 CSS3 Animation 地址、核心代码 本项目基于 rcbullets,项目约70%的代码基于rcbullets,首先要感谢这个项目的作者,如...

    6 个月前
  • 🕵️‍♀️由原型到JS中的“模拟类”

    讲述了有关 JavaScript 中原型相关知识,又引出了 JavaScript 中的“类“究竟是什么?,以及一系列相关问题。 一、前置知识 1、JavaScript 的面向对象(OOP) ​ 面向...

    4 个月前
  • 🔥《吊打面试官》系列 Node.js 必知必会必问!

    (/public/upload/f204a3b224d986128f1b4d9b8d06cd17) 前言 codeing 应当是一生的事业,而不仅仅是 30 岁的青春🍚 本文已收录 Git...

    5 个月前
  • 💖CSS + JS 送学妹满屏幕小爱心

    故事开始 午饭时间,暗恋已久的学妹拉着我的衣袖:“学长学长,你能不能让这些爱心变成五颜六色的吗~”。 我在旁边笑开了花~~~ image.png(/public/upload/04aaa24e...

    3 个月前
  • (干货👍)从详细操作js数组到浅析v8中array.js

    前言 最近在写面试编程题,经常用到数组,经常想偷个懒,用它提供的方法,奈何还是对数组方法使用不熟练,导致写了很多的垃圾代码,很多地方稍加修改的话肯定变得简洁高效优雅👊 所以✍这篇文章本着了解一下Ja...

    1 个月前
  • (vuejs学习)2、使用ElementUI(*)

    1.element安装 开发环境是win10,一到node官网下载node的.msi包(https://npm.taobao.org/mirrors/node/v10.16.0/nodev10.16....

    1 年前

官方社区

扫码加入 JavaScript 社区