[.. Как ..] добавить кнопку паузы, связав кнопку с synth.pause (speakText);
Дешевый ответ будет иметь вызов кнопки speechSynthesis.pause()
(который не принимает аргументов) - потому что synth
является просто копией глобального свойства window.speechSynthesis
.
Лучшим решением является создание контроллера, который предоставляет интерфейс методов и свойств внешним вызывающим и инкапсулирует его собственные внутренние операции.
Вы затронули проблему здесь:
Я не могу сделать speakText доступным для функции pause, так как я создаю свой объект speakText в своей функции speak ().
, что означает, что существует проблема проектирования структуры кода.Но есть и другая проблема: синтезатор речи не имеет состояний «воспроизведение», «пауза» и «остановка».Он имеет два взаимоисключающих состояния «play» и «pause» и полностью независимое условие «queue empty».
Я не предлагаю исправлять опубликованный код - хотя я, конечно, пытался.Вот что я в итоге выяснил, что происходит - это экспериментальный код, но, надеюсь, подкаст поможет!
"use strict";
const tr = {
queue: null,
pause: null,
play: null,
cancel: null,
defaultRate: 1.1,
defaultPitch: 1,
// voice selection to do;
};
function createTextReader( tr) {
let synth = window.speechSynthesis; // abbreviation
let Utter = SpeechSynthesisUtterance; // abbreviation
// queue
tr.queue = (text, rate, pitch, voiceIndex) => {
let utter = new Utter();
utter.text = text;
utter.rate = rate || tr.defaultRate || 1;
utter.pitch = pitch || tr.defaultPitch || 1;
// voice selection to do
// if( voiceParam) ....
synth.speak( utter);
};
tr.pause = () => synth.pause();
tr.play = () => synth.resume();
tr.cancel = () => synth.cancel();
}
window.addEventListener( "DOMContentLoaded", function (e) {
createTextReader( tr)}, false);
window.addEventListener("unload", e=>tr.cancel(), false);
<textarea cols=40 rows=4 id="queueText">
Press "queue text" to add text area content to the text reader. Press it multiple times to add text more than once.
Press "pause" to pause reading.
Press "play" to start or resume reading queued text from the speech synthesizer's fifo queue. Play mode is in effect at startup - but you could pause the reader before queuing text.
Press "cancel" to stop reading and empty the queue. It does not change pause versus play mode. If the reader is paused when cancel is clicked, it remains so afterwards.
This voice is the default voice in this browser, and may be different in another. More code is needed for voice selection. If you visit MDN's speech synthesis example on git hub, view page source and click on the link to "script.js" you can see how they do it.
Oh, and don't forget to cancel speech synthesis on window unload.
Thanks for listening!
</textarea><br>
<button type="button" onclick="tr.queue(queueText.value)">queue text</button>
<p>
<button type="button" onclick="tr.pause()">pause</button>
<button type="button" onclick="tr.play()">play</button>
<button type="button" onclick="tr.cancel()">cancel</button>
<p>
Ссылка на упомянутую страницу MDN: https://mdn.github.io/web-speech-api/speak-easy-synthesis/