最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于JS實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音即文本朗讀

 更新時(shí)間:2023年10月20日 10:32:34   作者:itclanCoder  
這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用SpeechSynthesis實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音即文本朗讀的功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

平時(shí)在做項(xiàng)目的過程中,有遇到場(chǎng)景是客戶要求播放語(yǔ)音的場(chǎng)景,比如:無障礙朗讀,整篇文章實(shí)現(xiàn)朗讀,文字轉(zhuǎn)語(yǔ)音,文字轉(zhuǎn)語(yǔ)音播放等等。

在不使用第三方API接口的情況下,這里需要js來實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音播放的功能。能想到的也就是利用html5的個(gè)APISpeechSynthesis。

SpeechSynthesis用于將指定文字合成為對(duì)應(yīng)的語(yǔ)音.也包含一些配置項(xiàng),指定如何去閱讀(語(yǔ)言,音量,音調(diào))等等

SpeechSynthesis實(shí)例對(duì)象屬性

  • lang 獲取并設(shè)置話語(yǔ)的語(yǔ)言
  • pitch 獲取并設(shè)置話語(yǔ)的音調(diào)(值越大越尖銳,越低越低沉)
  • rate 獲取并設(shè)置說話的速度(值越大語(yǔ)速越快,越小語(yǔ)速越慢)
  • text 獲取并設(shè)置說話時(shí)的文本
  • voice 獲取并設(shè)置說話的聲音
  • volume 獲取并設(shè)置說話的音量

SpeechSynthesis方法

  • speak() 將對(duì)應(yīng)的實(shí)例添加到語(yǔ)音隊(duì)列中
  • cancel() 刪除隊(duì)列中所有的語(yǔ)音.如果正在播放,則直接停止
  • pause()暫停語(yǔ)音
  • resume() 恢復(fù)暫停的語(yǔ)音
  • getVoices 獲取支持的語(yǔ)言數(shù)組. 注意:必須添加在voiceschanged事件中才能生效

實(shí)例對(duì)象中的方法

  • onstart – 語(yǔ)音合成開始時(shí)候的回調(diào)。
  • onpause – 語(yǔ)音合成暫停時(shí)候的回調(diào)。
  • onresume – 語(yǔ)音合成重新開始時(shí)候的回調(diào)。
  • onend – 語(yǔ)音合成結(jié)束時(shí)候的回調(diào)

簡(jiǎn)單實(shí)現(xiàn)

如果想讓瀏覽器讀出“書以啟智,技于謀生,活出斜杠”的聲音,可以下面的js代碼:

let utterThis = new SpeechSynthesisUtterance('書以啟智,技于謀生,活出斜杠');
speechSynthesis.speak(utterThis);

實(shí)現(xiàn)這個(gè)語(yǔ)音朗讀,需要用構(gòu)造器函數(shù)SpeechSynthesisUtterance方法,實(shí)例對(duì)象下,調(diào)用speak方法,即可實(shí)現(xiàn)語(yǔ)音的播報(bào)

除了使用speak方法,我們還可以實(shí)例對(duì)象屬性text,因此上面的代碼也可以寫成

let utterThis = new SpeechSynthesisUtterance();
utterThis.text = '書以啟智,技于謀生,活出斜杠';
utterThis.lang = 'en-US';//漢語(yǔ)
utterThis.rate = 0.7;//語(yǔ)速
speechSynthesis.speak(utterThis);

具體實(shí)例代碼

<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="請(qǐng)輸入內(nèi)容" v-model="input"></el-input>
             <el-select @change="handleSelectChange" v-model="selectVal" slot="prepend" placeholder="請(qǐng)選擇語(yǔ)言">
                 <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">轉(zhuǎn)語(yǔ)音</el-button>
            <el-button  @click="handleStopYuYin">暫停</el-button>
            <el-button  @click="handleHuiFuYuYin">恢復(fù)</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('輸入框內(nèi)容不能為空');
            }
           
         },

 
         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來創(chuàng)建語(yǔ)音,xxx.volume 獲取并設(shè)置說話的音量,xxx.rate 獲取并設(shè)置說話的速度(值越大語(yǔ)速越快,越小語(yǔ)速越慢),xxx.pitch 獲取并設(shè)置話語(yǔ)的音調(diào)(值越大越尖銳,越低越低沉)

window.speechSynthesis.speak(msg) 播放語(yǔ)音,msg 是一個(gè)SpeechSynthesisUtterance對(duì)象,msg.text 設(shè)置要播放的話, msg.lang 設(shè)置語(yǔ)言,msg.volume 設(shè)置音量,msg.rate 設(shè)置語(yǔ)速,msg.pitch 設(shè)置音調(diào)

上面使用了throttle函數(shù)來限制播放的頻率,防止播放過快,導(dǎo)致瀏覽器卡頓

如果不使用接口的方式,在項(xiàng)目中加入文本轉(zhuǎn)語(yǔ)音,可以用這種方式實(shí)現(xiàn),但是要注意兼容性問題,這個(gè)API是不兼容IE瀏覽器的

到此這篇關(guān)于基于JS實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音即文本朗讀的文章就介紹到這了,更多相關(guān)JS文字轉(zhuǎn)語(yǔ)音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 網(wǎng)站頁(yè)面自動(dòng)跳轉(zhuǎn)實(shí)現(xiàn)方法PHP、JSP(下)

    網(wǎng)站頁(yè)面自動(dòng)跳轉(zhuǎn)實(shí)現(xiàn)方法PHP、JSP(下)

    很多時(shí)候我們需要Web頁(yè)具備有自動(dòng)跳轉(zhuǎn)功能,例如,論壇中的用戶登錄、發(fā)帖及回復(fù)或留言簿中的留言和回復(fù)等操作成功后,若用戶沒有任何鼠標(biāo)點(diǎn)擊操作,過了一定的時(shí)間,頁(yè)面自動(dòng)跳轉(zhuǎn)到預(yù)設(shè)的頁(yè)面。
    2010-08-08
  • 在多個(gè)頁(yè)面使用同一個(gè)HTML片段的代碼

    在多個(gè)頁(yè)面使用同一個(gè)HTML片段的代碼

    有一個(gè)比較復(fù)雜的HTML片段(A),如果把這個(gè)HTML片段嵌入到其他頁(yè)面中(B,C,D....)。 問題的關(guān)鍵是在HTML片段中有大量的JavaScript邏輯需要處理,比如說分頁(yè),點(diǎn)擊事件響應(yīng)等。
    2011-03-03
  • three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例

    three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例

    最近在用three.js做三維模型的時(shí)候,需要通過鼠標(biāo)滑輪向前來控制視角朝鼠標(biāo)的位置放大,然后通過鼠標(biāo)滑輪向后將視角復(fù)原,這篇文章主要給大家介紹了關(guān)于three.js如何設(shè)置物體的縮放和旋轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • js左側(cè)多級(jí)菜單動(dòng)態(tài)的解決方案

    js左側(cè)多級(jí)菜單動(dòng)態(tài)的解決方案

    實(shí)現(xiàn)的效果很簡(jiǎn)單,就是點(diǎn)一下顯示,再點(diǎn)一下就隱藏,只不過是多了幾級(jí)的問題。好,現(xiàn)在來說說我的設(shè)計(jì)思路,首先從第一級(jí)別開始,添加如下代碼
    2010-02-02
  • 可自定義速度的js圖片無縫滾動(dòng)示例分享

    可自定義速度的js圖片無縫滾動(dòng)示例分享

    這篇文章主要介紹了非常平滑的JS圖片滾動(dòng)特效代碼,無縫循環(huán),速度可自定義,大家參考使用吧
    2014-01-01
  • 微信小程序從注冊(cè)賬號(hào)到上架(圖文詳解)

    微信小程序從注冊(cè)賬號(hào)到上架(圖文詳解)

    這篇文章主要介紹了微信小程序從注冊(cè)賬號(hào)到上架詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 前端導(dǎo)出PDF的組件及方法實(shí)際例子

    前端導(dǎo)出PDF的組件及方法實(shí)際例子

    這篇文章主要介紹了三種流行的前端導(dǎo)出PDF的組件和方法,分別是jsPDF、pdfMake和Print.js,每個(gè)庫(kù)都有其特點(diǎn)和適用場(chǎng)景,可以根據(jù)具體需求選擇合適的庫(kù),需要的朋友可以參考下
    2025-02-02
  • 原生js ActiveXObject獲取execl里面的值

    原生js ActiveXObject獲取execl里面的值

    使用原生js獲取execl里面的值,想必有很多的朋友都不會(huì)吧,下面有個(gè)不錯(cuò)的方法主要是使用ActiveXObject來實(shí)現(xiàn),感興趣的朋友可不要錯(cuò)過
    2013-11-11
  • JS中setInterval、setTimeout不能傳遞帶參數(shù)的函數(shù)的解決方案

    JS中setInterval、setTimeout不能傳遞帶參數(shù)的函數(shù)的解決方案

    在JS中無論是setTimeout還是setInterval,在使用函數(shù)名作為調(diào)用句柄時(shí)都不能帶參數(shù),而在許多場(chǎng)合必須要帶參數(shù),接下來為大家介紹具體的解決方法
    2013-04-04
  • JavaScript詳細(xì)分析數(shù)據(jù)類型和運(yùn)算符

    JavaScript詳細(xì)分析數(shù)據(jù)類型和運(yùn)算符

    這篇文章主要介紹了JavaScript數(shù)據(jù)類型和運(yùn)算符案例,結(jié)合實(shí)例形式分析了JavaScript數(shù)據(jù)類型和運(yùn)算符特性與相關(guān)操作技巧,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

肥乡县| 榕江县| 都江堰市| 北流市| 岳池县| 诏安县| 张掖市| 尼勒克县| 陕西省| 合水县| 罗江县| 屯留县| 建始县| 二手房| 赤壁市| 英超| 肥西县| 平果县| 阜平县| 曲周县| 六安市| 长沙市| 沛县| 简阳市| 子洲县| 建昌县| 天祝| 银川市| 绥阳县| 电白县| 日照市| 康平县| 聂荣县| 偃师市| 屏东市| 阿图什市| 柞水县| 巨野县| 河西区| 鄂温| 莆田市|