【问题标题】:Speech Synthesis problem with long texts pause mid-speaking长文本的语音合成问题在说​​话中间停顿
【发布时间】:2019-08-27 03:32:28
【问题描述】:

美好的一天。

我在朗读长文本时遇到了语音合成不一致的问题。

我正在尝试用英语和普通话进行文字转语音。当我指定 utterance.lang = 'en-US';我发现我的英文文章一直读到读完。但是,当我使用 utterance.lang = 'zh-CN';我的英文和普通话只能读到30个字。不知道是不是编码有问题还是什么的。

文章:

E.仙人掌

Enterolobium cyclocarpum,俗称guanacaste、caro caro,或 象耳树,是豌豆科开花乔木的一种。 豆科植物原产于美洲热带地区, 墨西哥中部南至巴西北部(罗赖马)和委内瑞拉。这是 以其大比例、宽大的、通常为球形的冠部而闻名, 以及它形状奇特的种荚。这棵树的丰盈, 尤其是在哥斯达黎加瓜纳卡斯特省 它从强烈的阳光中提供了阴凉的缓解,再加上它的 广袤无垠,使其成为广为人知的物种。它是 哥斯达黎加的国树。

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'));
    }
}

【问题讨论】:

  • 您能否分享您正在测试以产生此问题的文章?
  • 当然。我的文章在 php.ini 中。但这是文章“Enterolobium cyclocarpum,俗称guanacaste、caro caro或象耳树,是豆科豆科开花树的一种,原产于美洲热带地区,来自墨西哥中部南部...”我的文章有点太长了。无法在此处粘贴所有内容。我不知道为什么它只能读出 30 个字符。
  • @SerraYara - 您的问题包含 30 个单词,而此评论包含 30 个字符。我假设它是 30 个字是正确的吗?
  • 对不起。实际上是 30 个字。
  • 您使用的是什么浏览器/操作系统?大概是 Safari?

标签: javascript text-to-speech


【解决方案1】:

这是一个known bugworkaround 是每 14 秒发布一次简历。

对于您的代码,这意味着在“说话(话语)”之后添加以下内容:

let r = setInterval(() => {
  console.log(speechSynthesis.speaking);
  if (!speechSynthesis.speaking) {
    clearInterval(r);
  } else {
    speechSynthesis.resume();
  }
}, 14000);

【讨论】:

  • 谢谢!有用。我还有一个小问题。当我将我的语言设置为中文“zn-CH”时,它读得很好,但是当有一年的时候。为什么还是中文?
  • 如果可行,请将其标记为已接受的答案,并为链接为“解决方法”的问题投票。
  • 语音会尝试用自己的语言阅读,所以当它遇到一个数字时,没有什么能阻止它这样做。您可以通过将数字更改为其等效单词来摆弄它,例如从 1 到 1,或今年的“二十九”。
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2014-03-23
  • 2015-07-09
  • 2014-02-09
相关资源
最近更新 更多