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