1+ let speech = new SpeechSynthesisUtterance ( ) ;
2+ speech . lang = "en" ;
3+
4+ let voices = [ ] ;
5+ window . speechSynthesis . onvoiceschanged = ( ) => {
6+ voices = window . speechSynthesis . getVoices ( ) ;
7+ speech . voice = voices [ 0 ] ;
8+ let voiceSelect = document . querySelector ( "#voices" ) ;
9+ voices . forEach ( ( voice , i ) => ( voiceSelect . options [ i ] = new Option ( voice . name , i ) ) ) ;
10+ } ;
11+
12+ document . querySelector ( "#rate" ) . addEventListener ( "input" , ( ) => {
13+ const rate = document . querySelector ( "#rate" ) . value ;
14+ speech . rate = rate ;
15+ document . querySelector ( "#rate-label" ) . innerHTML = rate ;
16+ } ) ;
17+
18+ document . querySelector ( "#volume" ) . addEventListener ( "input" , ( ) => {
19+ const volume = document . querySelector ( "#volume" ) . value ;
20+ speech . volume = volume ;
21+ document . querySelector ( "#volume-label" ) . innerHTML = volume ;
22+ } ) ;
23+
24+ document . querySelector ( "#pitch" ) . addEventListener ( "input" , ( ) => {
25+ const pitch = document . querySelector ( "#pitch" ) . value ;
26+ speech . pitch = pitch ;
27+ document . querySelector ( "#pitch-label" ) . innerHTML = pitch ;
28+ } ) ;
29+
30+ document . querySelector ( "#voices" ) . addEventListener ( "change" , ( ) => {
31+ speech . voice = voices [ document . querySelector ( "#voices" ) . value ] ;
32+ } ) ;
33+
34+ document . querySelector ( "#start" ) . addEventListener ( "click" , ( ) => {
35+ speech . text = document . querySelector ( "textarea" ) . value ;
36+ window . speechSynthesis . speak ( speech ) ;
37+ } ) ;
38+
39+ document . querySelector ( "#pause" ) . addEventListener ( "click" , ( ) => {
40+ window . speechSynthesis . pause ( ) ;
41+ } ) ;
42+
43+ document . querySelector ( "#resume" ) . addEventListener ( "click" , ( ) => {
44+ window . speechSynthesis . resume ( ) ;
45+ } ) ;
46+
47+ document . querySelector ( "#cancel" ) . addEventListener ( "click" , ( ) => {
48+ window . speechSynthesis . cancel ( ) ;
49+ } ) ;
0 commit comments