原生JavaScript再网页实现文本转语音功能

 更新时间:2025年03月17日 15:52:30   作者:bbamx.  
这篇文章主要为大家详细介绍了如何通过原生JavaScript再网页实现文本转语音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

1、原理

语音合成 (也被称作是文本转为语音,英语简写是 tts) 包括接收 app 中需要语音合成的文本,再在设备麦克风播放出来这两个过程。

Web API中对此有一个主要控制接口 SpeechSynthesis,外加一些处理如何表示要被合成的文本 (也被称为 utterances),用什么声音来播出 utterances 等工作的相关接口。同样的,许多操作系统都有自己的某种语音合成系统,在这个任务中我们调用可用的 API 来使用语音合成系统。

2、示例

可以直接复制下面代码运行在浏览器中

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.js"></script>
  </head>
  <body>
    <div>
      <input type="text" />
      <button>开始播放语音</button>
    </div>
  </body>
  <script>
    const btn = document.querySelector('button')
    const ipt = document.querySelector('input')
 
    function speak({ text, speechRate, lang, volume, pitch }, endEvent, startEvent) {
      if (!window.SpeechSynthesisUtterance) {
        console.warn('当前浏览器不支持文字转语音服务')
        return
      }
      if (!text) {
        return
      }
      const speechUtterance = new SpeechSynthesisUtterance()
      speechUtterance.text = text
      speechUtterance.rate = speechRate || 1
      speechUtterance.lang = lang || 'zh-CN'
      speechUtterance.volume = volume || 1
      speechUtterance.pitch = pitch || 1
      speechUtterance.onstart = function (e) {
        startEvent && startEvent()
      }
      speechUtterance.onend = function (e) {
        endEvent && endEvent()
      }
      speechSynthesis.speak(speechUtterance)
 
      return speechUtterance
    }
 
    btn.addEventListener('click', function () {
      if (!ipt.value) return
      speak(
        {
          text: ipt.value,
        },
        function () {
          console.log('语音播放结束')
        },
        function () {
          console.log('语音开始播放')
        }
      )
    })
  </script>
</html>

支持的浏览器

  • Firefox 桌面版和移动版。
  • Firefox OS 2.5+。
  • Chrome 桌面版和安卓版。

注意:如果效果演示失败,大概是由于您当前使用的浏览器不支持语音转文字这个API,请更换浏览器后重试!

3、解析speak函数

接受参数

  • text:要转换为语音的文本内容。
  • speechRate:语音播放速率。
  • lang:语音的语言代码。
  • volume:语音的音量。
  • pitch:语音的音调。

1、另外,它还接受两个回调函数作为参数:endEvent 和 startEvent。endEvent 在语音播放结束时触发,而 startEvent 在语音播放开始时触发。

2、函数首先检查浏览器是否支持语音合成服务,如果不支持则输出警告信息并返回。然后它检查是否传入了要转换的文本内容,如果没有则直接返回。

3、接着,函数创建了一个 SpeechSynthesisUtterance 对象,该对象表示一段要朗读的文本。

4、然后将传入的参数赋值给这个对象的相应属性,如文本内容、语速、语言、音量和音调。

在设置好 SpeechSynthesisUtterance 对象的属性后,

5、函数设置了两个事件处理程序:onstart 和 onend。onstart 事件处理程序在语音播放开始时触发 startEvent 回调函数,onend 事件处理程序在语音播放结束时触发 endEvent 回调函数。

6、最后,函数通过 speechSynthesis.speak() 方法来开始语音合成,将 SpeechSynthesisUtterance 对象传递给该方法以开始朗读文本,并返回这个 SpeechSynthesisUtterance 对象。

4、方法补充

下面小编为大家整理了一些其他js实现文字转语音的方法,希望对大家有所帮助

1.还有Web Speech API

Web Speech API 是一个浏览器提供的用于语音识别和语音合成的API

包括 SpeechSynthesis语音合成 和 SpeechRecognition语音识别

https://developer.mozilla.org/zh-CN/docs/Web/API/SpeechSynthesis

实现代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>语音合成功能</title>
</head>

<body>
    <h1>语音合成功能</h1>
    <textarea id="textToSpeak" rows="4" cols="50" placeholder="请输入要朗读的文本..."></textarea><br>
    <button id="speakButton">朗读文本</button>

    <script>
        const textArea = document.getElementById("textToSpeak");
        const speakButton = document.getElementById("speakButton");

        // 检查浏览器是否支持语音合成
        if (!window.speechSynthesis) {
            alert("您的浏览器不支持语音合成功能。");
        }

        // 获取语音列表
        const voices = window.speechSynthesis.getVoices();
        // 朗读文本
        speakButton.addEventListener("click", function () {
            const text = textArea.value.trim();
            if (text === "") {
                alert("请输入文本内容!");
                return;
            }
            console.log("开始朗读文本:", text);
            const utterance = new SpeechSynthesisUtterance(text);
            utterance.lang = "zh-CN"; // 设置语言为中文
            utterance.voice = voices.find(voice => voice.lang === "zh-CN"); // 选择中文语音
            // 设置语速,取值范围通常在 0.1 到 10 之间,这里设置为 0.8 倍速
            utterance.rate = 0.8;
            // 设置语调,取值范围一般在 0 到 2 之间,这里设为 1.5
            utterance.pitch = 1.5;
            // 设置音量,取值范围从 0 到 1,这里设为 0.5
            utterance.volume = 0.5;
            // 监听朗读结束
            utterance.onend = function () {
                console.log("朗读结束!");
            };

            // 开始朗读
            window.speechSynthesis.speak(utterance);
        });
    </script>
</body>

</html>

2.不调用第三方包

如果不想调用第三方的语音包,就可以用以下方法实现,只不过原生API生成语音确实有点僵硬,isIe的方法是判断当前浏览器是否有ActiveXObject 对象,ActiveXObject 一般情况下是只有IE浏览器才有的,如果有就实例化一个对象,调用Speak方法就可以了;如果没有就用SpeechSynthesisUtterance这个HTML5新增的API来操作。

具体代码如下,在使用的地方直接调用playVoice()方法就可以了。

function isIe() {
    if (!!window.ActiveXObject || "ActiveXObject " in window) {
        return true
    } else {
        return false
    }
}
 
function playVoice() {
    let msg = '这是一个文字转语音的demo'
    console.log(isIe())
    if (isIe()) {
        let voiceObj = new ActiveXObject("Sapi.SpVoice")
        voiceObj.Rate = -1
        voiceObj.Volume = 60
        voiceObj.Speak(msg, 1)
    } else {
        let speakMsg = new SpeechSynthesisUtterance(msg)
        speakMsg.rate = 1
        speakMsg.pitch = 1.5
        window.speechSynthesis.speak(speakMsg)
    }
 
}

以上就是原生JavaScript再网页实现文本转语音功能的详细内容,更多关于JavaScript文本转语音的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript数据结构中串的表示与应用实例

    JavaScript数据结构中串的表示与应用实例

    这篇文章主要介绍了JavaScript数据结构中串的表示与应用,结合实例形式简单分析了基于javascript顺序操作实现串结构与串的拼接操作相关技巧,需要的朋友可以参考下
    2017-04-04
  • JavaScript实现获取设备网络连接信息

    JavaScript实现获取设备网络连接信息

    作为前端开发,做好用户体验是很重要的,日常开发中我们经常可以遇到用户网速慢导致静态资源加载慢,从而给影响用户体验,所以本文来和大家分享一个有趣的API,可以实现获取网络信息
    2023-05-05
  • Nuxt.js 数据双向绑定的实现

    Nuxt.js 数据双向绑定的实现

    这篇文章主要介绍了Nuxt.js 数据双向绑定的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Vue 组件渲染详情

    Vue 组件渲染详情

    这篇文章主要介绍了Vue 组件渲染详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 分享一些不常见却很实用的JS技巧

    分享一些不常见却很实用的JS技巧

    有些代码,需要的时候能写的出来,但是也需要时间,如果有的东西长时间不接触,再次看的时候也会感觉很陌生,这篇文章主要给大家介绍了一些不常见却很实用的JS技巧,既可以作为一个知识的积累,又可以作为闲暇时打发时间写写代码的记录,需要的朋友可以参考下
    2021-11-11
  • 原JS实现banner图的常用功能

    原JS实现banner图的常用功能

    这篇文章主要为大家详细介绍了原JS实现banner图的常用功能,,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 普通web整合quartz跑定时任务的示例

    普通web整合quartz跑定时任务的示例

    这篇文章主要介绍了普通web整合quartz跑定时任务,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • js实现可输入可选择的select下拉框

    js实现可输入可选择的select下拉框

    这篇文章主要为大家详细介绍了js实现可输入可选择的select下拉框,可及时匹配包含输入的内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JS Promise axios 请求结果后面的.then() 是什么意思

    JS Promise axios 请求结果后面的.then() 是什么意思

    本文主要介绍了JS Promise axios 请求结果后面的 .then() 是什么意思,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • JSON字符串和对象相互转换实例分析

    JSON字符串和对象相互转换实例分析

    这篇文章主要介绍了JSON字符串和对象相互转换的方法,结合实例形式分析了json格式数据的转换方法,涉及javascript正则与字符串操作的相关技巧,需要的朋友可以参考下
    2016-06-06

最新评论