<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
因為筆者最近在學習英語,所以才想找一個朗讀器跟著一起念著讀,結果沒找到線上朗讀器,沒辦法。。。只有自己動手做一個了,老話說的好:自己動手,豐衣足食~
先給大家看下最終效果【沒管樣式哈~,只是保證有個結構和功能正常,樣式可以自己畫一畫!】
廢話不多說,程式碼開整!
我們需要獲取到支援哪些語言和人員:
const synth = window.speechSynthesis; // 注意點:這裡是獲取不到的,因為所有支援的語言是非同步載入到這個陣列裡的,所以我們需要加一個延遲 console.log(synth.getVoices()); setTimeout(() => { // 這樣就可以拿到了 console.log(synth.getVoices()); }, 50)
陣列的每一項內容是不同的人和不同的語言構成的唯一鍵。
我們可以獲取這個資料放到我們的下拉框中,供我們選擇使用:
HTML程式碼:
<label for="lang"> 你可以選擇語言: <select name="lang" id="lang"></select> </label>
JS程式碼:
// 將可選的語言填入到選擇框中 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);
我們還可以設定音高:
HTML程式碼:
<div> <label for="pitch"> 你可以設定音高【範圍在0 - 2之間】: <input type="number" name="pitch" id="pitch" /> </label> </div>
JS程式碼:
const pitchInput = document.querySelector('#pitch'); // 音高輸入框 // 當音高輸入框的內容大於2或小於0的時候進行處理 pitchInput.onblur = () => { if (pitchInput.value > 2) { pitchInput.value = 2; } else if (pitchInput.value < 0) { pitchInput.value = 0; } };
我們還可以設定音速:
HTML程式碼:
<label for="rate"> 你可以設定朗讀速度【範圍在0 - 10之間】: <input type="number" name="rate" id="rate" /> </label>
JS程式碼:
const rateInput = document.querySelector('#rate'); // 音速輸入框 // 因為有倆個以上的限制了,所以提一個公共方法 // 限制值的公共函數 function limitVal({ ele, min, max }) { if (ele.value > max) { ele.value = max; } else if (ele.value < min) { ele.value = min; } } // 當音速輸入框的內容大於10或小於0的時候進行處理 rateInput.onblur = () => { limitVal({ ele: rateInput, min: 0, max: 10 }); };
我們還可以設定聲音大小:
HTML程式碼:
<label for="volume"> 你可以設定聲音大小【範圍在0 - 1之間】: <input type="number" value="0.5" name="volume" id="volume" /> </label>
JS程式碼:
const volumeInput = document.querySelector('#volume'); // 聲音大小輸入框 // 當音速輸入框的內容大於10或小於0的時候進行處理 volumeInput.onblur = () => { limitVal({ ele: volumeInput, min: 0, max: 1 }); };
我們新加倆個按鈕:
HTML程式碼:
<button onclick="pause()">暫停</button> <button onclick="continueSpeak()">繼續</button>
JS程式碼:
function pause() { // 暫停 synth.pause(); } function continueSpeak() { // 繼續播放 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"> 你可以選擇語言和朗讀人員: <select name="lang" id="lang"></select> </label> </div> <div> <label for="pitch"> 你可以設定音高【範圍在0 - 2之間】: <input type="number" value="1" name="pitch" id="pitch" /> </label> </div> <div> <label for="rate"> 你可以設定朗讀速度【範圍在0 - 10之間】: <input type="number" value="1" name="rate" id="rate" /> </label> </div> <div> <label for="volume"> 你可以設定聲音大小【範圍在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()">開始朗讀</button> <button onclick="pause()">暫停</button> <button onclick="continueSpeak()">繼續</button> <script> const synth = window.speechSynthesis; const voiceSelect = document.querySelector('#lang'); // 語言選擇框 const pitchInput = document.querySelector('#pitch'); // 音高輸入框 const rateInput = document.querySelector('#rate'); // 音速輸入框 const volumeInput = document.querySelector('#volume'); // 聲音大小輸入框 const text = document.getElementById('readText'); // 朗讀內容區域 // 將可選的語言填入到選擇框中 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); // 限制值的公共函數 function limitVal({ ele, min, max }) { if (ele.value > max) { ele.value = max; } else if (ele.value < min) { ele.value = min; } } // 當音高輸入框的內容大於2或小於0的時候進行處理 pitchInput.onblur = () => { limitVal({ ele: pitchInput, min: 0, max: 2 }); }; // 當音速輸入框的內容大於10或小於0的時候進行處理 rateInput.onblur = () => { limitVal({ ele: rateInput, min: 0, max: 10 }); }; // 當聲音輸入框的內容大於1或小於0的時候進行處理 volumeInput.onblur = () => { limitVal({ ele: volumeInput, min: 0, max: 1 }); }; const utterThis = new window.SpeechSynthesisUtterance(text.value); // 開始朗讀 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; // 設定音高 utterThis.rate = rateInput.value; // 設定音速 utterThis.volume = volumeInput.value; // 設定聲音大小 synth.speak(utterThis); } function pause() { // 暫停 synth.pause(); } function continueSpeak() { // 繼續播放 synth.resume(); } </script> </body> </html>
到此這篇關於HTML+JS實現線上朗讀器的文章就介紹到這了,更多相關HTML JS朗讀器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45