javascript - iOS 上的 JS 语音合成问题

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

我最近实现了一个基本的网络应用程序,该应用程序依赖 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);

最佳答案

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>

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

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

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

关于javascript - iOS 上的 JS 语音合成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193704/

相关文章:

ios - 导航栏标题不出现

ios - 仅在从 API 接收到数据时显示 View

text-to-speech - 为文本到语音的标准文本减慢 Twilio 的 TwiML “Say” 命令

java - 如何在每次播放tts时将音频文件另存为新文件?

javascript - 删除动态添加到 ng-repeat(angularjs) 的值

javascript - 迭代 Angular 4 Firebase 数据库中的对象数组

javascript - 如何在页面中注入(inject)的函数表达式中使用变量?

javascript - 如何延迟执行javascript函数

ios - 在 iOS 中滑动以显示后,试图使表格单元格返回其原始状态

audio - 如何将 linear16 文本转语音转换为音频文件