【问题标题】:JS Speech Synthesis Issue on iOSiOS 上的 JS 语音合成问题
【发布时间】:2015-11-18 13:11:38
【问题描述】:

我最近实现了一个基本的网络应用程序,它依靠 Google 的 TTS URL 生成清晰的 MP3 文件以在前端播放。

此后,这受到了额外的安全检查,这意味着我必须更新代码库以使用替代方法。

其中一个替代方案是 javascript 的语音合成 API,即 SpeechSynthesisUtterance() 和 window.speechSynthesis.speak('...')。这在我的台式机和笔记本电脑上运行得非常好,但是一旦我在我的 iOS 设备上使用它,音频的速度就会显着加快。

谁能建议我可以做些什么来解决这个问题?

示例代码如下:

var msg = new SpeechSynthesisUtterance(); 
    msg.text = item.title;
    msg.voice = "Google UK English Male";
    msg.rate = 0.7;
    msg.onend = function(){
        console.log('message has ended');
        $('.word-img').removeClass('img-isplaying');
    };
    msg.onerror = function(){
        console.log('ERROR WITH SPEECH API');
        $('.word-img').removeClass('img-isplaying');
    };
window.speechSynthesis.speak(msg);

【问题讨论】:

    标签: javascript ios text-to-speech speech-synthesis


    【解决方案1】:

    IOS 不允许以编程方式使用新的 SpeechSynthesis-Api。用户必须显式触发操作。我能理解这个决定。但我不明白,为什么 Api 不能在 webapps 中工作,比如播放音频文件。这在 IOS 的默认 safari 中不起作用,但在 webapps 中起作用。

    这里有一个小技巧:

    <a id="trigger_me" onclick="speech_text()"></a>
    <script>
        function speech_text() {
            var msg = new SpeechSynthesisUtterance();
            /* ... */
        }
        /* and now you must trigger the event for #trigger_me */
        $('#trigger_me').trigger('click');
    </script>
    

    这仅适用于原生 dom 元素。如果您以编程方式将新标签添加到 dom 中,例如...

    $('body').append('<a id="trigger_me" onclick="speech_text()"></a>');
    

    ...该功能不会触发。似乎IOS-Safari在domload之后只为特殊的内部函数注册了一次事件。

    【讨论】:

    • 附加信息:在您手动触发一个 tts 调用后,您可以使用 javascript 触发任意多个。
    【解决方案2】:

    好的。我今天解决了这个问题。问题是 iOS 不会让语音 API 以编程方式运行,除非我们在用户交互下触发了一次。

    所以我们可以聆听用户交互并触发一个无声的语音,让我们稍后以编程方式说话。

    这是我的代码。

    let hasEnabledVoice = false;
    
    document.addEventListener('click', () => {
      if (hasEnabledVoice) {
        return;
      }
      const lecture = new SpeechSynthesisUtterance('hello');
      lecture.volume = 0;
      speechSynthesis.speak(lecture);
      hasEnabledVoice = true;
    });
    

    【讨论】:

    • 为此npmjs.com/package/enable-auto-tts构建一个包
    • 太棒了,这适用于 safari 浏览器,但不适用于 IOS。它仅适用于 Mac OS Safari 浏览器。你能让它在IOS移动设备上运行吗?
    • 我在 iOS 网络视图上进行了测试,它可以工作,但我没有检查过 Safari。让我检查一下。
    • 我在我的 iOS Safari 浏览器上进行了测试,它可以工作。您可以使用此 URL 进行测试。 codepen.io/toxic-johann/pen/JjGrPzg
    • 有些设备可以工作,有些则不能。在 iOS 上不一致。
    猜你喜欢
    • 2015-07-09
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多