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