美好的一天。
我在说长文本时语音合成的不一致方面遇到麻烦。
我正在尝试使用英语和普通话进行文本转语音。当我指定utterance.lang ='en-US';我发现我的英文文章读完为止。但是,当我使用utterance.lang ='zh-CN';时,我的英文和中文文字只能朗读到30个单词。我不知道编码是否有问题。
文章:
E。独角果
肠果肠杆菌,俗称瓜纳卡斯特,caro caro或 象耳树,是豌豆科中的一种开花树。 豆科,原产于美洲的热带地区,从 墨西哥中部以南至巴西北部(Roraima)和委内瑞拉。它是 以比例大,膨胀且通常为球形的表冠而闻名, 以及形状奇特的种子荚。这棵树很多 特别是在哥斯达黎加瓜纳卡斯特省,因 它在强烈的阳光下提供的阴凉处以及其 庞然大物,使其成为一个被广泛认可的物种。它是 哥斯达黎加的国家树。
onload = function() {
if ('speechSynthesis' in window) with(speechSynthesis) {
var playEle = document.querySelector('#play');
var pauseEle = document.querySelector('#pause');
var stopEle = document.querySelector('#stop');
var flag = false;
playEle.addEventListener('click', onClickPlay);
pauseEle.addEventListener('click', onClickPause);
stopEle.addEventListener('click', onClickStop);
function onClickPlay() {
if(!flag){
flag = true;
utterance = new SpeechSynthesisUtterance(document.querySelector('article').textContent);
utterance.lang = 'zh-CN';
utterance.onend = function(){
flag = false; playEle.className = pauseEle.className = ''; stopEle.className = 'stopped';
};
playEle.className = 'played';
stopEle.className = '';
speak(utterance);
}
if (paused) { /* unpause/resume narration */
playEle.className = 'played';
pauseEle.className = '';
resume();
}
}
function onClickPause() {
if(speaking && !paused){ /* pause narration */
pauseEle.className = 'paused';
playEle.className = '';
pause();
}
}
function onClickStop() {
if(speaking){ /* stop narration */
/* for safari */
stopEle.className = 'stopped';
playEle.className = pauseEle.className = '';
flag = false;
cancel();
}
}
}
else { /* speech synthesis not supported */
msg = document.createElement('h5');
msg.textContent = "Detected no support for Speech Synthesis";
msg.style.textAlign = 'center';
msg.style.backgroundColor = 'red';
msg.style.color = 'white';
msg.style.marginTop = msg.style.marginBottom = 0;
document.body.insertBefore(msg, document.querySelector('div'));
}
}
答案 0 :(得分:1)
这是known bug。 workaround每14秒发布一份简历。
对于您的代码,这意味着在“讲话(说话)”之后添加以下内容:
let r = setInterval(() => {
console.log(speechSynthesis.speaking);
if (!speechSynthesis.speaking) {
clearInterval(r);
} else {
speechSynthesis.resume();
}
}, 14000);