如何用JavaScript让你的浏览器说话

 更新时间:2021年04月28日 10:37:11   作者:浅笑·  
这篇文章主要介绍了如何用JavaScript让你的浏览器说话,对语音感兴趣的同学,可以实验一下

1. 最简单的例子

让我们来创建一个基础函数,这个函数的参数为我们想说的话或者词,最后让我们的浏览器说出来。我们将利用在大多数现代浏览器上都可以使用的原生APIspeechSyntehsis。

function speak(sentence) {
    const utterance = new SpeechSynthesisUtterance(sentence)
    window.speechSynthesis.speak(utterance)
}

// test
speak('hello world');

信不信由你,以上的代码就是让大部分浏览器说出一句话所需要的一切!让我们来看看这里具体发生了什么。

我们创建的speak()函数,该函数以词句为参数。我们创建了一个发声对象,他实际上是一个语言请求对象,其中包含了有关说什么和如何说相关的所有数据。

2. 自定义语速和音调

让我们做一个稍微复杂一点的示例,尝试修改说出来的单词的速度和音调。

/**
 * @param sentence:要说的句子
 * @param pitch: 音调,取值范围(0 - 2) 默认值:1
 * @param rate: 语速,取值范围(0.1 - 10) 默认值:1
 */
function speak(sentence, pitch, rate) {
    const utterance = new SpeechSynthesisUtterance(sentence)

    utterance.rate = rate
    utterance.pitch = pitch

    window.speechSynthesis.speak(utterance)
}

在上面的示例中,我们基于原来函数增加了音调和语速2个参数。在我们创建了发声对象之后,我们可以直接在发声对象上直接修改某些属性。但是,目前还不能通过构造函数或者setter方法来修改。

pitch(音调)是一个浮点数,取值范围是0到2,默认值是1。这个值的效果可能受到引擎或者声音的限制。

rate(语速)是一个浮点数,取值范围是0.1到10,默认值是1。

现在,如果我们使用简单的句子调用上面的代码,我们的浏览器就会以正常的语速和音调说出下面的话:

speak('Hello world', 1, 1)

3. 怎么调整音量

我们也可以像调整音调和速度一样调整音量,让我们来快速了解一下如何实现

/**
 * @param sentence:要说的句子
 * @param volume: 音量,取值范围(0 - 1) 默认值:0.5
 */
function speak(sentence, volume) {
    const utterance = new SpeechSynthesisUtterance(sentence)

    utterance.volume = volume

    window.speechSynthesis.speak(utterance)
}

修改之前的代码,我们现在传入音量参数。音量也是一个浮点数,取值范围0到1,默认值是0.5。

同样,目前没有办法通过构造函数或者setter方法来设置音量。现在,我们给这个函数传入自己想要的句子和音量就能听到想要的结果了。

4. 常用的函数

speechSynthesis对象有一些可以派得上用场的函数。我们可以暂停、恢复、甚至取消语言的进度。让我们快速浏览一下:

const utterance = new SpeechSynthesisUtterance('Hello world');
window.speechSynthesis.speak(utterance);

// 暂停 
window.speechSynthesis.pause();
// 恢复
window.speechSynthesis.resume();
// 取消
window.speechSynthesis.cancel();

上面的代码将会说出我们想要的句子,并且这段语音会暂停、恢复,最终取消。你也可以在你的浏览器里面试一试上面的代码。

我们也可以通过speechSynthesis对象上的paused属性来直接判断该段音频是否被暂停,它将会返回一个布尔值来表示该段音频是否被暂停了。

window.speechSynthesis.paused // Boolean

如果还有一些积压的等待读出来的句子怎么办?嗯,还有一个属性pending,用来检查是否有任何等待说出来的语音。它返回一个布尔值,指示是否有待处理的语音。

const utterThis = new SpeechSynthesisUtterance('Hello world');
const utterThat = new SpeechSynthesisUtterance('Hello JavaScript');

window.speechSynthesis.speak(utterThis);
window.speechSynthesis.speak(utterThat);
window.speechSynthesis.pending;

执行上面的代码时,将会有两段语音排队,并且他们会按照顺序播放。当我们获取pending属性时,这个值将返回true,因为,有第二段语音在等待播放。

注意:如果你只有一段语音,这个pending属性将会一直返回false,因为没有排队等待播放的语音。

5. 事件监听

当我们使用SpeechSynthesisUtteranceapi时,我们可以监听几个比较有用的事件。让我们一起看一下:

const utterance = new SpeechSynthesisUtterance('Hello world')

utterance.addEventListener('start', () => console.log('Utterance start'))
utterance.addEventListener('pause', () => console.log('Utterance paused'))
utterance.addEventListener('resume', () => console.log('Utterance resumed'))
utterance.addEventListener('end', () => console.log('Utterance end'))

window.speechSynthesis.speak(utterance)

6. 总结

希望这篇文章足以让你在浏览器里面玩转“合成语音”啦!你现在应该掌握了如何开始,停止和暂停语音,以及调整语音的速率,音调和音量。

以上就是如何用JavaScript让你的浏览器说话的详细内容,更多关于JavaScript的资料请关注脚本之家其它相关文章!

相关文章

  • javascript实现简约的页面右下角点击弹出窗口示例【测试可用】

    javascript实现简约的页面右下角点击弹出窗口示例【测试可用】

    这篇文章主要介绍了javascript实现的页面右下角点击弹出窗口功能,结合实例形式详细分析了javascript页面右下角点击弹出窗口功能的相关步骤、原理与注意事项,需要的朋友可以参考下
    2023-07-07
  • 循环 vs 递归浅谈

    循环 vs 递归浅谈

    本文代码使用 JavaScript。 一些同学对递归的理解还停留在“是一种求阶乘比循环低效的方法”。但其实递归和循环处理的问题是不同。拿“遍历数组”这个问题来说:循环适合同一维度(单层长度不限)上的遍历,而递归则适合跨维度(层数不限)的遍历。
    2013-02-02
  • JavaScript实现二叉树定义、遍历及查找的方法详解

    JavaScript实现二叉树定义、遍历及查找的方法详解

    这篇文章主要介绍了JavaScript实现二叉树定义、遍历及查找的方法,结合实例形式较为详细的分析了二叉树的相关概念及javascript构建二叉树、遍历、查找二叉树的常用操作技巧,需要的朋友可以参考下
    2017-12-12
  • JavaScript中读取和保存文件实例

    JavaScript中读取和保存文件实例

    这篇文章主要介绍了JavaScript中读取和保存文件实例,使用HTML5 File API实现,需要的朋友可以参考下
    2014-05-05
  • JS 如何获取radio选中后的值及不选择取radio的值

    JS 如何获取radio选中后的值及不选择取radio的值

    获取radio选中后的值,这在提交页面经常会使用到的,在本文为大家介绍下不选择也能获取radio的值,具体实现如下,感兴趣的朋友可以参考下
    2013-10-10
  • 为JavaScript类型增加方法的实现代码(增加功能)

    为JavaScript类型增加方法的实现代码(增加功能)

    大家在js开发过程中有些功能已经满足不了我们的需求,或没有我们需要的功能,那么我们就可以自己扩展下,个性化js
    2011-12-12
  • js导出Excel表格超出26位英文字符的解决方法ES6

    js导出Excel表格超出26位英文字符的解决方法ES6

    下面小编就为大家带来一篇js导出Excel表格超出26位英文字符的解决方法ES6。具有很好的参考价值。一起跟随小编过来看看吧,希望对大家有所帮助
    2017-11-11
  • 微信小程序模板之分页滑动栏

    微信小程序模板之分页滑动栏

    这篇文章主要为大家详细介绍了微信小程序模板之分页滑动栏的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 前端常见的两种pc适配方案介绍

    前端常见的两种pc适配方案介绍

    这篇文章主要介绍了前端常见的两种pc适配方案的相关资料,在PC端自适应设计通过优化用户体验和提高网站适配性,确保了电商网站、企业官网和在线教育平台等多种场景下内容的清晰展示和流畅操作,需要的朋友可以参考下
    2024-10-10
  • 原生js实现俄罗斯方块

    原生js实现俄罗斯方块

    这篇文章主要为大家详细介绍了原生js实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论