HTML+JS實(shí)現(xiàn)在線朗讀器
前言
因?yàn)楣P者最近在學(xué)習(xí)英語(yǔ),所以才想找一個(gè)朗讀器跟著一起念著讀,結(jié)果沒(méi)找到在線朗讀器,沒(méi)辦法。。。只有自己動(dòng)手做一個(gè)了,老話說(shuō)的好:自己動(dòng)手,豐衣足食~
先給大家看下最終效果【沒(méi)管樣式哈~,只是保證有個(gè)結(jié)構(gòu)和功能正常,樣式可以自己畫(huà)一畫(huà)!】
廢話不多說(shuō),代碼開(kāi)整!
一、設(shè)置語(yǔ)言和朗讀人員
我們需要獲取到支持哪些語(yǔ)言和人員:
const synth = window.speechSynthesis; // 注意點(diǎn):這里是獲取不到的,因?yàn)樗兄С值恼Z(yǔ)言是異步載入到這個(gè)數(shù)組里的,所以我們需要加一個(gè)延遲 console.log(synth.getVoices()); setTimeout(() => { // 這樣就可以拿到了 console.log(synth.getVoices()); }, 50)
數(shù)組的每一項(xiàng)內(nèi)容是不同的人和不同的語(yǔ)言構(gòu)成的唯一鍵。
我們可以獲取這個(gè)數(shù)據(jù)放到我們的下拉框中,供我們選擇使用:
HTML代碼:
<label for="lang"> 你可以選擇語(yǔ)言: <select name="lang" id="lang"></select> </label>
JS代碼:
// 將可選的語(yǔ)言填入到選擇框中 setTimeout(() => { const voiceSelect = document.querySelector('select'); const selectChild = synth.getVoices().reduce((res, ite) => { return res += `<option value="${ite.lang}" data-name="${ite.name}">${ite.lang} - ${ite.name}</option>` }, ''); voiceSelect.innerHTML = selectChild; }, 50);
二、設(shè)置音高【不是聲音大小】
我們還可以設(shè)置音高:
HTML代碼:
<div> <label for="pitch"> 你可以設(shè)置音高【范圍在0 - 2之間】: <input type="number" name="pitch" id="pitch" /> </label> </div>
JS代碼:
const pitchInput = document.querySelector('#pitch'); // 音高輸入框 // 當(dāng)音高輸入框的內(nèi)容大于2或小于0的時(shí)候進(jìn)行處理 pitchInput.onblur = () => { if (pitchInput.value > 2) { pitchInput.value = 2; } else if (pitchInput.value < 0) { pitchInput.value = 0; } };
三、設(shè)置音速
我們還可以設(shè)置音速:
HTML代碼:
<label for="rate"> 你可以設(shè)置朗讀速度【范圍在0 - 10之間】: <input type="number" name="rate" id="rate" /> </label>
JS代碼:
const rateInput = document.querySelector('#rate'); // 音速輸入框 // 因?yàn)橛袀z個(gè)以上的限制了,所以提一個(gè)公共方法 // 限制值的公共函數(shù) function limitVal({ ele, min, max }) { ? ? if (ele.value > max) { ? ? ? ? ele.value = max; ? ? } else if (ele.value < min) { ? ? ? ? ele.value = min; ? ? } } // 當(dāng)音速輸入框的內(nèi)容大于10或小于0的時(shí)候進(jìn)行處理 rateInput.onblur = () => { ? ? limitVal({ ele: rateInput, min: 0, max: 10 }); };
四、設(shè)置聲音大小
我們還可以設(shè)置聲音大?。?/p>
HTML代碼:
<label for="volume"> 你可以設(shè)置聲音大小【范圍在0 - 1之間】: <input type="number" value="0.5" name="volume" id="volume" /> </label>
JS代碼:
const volumeInput = document.querySelector('#volume'); // 聲音大小輸入框 // 當(dāng)音速輸入框的內(nèi)容大于10或小于0的時(shí)候進(jìn)行處理 volumeInput.onblur = () => { ? ? limitVal({ ele: volumeInput, min: 0, max: 1 }); };
五、添加暫停和恢復(fù)播放功能
我們新加倆個(gè)按鈕:
HTML代碼:
<button onclick="pause()">暫停</button> <button onclick="continueSpeak()">繼續(xù)</button>
JS代碼:
function pause() { // 暫停 synth.pause(); } function continueSpeak() { // 繼續(xù)播放 synth.resume(); }
六、完整代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>吳迪專用在線朗讀器</title> <style> * {margin: 0;padding: 0;} </style> </head> <body> <h1>吳迪專用在線朗讀器</h1> <div> <label for="lang"> 你可以選擇語(yǔ)言和朗讀人員: <select name="lang" id="lang"></select> </label> </div> <div> <label for="pitch"> 你可以設(shè)置音高【范圍在0 - 2之間】: <input type="number" value="1" name="pitch" id="pitch" /> </label> </div> <div> <label for="rate"> 你可以設(shè)置朗讀速度【范圍在0 - 10之間】: <input type="number" value="1" name="rate" id="rate" /> </label> </div> <div> <label for="volume"> 你可以設(shè)置聲音大小【范圍在0 - 1之間】: <input type="number" value="0.5" name="volume" id="volume" /> </label> </div> <textarea name="" id="readText" cols="30" rows="10">I'm Wu Di~What are you doing now?</textarea> <button onclick="startRead()">開(kāi)始朗讀</button> <button onclick="pause()">暫停</button> <button onclick="continueSpeak()">繼續(xù)</button> <script> const synth = window.speechSynthesis; const voiceSelect = document.querySelector('#lang'); // 語(yǔ)言選擇框 const pitchInput = document.querySelector('#pitch'); // 音高輸入框 const rateInput = document.querySelector('#rate'); // 音速輸入框 const volumeInput = document.querySelector('#volume'); // 聲音大小輸入框 const text = document.getElementById('readText'); // 朗讀內(nèi)容區(qū)域 // 將可選的語(yǔ)言填入到選擇框中 setTimeout(() => { const selectChild = synth.getVoices().reduce((res, ite) => { return res += `<option value="${ite.lang}" data-name="${ite.name}">${ite.lang} - ${ite.name}</option>` }, ''); voiceSelect.innerHTML = selectChild; }, 50); // 限制值的公共函數(shù) function limitVal({ ele, min, max }) { if (ele.value > max) { ele.value = max; } else if (ele.value < min) { ele.value = min; } } // 當(dāng)音高輸入框的內(nèi)容大于2或小于0的時(shí)候進(jìn)行處理 pitchInput.onblur = () => { limitVal({ ele: pitchInput, min: 0, max: 2 }); }; // 當(dāng)音速輸入框的內(nèi)容大于10或小于0的時(shí)候進(jìn)行處理 rateInput.onblur = () => { limitVal({ ele: rateInput, min: 0, max: 10 }); }; // 當(dāng)聲音輸入框的內(nèi)容大于1或小于0的時(shí)候進(jìn)行處理 volumeInput.onblur = () => { limitVal({ ele: volumeInput, min: 0, max: 1 }); }; const utterThis = new window.SpeechSynthesisUtterance(text.value); // 開(kāi)始朗讀 function startRead() { const selectedOption = voiceSelect.selectedOptions[0].getAttribute('data-name'); const voices = synth.getVoices(); for(let i = 0; i < voices.length ; i++) { if(voices[i].name === selectedOption) { utterThis.voice = voices[i]; } } utterThis.pitch = pitchInput.value; // 設(shè)置音高 utterThis.rate = rateInput.value; // 設(shè)置音速 utterThis.volume = volumeInput.value; // 設(shè)置聲音大小 synth.speak(utterThis); } function pause() { // 暫停 synth.pause(); } function continueSpeak() { // 繼續(xù)播放 synth.resume(); } </script> </body> </html>
到此這篇關(guān)于HTML+JS實(shí)現(xiàn)在線朗讀器的文章就介紹到這了,更多相關(guān)HTML JS朗讀器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element ui分頁(yè)多選,翻頁(yè)記憶的實(shí)例
今天小編就為大家分享一篇element ui分頁(yè)多選,翻頁(yè)記憶的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript解構(gòu)賦值的5個(gè)常見(jiàn)場(chǎng)景與實(shí)例教程
解構(gòu)賦值是一種特殊的語(yǔ)法,它使我們可以將數(shù)組或?qū)ο蟆安鸢睘榈揭幌盗凶兞恐?因?yàn)橛袝r(shí)候使用變量更加方便,下面這篇文章主要給大家介紹了關(guān)于JavaScript解構(gòu)賦值的5個(gè)常見(jiàn)場(chǎng)景與實(shí)例的相關(guān)資料,需要的朋友可以參考下2021-11-11js實(shí)現(xiàn)操作cookie的常見(jiàn)方法總結(jié)【創(chuàng)建、讀取、刪除】
這篇文章主要介紹了js實(shí)現(xiàn)操作cookie的常見(jiàn)方法,結(jié)合實(shí)例形式分析了js操作cookie創(chuàng)建、讀取、刪除相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03js監(jiān)聽(tīng)鼠標(biāo)事件控制textarea輸入字符串的個(gè)數(shù)
一個(gè)js控制textarea輸入字符串的個(gè)數(shù)的腳本,當(dāng)鼠標(biāo)按下抬起時(shí)判斷輸入字符數(shù),很簡(jiǎn)單,但很實(shí)用2014-09-09Javascript設(shè)計(jì)模式之發(fā)布訂閱模式
發(fā)布---訂閱模式又叫觀察者模式,它定義了對(duì)象間的一種一對(duì)多的關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知2022-12-12js點(diǎn)擊時(shí)關(guān)閉該范圍下拉菜單之外的菜單方法
下面小編就為大家分享一篇js點(diǎn)擊時(shí)關(guān)閉該范圍下拉菜單之外的菜單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01uniapp開(kāi)發(fā)安卓App實(shí)現(xiàn)高德地圖路線規(guī)劃導(dǎo)航功能的全過(guò)程
最近項(xiàng)目需要在APP內(nèi)實(shí)現(xiàn)路線規(guī)劃導(dǎo)航功能,直接打開(kāi)高德地圖進(jìn)行導(dǎo)航,下面這篇文章主要給大家介紹了關(guān)于利用uniapp開(kāi)發(fā)安卓App實(shí)現(xiàn)高德地圖路線規(guī)劃導(dǎo)航功能的相關(guān)資料,需要的朋友可以參考下2022-08-08js es6系列教程 - 新的類語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)
下面小編就為大家?guī)?lái)一篇js es6系列教程 - 新的類語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09