SpeechSynthesis API
: text to speech 기능 구현 시 활용 API
https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis
SpeechSynthesis.getVoices()
:현재 디바이스에서 지원하는 voice 리스트를 반환
SpeechSynthesis.cancel()
: 모든 utterence queue를 제거하고, 말하고 있는게 있으면 Stop
speechSyntheis.addEventListener('voiceschanged', function)
: SpeechSynthesisVoice object 리스트가 .getVoices() method의 변경에 의해 반환되었을 때 이벤트 발생
: onvoiceschanged property로도 가능
<script>
const msg = 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');
msg.text = document.querySelector('[name = text]').value;
console.log(msg);
function voicePlay() {
voices = this.getVoices();
voicesDropdown.innerHTML = voices
.map((voice) => {
return `<option name=${voice.name}> ${voice.name} (${voice.lang})</option>`;
})
.join('');
}
function voiceSet() {
//this.value voicePlay 합수에서 voice.name과 voice.lang을 조합시켜 만든 값이므로 그대로 할당하면 X
msg.voice = voices.find((voice) => this.value.includes(voice.name));
toggle();
}
// 동일 함수를 통해, 재생과 정지를 동시에 구현 (Boolean 변수가 스위치 역할)
function toggle(startOver = true) {
speechSynthesis.cancel();
if (startOver) {
speechSynthesis.speak(msg);
}
}
function setOption() {
msg[this.name] = this.value;
toggle();
}
speechSynthesis.addEventListener('voiceschanged', voicePlay);
voicesDropdown.addEventListener('change', voiceSet);
options.forEach((option) => option.addEventListener('change', setOption));
speakButton.addEventListener('click', toggle);
stopButton.addEventListener('click', () => toggle(false));
</script>
function voiceSet() {
msg.voice = voices.find((voice) => this.value.includes(voice.name));
}
msg[this.name] = this.value;