尝试在iOS Webview应用中使用SpeechSynthesis API

时间:2018-10-11 21:56:34

标签: javascript ios reactjs speech-synthesis

所以我试图创建一个可以执行TTS的应用程序。

我正在Webview应用程序中使用SpeechSynthesis API(React前端,由Cordova编译,尽管我愿意切换到React Native)

我有一个相当标准的实现,可以在包括Safari在内的所有浏览器上使用-声音甚至可以通过Xcode在iOS模拟器中使用。但是,当我尝试在设备上运行它时,即使我与SpeechAPI关联的其余代码(主要是文本突出显示)按预期工作,也没有声音起作用。

        function speechAPI(text, chardivs, speed, volume, version) {
            if (speechSynthesis.paused) {
                speechSynthesis.resume();
                return;
            }
            let msg = new SpeechSynthesisUtterance();
            let voices = window.speechSynthesis.getVoices();
            msg.voiceURI = 'native';
            msg.volume = volume; // 0 to 1
            msg.rate = speed; // 0.1 to 10
            msg.pitch = 1; //0 to 2
            msg.text = text;
            msg.lang = 'zh-CN';
            msg.voice = voices[63];
...

我没有看到任何错误或类似的信息。我缺少一些设置来使该API通过iOS工作吗?我的设备在iOS 11上,如果能提供任何有用的信息。

1 个答案:

答案 0 :(得分:0)

如果我没记错,我知道您在调用SpeechSynthesis.speak()方法时,很难让iOS设备真正讲话。

我不确定WebView,但Safari(该WebView可能基于该Safari)要求在用户操作上至少触发一次SpeechSynthesis.speak()。 例如。

//This is the button a user has to click. after this event has been triggered,
//the speechSynthesis.speak() can be used autonomously as well.
document.getElementById('enable_voice_output').addEventListener('click', primeSpeak);
var speechPrimed = false;
function primeSpeak(){
  if(speechPrimed === false){
    var u = new SpeechSynthesisUtterance("Speech is enabled");
    speechSynthesis.speak(u);
    speechPrimed = true;
  }
}