Javascript iOS上的JS语音合成问题

Javascript iOS上的JS语音合成问题,javascript,ios,text-to-speech,speech-synthesis,Javascript,Ios,Text To Speech,Speech Synthesis,我最近实现了一个基本的web应用程序,它依靠Google的TTS URL生成清晰的MP3文件,以便在前端播放 此后,这需要进行额外的安全检查,这意味着我必须更新代码库以使用其他方法 其中一种选择是javascript的语音合成API,即speechsynthesisutrance()和window.speechSynthesis.speak(“…”)。这在我的台式机和笔记本电脑上运行得非常好,但只要我在iOS设备上使用它,音频的传输速度就会大大加快 有人能建议我能做些什么来解决这个问题吗 参见下

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

此后,这需要进行额外的安全检查,这意味着我必须更新代码库以使用其他方法

其中一种选择是javascript的语音合成API,即speechsynthesisutrance()和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);

IOS不允许以编程方式使用新的SpeechSynthesis Api。用户必须显式触发操作。我能理解这个决定。但我不明白,为什么Api在网络应用程序中不起作用,比如播放音频文件。这在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>

函数speech_text(){
var msg=newspeechsynthesisutterance();
/* ... */
}
/*现在你必须为我触发事件*/
$('#trigger_me')。trigger('click');
这仅适用于本机dom元素。如果以编程方式将新标记添加到dom中,如

$('body').append('<a id="trigger_me" onclick="speech_text()"></a>');
$('body')。追加(“”);

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

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

因此,我们可以倾听用户交互并触发一个无声的讲话,这可以让我们以后以编程的方式讲话

这是我的密码

let hasEnabledVoice = false;

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

附加信息:在手动触发一个tts调用后,可以使用javascript触发任意数量的tts调用。为此构建一个包,它可以在safari浏览器上运行,但不能在IOS上运行。它仅适用于Mac OS safari浏览器。你能让它在IOS移动设备上工作吗?我在IOS web视图上进行了测试,它可以工作,但我没有检查Safari。让我检查一下。我在我的iOS safari浏览器上进行了测试,它可以正常工作。您可以使用此URL进行测试。iOS 13.4.1,不为我工作。