• 用JavaScript让你的浏览器说话


    最近在开发一个个人项目时,我冒出了一个尝试让浏览器说话的想法。不知道该怎么做,于是,我在网上寻找了一下答案,在MDN上,我找到了答案。让我们来看看如何通过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,因为没有排队等待播放的语音。

    资源搜索网站大全https://55wd.com 广州品牌设计公司http://www.maiqicn.com

    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. 总结

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

  • 相关阅读:
    美多商城项目(一)
    Linux安装Qt
    mysql之初体验
    Linux系统编程目录
    Linux 多线程
    进程间通信
    Linux进程
    Linux文件IO(简易)
    Linux常用基本操作
    重绘
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13744635.html
Copyright © 2020-2023  润新知