基于JS实现文字转语音即文本朗读

 更新时间:2023年10月20日 10:32:34   作者:itclanCoder  
这篇文章主要为大家详细介绍了JavaScript如何利用SpeechSynthesis实现文字转语音即文本朗读的功能,感兴趣的小伙伴可以跟随小编一起学习一下

前言

平时在做项目的过程中,有遇到场景是客户要求播放语音的场景,比如:无障碍朗读,整篇文章实现朗读,文字转语音,文字转语音播放等等。

在不使用第三方API接口的情况下,这里需要js来实现文字转语音播放的功能。能想到的也就是利用html5的个APISpeechSynthesis

SpeechSynthesis用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等等

SpeechSynthesis实例对象属性

  • lang 获取并设置话语的语言
  • pitch 获取并设置话语的音调(值越大越尖锐,越低越低沉)
  • rate 获取并设置说话的速度(值越大语速越快,越小语速越慢)
  • text 获取并设置说话时的文本
  • voice 获取并设置说话的声音
  • volume 获取并设置说话的音量

SpeechSynthesis方法

  • speak() 将对应的实例添加到语音队列中
  • cancel() 删除队列中所有的语音.如果正在播放,则直接停止
  • pause()暂停语音
  • resume() 恢复暂停的语音
  • getVoices 获取支持的语言数组. 注意:必须添加在voiceschanged事件中才能生效

实例对象中的方法

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

简单实现

如果想让浏览器读出“书以启智,技于谋生,活出斜杠”的声音,可以下面的js代码:

let utterThis = new SpeechSynthesisUtterance('书以启智,技于谋生,活出斜杠');
speechSynthesis.speak(utterThis);

实现这个语音朗读,需要用构造器函数SpeechSynthesisUtterance方法,实例对象下,调用speak方法,即可实现语音的播报

除了使用speak方法,我们还可以实例对象属性text,因此上面的代码也可以写成

let utterThis = new SpeechSynthesisUtterance();
utterThis.text = '书以启智,技于谋生,活出斜杠';
utterThis.lang = 'en-US';//汉语
utterThis.rate = 0.7;//语速
speechSynthesis.speak(utterThis);

具体实例代码

<template>
    <div class="speech-wrap">
       <div>
            <span class="demonstration">音量</span>
            <el-slider @input="handleVoinceInput" v-model="voinceValue"  vertical height="200px"></el-slider>
       </div>
       <div>
             <el-input class="inseret-input" clearable placeholder="请输入内容" v-model="input"></el-input>
             <el-select @change="handleSelectChange" v-model="selectVal" slot="prepend" placeholder="请选择语言">
                 <el-option label="zh-CN" value="zh-CN"></el-option>
                 <el-option label="en-US" value="en-US"></el-option>
            </el-select>
            <el-button slot="append" @click="handleTransYuYin">转语音</el-button>
            <el-button  @click="handleStopYuYin">暂停</el-button>
            <el-button  @click="handleHuiFuYuYin">恢复</el-button>
       </div>  
    </div>
 </template>
 <script>
 export default {
     name: 'speechSynthesisUtterance',
     data() {
         return {
             input: '书以启智,技于谋生,活出斜杠',
             voinceValue: 30,
             selectVal: 'zh-CN',
         }
     },
 
     methods: {
         handleTransYuYin() {
            if(this.input) {
                let msg = new SpeechSynthesisUtterance(this.input);
                msg.volume = this.voinceValue;
                msg.rate = this.voinceValue;
                msg.pitch = this.voinceValue;
                this.throttle(window.speechSynthesis.speak(msg),2000);
            }else {
                this.$message.error('输入框内容不能为空');
            }
           
         },

 
         handleVoinceInput(val) {
             this.voinceValue = val;
         },
 
          handleSelectChange(val) {
             this.selectVal = val;
          },
 
          handleStopYuYin() {
              window.speechSynthesis.pause();
          },

          handleHuiFuYuYin() {
            window.speechSynthesis.resume();
          },
 
          throttle(fn,delay) {
             let last = 0
             return function() {
                 const now = new Date()
                 if(now - last > delay) {
                     fn.apply(this,arguments)
                     last = now
                 }
             }
         }  
         
     }
 }
 </script>
 <style scoped>
 .speech-wrap {
    display:flex;
    justify-content:start;
    align-items: center;
    
 }

 .speech-wrap .inseret-input {
    width: 400px;
 }
 </style>

window.speechSynthesis来创建语音,xxx.volume 获取并设置说话的音量,xxx.rate 获取并设置说话的速度(值越大语速越快,越小语速越慢),xxx.pitch 获取并设置话语的音调(值越大越尖锐,越低越低沉)

window.speechSynthesis.speak(msg) 播放语音,msg 是一个SpeechSynthesisUtterance对象,msg.text 设置要播放的话, msg.lang 设置语言,msg.volume 设置音量,msg.rate 设置语速,msg.pitch 设置音调

上面使用了throttle函数来限制播放的频率,防止播放过快,导致浏览器卡顿

如果不使用接口的方式,在项目中加入文本转语音,可以用这种方式实现,但是要注意兼容性问题,这个API是不兼容IE浏览器的

到此这篇关于基于JS实现文字转语音即文本朗读的文章就介绍到这了,更多相关JS文字转语音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js 表格隔行颜色

    js 表格隔行颜色

    表格隔行颜色,就是通过判断当前表格的单数进行判断。一般asp中应用的比较广泛。
    2009-12-12
  • 微信小程序实现搜索功能并跳转搜索结果页面

    微信小程序实现搜索功能并跳转搜索结果页面

    这篇文章主要为大家详细介绍了微信小程序实现搜索功能并跳转搜索结果页面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • js 实现picker 选择器示例详解

    js 实现picker 选择器示例详解

    这篇文章主要为大家介绍了js 实现picker 选择器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • JavaScript使用ul中li标签实现删除效果

    JavaScript使用ul中li标签实现删除效果

    这篇文章主要为大家详细介绍了JavaScript使用ul中li标签实现删除效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 详解JS如何判断对象上是否存在某个属性

    详解JS如何判断对象上是否存在某个属性

    判断某一个对象里面是否存在某个属性,是常见错误场景排查,但是你真的知道该如何使用嘛,本文为大家整理了常用的三种方法,希望对大家有所帮助
    2023-05-05
  • JS控制表单提交的方法

    JS控制表单提交的方法

    这篇文章主要介绍了JS控制表单提交的方法,可实现基于javascript提交表单信息的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • javascript bom是什么及bom和dom的区别

    javascript bom是什么及bom和dom的区别

    BOM是浏览器对象模型,DOM是文档对象模型,前者是对浏览器本身进行操作,而后者是对浏览器(可看成容器)内的内容进行操作。这篇文章给大家介绍javascript bom是什么及bom和dom的区别,感兴趣的朋友一起学习吧
    2015-11-11
  • JS通过识别id、value值对checkbox设置选中状态

    JS通过识别id、value值对checkbox设置选中状态

    最开始需要获取的是input value值设置checkbox选中状态,由于input value要使用计算业务,后来改造为id,这里就为大家分享一下实现代码,需要的朋友可以参考下
    2020-02-02
  • JS版获取字符串真实长度和取固定长度的字符串函数

    JS版获取字符串真实长度和取固定长度的字符串函数

    JS版获取字符串真实长度和取固定长度的字符串函数...
    2007-04-04
  • JS的for循环中的var 和 let详解

    JS的for循环中的var 和 let详解

    在js的嵌套for循环异步执行,声明i和使用i获取到的变量 都要用 let 声明,不要用var,这篇文章主要介绍了JS的for循环中的var和let,需要的朋友可以参考下
    2024-05-05

最新评论