This is Speech Synthesis Demo
A Pen by Minoru Hayakawa on CodePen.
<div id="frame"> | |
<p id="message"></p> | |
<div class="region"> | |
<label for="text">Input text</label> | |
<textarea name="text" id="text"></textarea> | |
</div> | |
<div class="region"> | |
<input type="radio" name="language" id="ja" value="ja-JP" checked><label for="ja">Japanese</label> | |
<input type="radio" name="language" id="en" value="en-US"><label for="en">English</label> | |
</div> | |
<div class="region"> | |
<label for="volume">Volume</label> | |
<input type="range" min="0" max="1" step="0.1" name="volume" id="volume" value="1"> | |
</div> | |
<div class="region"> | |
<label for="rate">Rate</label> | |
<input type="range" min="0.1" max="10" step="0.1" name="rate" id="rate" value="1"> | |
</div> | |
<div class="region"> | |
<label for="pitch">Pitch</label> | |
<input type="range" min="0" max="2" step="0.1" name="pitch" id="pitch" value="1"> | |
</div> | |
<div class="region"> | |
<button id="speech">Say it!!</button> | |
</div> | |
</div> |
window.addEventListener('DOMContentLoaded', function(){ | |
var speech = new Speech(); | |
speech.init(); | |
}, null); | |
function Speech(){ | |
this.textValue = null; | |
this.langValue = null; | |
this.volumeValue = null; | |
this.rateValue = null; | |
this.pitchValue = null; | |
this.message = document.getElementById('message'); | |
this.text = document.getElementById("text"); | |
this.btn = document.getElementById("speech"); | |
this.support = 'Speech Synthesis is supported!'; | |
this.unsupported = 'Speech Synthesis is unsupported!'; | |
} | |
Speech.prototype.init = function(){ | |
var self = this; | |
if ('speechSynthesis' in window) { | |
self.message.textContent = self.support; | |
} else { | |
self.message.textContent = self.unsupported | |
self.text.setAttribute('disabled', 'disabled'); | |
self.btn.setAttribute('disabled', 'disabled'); | |
} | |
self.event(); | |
}; | |
Speech.prototype.getTextValue = function(){ | |
return this.textValue = this.text.value; | |
}; | |
Speech.prototype.getLangValue = function(){ | |
return this.langValue = document.querySelector('input[type=radio]:checked').value; | |
}; | |
Speech.prototype.getVolumeValue = function(){ | |
return this.volumeValue = document.getElementById('volume').value; | |
}; | |
Speech.prototype.getRateValue = function(){ | |
return this.rateValue = document.getElementById('rate').value; | |
}; | |
Speech.prototype.getPitchValue = function(){ | |
return this.pitchValue = document.getElementById('pitch').value; | |
}; | |
Speech.prototype.setSpeech = function(){ | |
var msg = new SpeechSynthesisUtterance(); | |
var text = this.getTextValue(); | |
var lang = this.getLangValue(); | |
var volume = this.getVolumeValue(); | |
var rate = this.getRateValue(); | |
var pitch = this.getPitchValue(); | |
msg.volume = volume; | |
msg.rate = rate; | |
msg.pitch = pitch; | |
msg.text = text; | |
msg.lang = lang; | |
msg.onend = function(event) { alert('Finished in ' + event.elapsedTime + ' seconds.'); }; | |
window.speechSynthesis.speak(msg); | |
}; | |
Speech.prototype.event = function(){ | |
var self = this; | |
self.btn.addEventListener('click', function(){ self.setSpeech(); }, null); | |
}; |
This is Speech Synthesis Demo
A Pen by Minoru Hayakawa on CodePen.
html, | |
body, | |
div { | |
margin: 0; | |
padding: 0; | |
} | |
#frame { | |
width: 80%; | |
margin: 0 auto; | |
font-size: 14px; | |
padding: 20px 0; | |
} | |
.region { | |
padding: 20px 0; | |
border-top: 1px solid #999; | |
} | |
.region:nth-of-type(1) { | |
border-top: none; | |
} | |
textarea { | |
border: 1px solid #ccc; | |
width: 100%; | |
min-height: 50px; | |
} | |
#speech { | |
width: 100%; | |
border: none; | |
height: 50px; | |
font-size: 16px; | |
color: #fff; | |
background-color: #DB5034; | |
} | |
#speech[disabled] { | |
background-color: #999; | |
} |