Completed Day 23 of 30. Speech Synthesis.
This commit is contained in:
		
							parent
							
								
									e8cb58271f
								
							
						
					
					
						commit
						a2359de282
					
				
							
								
								
									
										76
									
								
								Speech Synthesis [23-30]/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Speech Synthesis [23-30]/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  | <head> | ||||||
|  |   <meta charset="UTF-8"> | ||||||
|  |   <title>Speech Synthesis</title> | ||||||
|  |   <link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'> | ||||||
|  |   <link rel="stylesheet" href="style.css"> | ||||||
|  |   <link rel="icon" href="https://fav.farm/✅" /> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | 
 | ||||||
|  |     <div class="voiceinator"> | ||||||
|  | 
 | ||||||
|  |       <h1>The Voiceinator 5000</h1> | ||||||
|  | 
 | ||||||
|  |       <select name="voice" id="voices"> | ||||||
|  |         <option value="">Select A Voice</option> | ||||||
|  |       </select> | ||||||
|  | 
 | ||||||
|  |       <label for="rate">Rate:</label> | ||||||
|  |       <input name="rate" type="range" min="0" max="3" value="1" step="0.1"> | ||||||
|  | 
 | ||||||
|  |       <label for="pitch">Pitch:</label> | ||||||
|  | 
 | ||||||
|  |       <input name="pitch" type="range" min="0" max="2" step="0.1"> | ||||||
|  |       <textarea name="text">Hello! I love JavaScript 👍</textarea> | ||||||
|  |       <button id="stop">Stop!</button> | ||||||
|  |       <button id="speak">Speak</button> | ||||||
|  | 
 | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | <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; | ||||||
|  | 
 | ||||||
|  |   function populateVoices() { | ||||||
|  |     voices = this.getVoices(); | ||||||
|  |     voicesDropdown.innerHTML = voices | ||||||
|  |       .filter(voice => voice.lang.includes('en')) | ||||||
|  |       .map(voice => `<option value="${voice.name}">${voice.name} (${voice.lang})</option>`) | ||||||
|  |       .join(''); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function setVoice() { | ||||||
|  |     msg.voice = voices.find(voice => voice.name === this.value); | ||||||
|  |     toggle(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function toggle(startOver = true) { | ||||||
|  |     speechSynthesis.cancel(); | ||||||
|  |     if (startOver) { | ||||||
|  |       speechSynthesis.speak(msg); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function setOption() { | ||||||
|  |     console.log(this.name, this.value); | ||||||
|  |     msg[this.name] = this.value; | ||||||
|  |     toggle(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   speechSynthesis.addEventListener('voiceschanged', populateVoices); | ||||||
|  |   voicesDropdown.addEventListener('change', setVoice); | ||||||
|  |   options.forEach(option => option.addEventListener('change', setOption)); | ||||||
|  |   speakButton.addEventListener('click', toggle); | ||||||
|  |   stopButton.addEventListener('click', () => toggle(false)); | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										90
									
								
								Speech Synthesis [23-30]/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								Speech Synthesis [23-30]/style.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | html { | ||||||
|  |   font-size: 10px; | ||||||
|  |   box-sizing: border-box; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | *, *:before, *:after { | ||||||
|  |   box-sizing: inherit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | body { | ||||||
|  |   margin: 0; | ||||||
|  |   padding: 0; | ||||||
|  |   font-family: sans-serif; | ||||||
|  |   background-color: #3BC1AC; | ||||||
|  |   display: flex; | ||||||
|  |   min-height: 100vh; | ||||||
|  |   align-items: center; | ||||||
|  | 
 | ||||||
|  |   background-image: | ||||||
|  |   radial-gradient(circle at 100% 150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), | ||||||
|  |   radial-gradient(circle at 0    150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), | ||||||
|  |   radial-gradient(circle at 50%  100%, #42D2BB 10%, #3BC1AC 11%, #3BC1AC 23%, #42D2BB 24%, #42D2BB 30%, #3BC1AC 31%, #3BC1AC 43%, #42D2BB 44%, #42D2BB 50%, #3BC1AC 51%, #3BC1AC 63%, #42D2BB 64%, #42D2BB 71%, transparent 71%, transparent), | ||||||
|  |   radial-gradient(circle at 100% 50%, #42D2BB 5%, #3BC1AC 6%, #3BC1AC 15%, #42D2BB 16%, #42D2BB 20%, #3BC1AC 21%, #3BC1AC 30%, #42D2BB 31%, #42D2BB 35%, #3BC1AC 36%, #3BC1AC 45%, #42D2BB 46%, #42D2BB 49%, transparent 50%, transparent), | ||||||
|  |   radial-gradient(circle at 0    50%, #42D2BB 5%, #3BC1AC 6%, #3BC1AC 15%, #42D2BB 16%, #42D2BB 20%, #3BC1AC 21%, #3BC1AC 30%, #42D2BB 31%, #42D2BB 35%, #3BC1AC 36%, #3BC1AC 45%, #42D2BB 46%, #42D2BB 49%, transparent 50%, transparent); | ||||||
|  |   background-size:100px 50px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .voiceinator { | ||||||
|  |   padding: 2rem; | ||||||
|  |   width: 50rem; | ||||||
|  |   margin: 0 auto; | ||||||
|  |   border-radius: 1rem; | ||||||
|  |   position: relative; | ||||||
|  |   background: white; | ||||||
|  |   overflow: hidden; | ||||||
|  |   z-index: 1; | ||||||
|  |   box-shadow: 0 0 5px 5px rgba(0,0,0,0.1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | h1 { | ||||||
|  |   width: calc(100% + 4rem); | ||||||
|  |   margin: -2rem 0 2rem -2rem; | ||||||
|  |   padding: .5rem; | ||||||
|  |   background: #ffc600; | ||||||
|  |   border-bottom: 5px solid #F3C010; | ||||||
|  |   text-align: center; | ||||||
|  |   font-size: 5rem; | ||||||
|  |   font-weight: 100; | ||||||
|  |   font-family: 'Pacifico', cursive; | ||||||
|  |   text-shadow: 3px 3px 0 #F3C010; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .voiceinator input, | ||||||
|  | .voiceinator button, | ||||||
|  | .voiceinator select, | ||||||
|  | .voiceinator textarea { | ||||||
|  |   width: 100%; | ||||||
|  |   display: block; | ||||||
|  |   margin: 10px 0; | ||||||
|  |   padding: 10px; | ||||||
|  |   border: 0; | ||||||
|  |   font-size: 2rem; | ||||||
|  |   background: #F7F7F7; | ||||||
|  |   outline: 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | textarea { | ||||||
|  |   height: 20rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .voiceinator button { | ||||||
|  |   background: #ffc600; | ||||||
|  |   border: 0; | ||||||
|  |   width: 49%; | ||||||
|  |   float: left; | ||||||
|  |   font-family: 'Pacifico', cursive; | ||||||
|  |   margin-bottom: 0; | ||||||
|  |   font-size: 2rem; | ||||||
|  |   border-bottom: 5px solid #F3C010; | ||||||
|  |   cursor: pointer; | ||||||
|  |   position: relative; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .voiceinator button:active { | ||||||
|  |   top: 2px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .voiceinator button:nth-of-type(1) { | ||||||
|  |   margin-right: 2%; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user