Update tts/
This commit is contained in:
parent
c366f8f0d3
commit
cf95fea6c3
69
src/snek/static/tts.js
Normal file
69
src/snek/static/tts.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
class SnekSpeaker extends HTMLElement {
|
||||||
|
|
||||||
|
_enabled = false
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.attachShadow({ mode: 'open' });
|
||||||
|
|
||||||
|
// Optionally show something in the DOM
|
||||||
|
this.shadowRoot.innerHTML = `<slot></slot>`;
|
||||||
|
|
||||||
|
this._utterance = new SpeechSynthesisUtterance();
|
||||||
|
this._selectVoice();
|
||||||
|
}
|
||||||
|
toggle() {
|
||||||
|
if (window.speechSynthesis.speaking) {
|
||||||
|
window.speechSynthesis.pause();
|
||||||
|
} else {
|
||||||
|
window.speechSynthesis.resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stop() {
|
||||||
|
window.speechSynthesis.cancel();
|
||||||
|
}
|
||||||
|
disable() {
|
||||||
|
this._enabled = false
|
||||||
|
}
|
||||||
|
enable() {
|
||||||
|
this._enabled = true
|
||||||
|
}
|
||||||
|
set enabled(val) {
|
||||||
|
if (val) {
|
||||||
|
this.enable()
|
||||||
|
} else {
|
||||||
|
this.disable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get enabled() {
|
||||||
|
return this._enabled
|
||||||
|
}
|
||||||
|
_selectVoice() {
|
||||||
|
const updateVoice = () => {
|
||||||
|
const voices = window.speechSynthesis.getVoices();
|
||||||
|
const maleEnglishVoices = voices.filter(voice =>
|
||||||
|
voice.lang.startsWith('en') && voice.name.toLowerCase().includes('male')
|
||||||
|
);
|
||||||
|
if (maleEnglishVoices.length > 0) {
|
||||||
|
this._utterance.voice = maleEnglishVoices[0];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
updateVoice();
|
||||||
|
// Some browsers load voices asynchronously
|
||||||
|
window.speechSynthesis.onvoiceschanged = updateVoice;
|
||||||
|
}
|
||||||
|
|
||||||
|
speak(text) {
|
||||||
|
if(!this._enabled) return
|
||||||
|
|
||||||
|
if (!text) return;
|
||||||
|
|
||||||
|
this._utterance.text = text;
|
||||||
|
window.speechSynthesis.speak(this._utterance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the element
|
||||||
|
customElements.define('snek-speaker', SnekSpeaker);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user