iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0

Table of Contents

  • 取節點與預設語音文字
  • 產生對應語音的選項清單
  • 切換開關
  • 從清單中選擇聲音
  • 修改聲音速度、音調、文字
  • References

Yes
今天要學speechSynthesisAPI,使輸入文字透過語音輸出。

取節點與預設語音文字

會發現作者已經先幫忙設定好這些內容了,第一個變數是從SpeechSynthesisUtterance()建立一個新的實例,這個實例中會有語音的文字、語言、語調等資訊可以使用,至於SpeechSynthesis介面會找出目前網頁上的語音,並且能夠執行播放或停播的方法。

const message = new SpeechSynthesisUtterance();
let voices = [];
const voicesDropdown = document.querySelector('[name="voice"]');
const options = document.querySelectorAll('[type="range"], [name="text"]');
const speakButton = document.querySelector('#speak');
const stopButton = document.querySelector('#stop');

//最一開始對物件存入預設文字的值
message.text = document.querySelector('[name="text"]').value

產生對應語音的選項清單

SpeechSynthesis.getVoices()會回傳一個voice物件,這個物件會提供聲音可以使用的語言、語言名稱等。
之後需要從這個清單中找出語言名稱與國家,並且使用innerHTML插入清單。

function populateVoices(){
    voices = this.getVoices();
    voicesDropdown.innerHTML = voices
    .map(voice=>`<option value="${voice.name}">${voice.name}(${voice.lang})</option>`)
    .join('');
}

//當voice物件清單變更時,會觸發`voiceschanged`事件
speechSynthesis.addEventListener('voiceschanged',populateVoices)

切換開關

無論是在清單中重新選擇聲音,還是修改設定時,要能原本語音播放時停止,並且重新播放該內容。在原本的程式碼中,切換播放語音與停止播放的事件是用同個函式,在預設上函式的參數是true,需要語音停止就是false

function toggle(startOver=true){
    speechSynthesis.cancel();
    if (startOver){
      speechSynthesis.speak(message);
    }
}

speakButton.addEventListener('click',toggle)
stopButton.addEventListener('click',()=>toggle(false))

stopButton的函式除了寫箭頭函式,也可以寫toggle.bind(null,false)創建一個新的函式,並且使用裡面的參數直接執行這個函式,第一個參數是想綁成this的元素或其他物件,但是這邊只是希望能夠執行參數能放預設的event以外的函式,所以寫了這個等同於執行了toggle(false),就不會受限原本的格式。

從清單中選擇聲音

我們在第一個事件中voiceschanged設定了voice物件並完成畫面的介面,接下來需要透過資料比對語言需求,在更換語言時,也要透過toggle()重新執行播放一次聲音。

function setVoice(){
    message.voice = voices.find(voice=>voice.name===this.value)
    toggle();
}

voicesDropdown.addEventListener('change',setVoice)

修改聲音速度、音調、文字

option中有聲音速度、音調跟文字的選項,這個寫法就跟前幾天在做播放器時一樣,在對應的名字中替換該選項取到的值,並且跟上述一樣需要重新立刻播放。

function setOption(){
    message[this.name] = this.value;
    toggle();
}
options.forEach(option=>option.addEventListener('change',setOption))

References

MDN

  1. SpeechSynthesisUtterance;
  2. SpeechSynthesisVoice
  3. SpeechSynthesis

上一篇
〈Day28〉Countdown Timer
下一篇
〈Day30〉尾聲
系列文
廚藝不精也可以,給自己做一份Javascript小火鍋30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言