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

2018-05-17 admin

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)朗读的时候,返回的是一串听不太懂的男声,希望英语能力强的大神多多指教🙏 。

能做什么

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

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

参考资料


感谢指正


[转载]原文链接:https://denzel.netlify.com/js/speech_in_js_synthesis.html?_=5674839201987

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-32384.html

文章标题:JS中的语音合成——Speech Synthesis API

相关文章
从2014年的发展来展望JS的未来将会如何
<font face="寰�杞�闆呴粦, Arial, sans-serif ">2014骞达紝杞�浠惰�屼笟鍙戝睍杩呴€燂紝鍚勭�嶈��瑷€灞傚嚭涓嶇┓锛屼互婊¤冻鐢ㄦ埛涓嶆柇鍙樺寲鐨勯渶姹傘€傝繖浜涜��...
2015-11-12
jsdom 中文文档(纯翻译)
jsdom是一个纯粹由 javascript 实现的一系列 web标准,特别是 WHATWG 组织制定的DOM和 HTML 标准,用于在 nodejs 中使用。大体上来说,该项目的目标是模拟足够的Web浏览器子集,以便用于测试和挖掘真实世界...
2018-05-14
three.js实现围绕某物体旋转
话不多说,请看代码: 可以拖动右上角观察变化 <!DOCTYPE html> <html lang="en" style="width: 100%; height:100%;"&gt...
2017-02-17
JavaScript教程:JS中的原型
Keith Peters 几年前发表的一篇博文,关于学习没有“new”的世界,其中解释了使用原型继承代替构造函数。两者都是纯粹的原型编码。 标准方法(The Standard Way) 一直以来,我们学习的在 JavaScript 里创建对...
2015-11-12
NodeJS参考手册pdf版
下载地址:Nodejs参考手册PDF版下载 ...
2015-11-12
Node.js学习(1)----HTTP服务器与客户端
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 Jav...
2015-11-12
使用jspdf生成pdf报表
由于前台html已经动态生成报表,而且,前台有一个功能,一个date range组件,当你拖动的时候,报表会在不提交到后台的情况下动态变化。 因此需要用到js生成生报表: 用到的组件: jquery.js jspdf.js canvg.js...
2017-03-25
Riot.js:不足1KB的MVP客户端框架
Riot.js是一款MVP(模型-视图-呈现)开源客户端框架,其最大的特点就是体积非常小,不足1KB,虽然体积小,但它可以帮助用户构建大规模的Web应用程序。 Riot.js是由Moot公司开发,目前最新版本为v0.9.2,遵循MIT开源许...
2016-03-11
javaScript+turn.js实现图书翻页效果实例代码
为了实现图书翻页的效果我们在网上可以看到很多教程 在这里推荐turn.js 网上的turn.js 有api 不过是英文的  很多人看起来不方便 .关于代码也是奇形怪状在这里我将详细讲解如何使用turn.js实现翻页效果 ,本篇文章只是讲解 ...
2017-03-16
如何为高负载网络优化Nginx 和 Node.js?
译者:AlfredCheung 在搭建高吞吐量web应用这个议题上,NginX和Node.js可谓是天生一对。他们都是基于事件驱动模型而设计,可以轻易突破Apache等传统web服务器的C10K瓶颈。预设的配置已经可以获得很高的并发,不过,...
2015-11-12
回到顶部