Reputation: 3161
I am trying to get the female voice accept is "US English" from the Web Speech API.
Below is my code:
var synth = window.speechSynthesis;
var voiceOptioins = synth.getVoices();
var voiceChoice = voiceOptioins[5];
var utterThis = new SpeechSynthesisUtterance(textToSpeech);
utterThis.voice = voiceChoice;
synth.speak(utterThis);
With this code, currently a male voice comes out with super bass. I have tried to change the index in voiceOptioins[<index>]
: tried with 0, 5, 10. With all of this indices, only the same male voice comes out.
How do I select a specific voice?
Upvotes: 1
Views: 1677
Reputation: 11
try this code for specific voice
const synth = window.speechSynthesis;
const inputForm = document.querySelector("form");
const inputTxt = document.querySelector(".txt");
const voiceSelect = document.querySelector("select");
const pitch = document.querySelector("#pitch");
const pitchValue = document.querySelector(".pitch-value");
const rate = document.querySelector("#rate");
const rateValue = document.querySelector(".rate-value");
let voices = [];
function populateVoiceList() {
voices = synth.getVoices().sort(function (a, b) {
const aname = a.name.toUpperCase();
const bname = b.name.toUpperCase();
// console.log(aname);
// console.log(bname);
// console.log(a)
if (aname < bname) {
return -1;
} else if (aname == bname) {
return 0;
} else {
return +1;
}
});
const selectedIndex =
voiceSelect.selectedIndex < 0 ? 0 : voiceSelect.selectedIndex;
voiceSelect.innerHTML = "";
for (let i = 0; i < voices.length; i++) {
console.log(voices.length);
console.log(voices);
if (i == 6) {
const option = document.createElement("option");
console.log(voices[i])
option.textContent = `${voices[i].name} (${voices[i].lang})`;
// if (voices[0].default) {
// option.textContent += `${voices[0].name} (${voices[0].lang})`;
// }
option.setAttribute("data-lang", voices[6].lang);
option.setAttribute("data-name", voices[6].name);
voiceSelect.appendChild(option);
}
voiceSelect.selectedIndex = selectedIndex;
}
}
populateVoiceList();
if (speechSynthesis.onvoiceschanged !== undefined) {
speechSynthesis.onvoiceschanged = populateVoiceList;
}
function speak() {
if (synth.speaking) {
console.error("speechSynthesis.speaking");
return;
}
if (inputTxt.value !== "") {
const utterThis = new SpeechSynthesisUtterance(inputTxt.value);
utterThis.onend = function (event) {
console.log("SpeechSynthesisUtterance.onend");
};
utterThis.onerror = function (event) {
console.error("SpeechSynthesisUtterance.onerror");
};
const selectedOption =
voiceSelect.selectedOptions[0].getAttribute("data-name");
for (let i = 0; i < voices.length; i++) {
if (voices[i].name === selectedOption) {
utterThis.voice = voices[i];
break;
}
}
utterThis.pitch = pitch.value;
utterThis.rate = rate.value;
synth.speak(utterThis);
}
}
inputForm.onsubmit = function (event) {
event.preventDefault();
speak();
inputTxt.blur();
};
pitch.onchange = function () {
pitchValue.textContent = pitch.value;
};
rate.onchange = function () {
rateValue.textContent = rate.value;
};
voiceSelect.onchange = function () {
speak();
};
Upvotes: 1