【问题标题】:SpeechSynthesis in Android-Chrome: cannot change English voice from US EnglishAndroid-Chrome 中的 SpeechSynthesis:无法从美国英语更改英语语音
【发布时间】:2019-03-29 05:27:35
【问题描述】:

我在 Android-Chrome 上使用语音合成 API。问题是尽管有 4 种英语语音可用,但无论代码指定什么,浏览器始终使用美国英语。我可以使用其他语言,例如法语,而不是其他英语语音,例如 en-AU、GB 或 IN。

此代码从 getVoices 数组中过滤英国英语语音对象,并使用第一个来说出单词“tomato”。问题是这个词总是发音为“to-may-lo”而不是“to-mar-to”,这意味着我的文字没有按应有的押韵。

显示使用的语音对象(在我尝试过的手机上)是 GB 的。

html...

<!DOCTYPE html>
<html lang="en-GB">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Let's not call the whole thing off</title>
        <script src="tomato.js" defer></script>
    </head>
    <body>
        <div id="tomato" lang="en-GB">Tomato</div>
        <div id="platform"></div>
    </body>
</html>

还有脚本...

var platform = document.getElementById("platform");
var tomato = document.getElementById("tomato");

var voices = [];
var voicesGB = [];
voices = speechSynthesis.getVoices();
speechSynthesis.onvoiceschanged = function() {
    voices = speechSynthesis.getVoices();
    voicesGB = voices.filter(voice => /en(-|_)GB/.test(voice.lang));
};

function speak(word) {
    var msg = new SpeechSynthesisUtterance();
    msg.default = false;
    msg.text = word;
    msg.voice = voicesGB[0];
    msg.lang = voicesGB[0].lang;
    window.speechSynthesis.speak(msg);
    for (var p in msg.voice) {
        platform.innerHTML += p + ': ' + msg.voice[p] + '<br>\n';
    }
}

tomato.addEventListener("click",() => {speak('tomato');});

还有一个 jsbin:https://jsbin.com/xefukemuga/edit?html,js,output 在 Android Chrome 中运行它并点按“番茄”一词。

我已经到处搜索并尝试了各种修复方法。您如何控制 Android-Chrome 使用的语音?

【问题讨论】:

  • 你修好了吗?我遇到了类似的问题并找到了解决方法,请在此处查看我的答案:stackoverflow.com/questions/56728654/…
  • 好吧,我在“_”上看到了您的代码过滤器,所以也许这不是问题,除非 voicesGB[0].long 仍然有破折号。
  • @royappa 破折号或下划线的代码过滤器:/en(-|_)GB/
  • 我看到了,但我认为 msg.lang 中的最终结果会与平台存储的内容相匹配,但如果不是,也许您已将 '-' 替换为 '_'?还是您已经通过其他方式解决了这个问题?我仍然对这个问题感兴趣,因为平台不遵循明确的标准是没有意义的。
  • @royappa 不,问题仍未解决。

标签: javascript text-to-speech speech-synthesis android-chrome


【解决方案1】:

在 Android 版本 5.0.2 上解决此问题的唯一方法是更改​​ Android 设置中的默认语音,然后重新启动设备。这将让您使用您想要的语音,但其他英语语音将不可用。 Here 更详细:

SpeechSynthesis.getVoices() 将返回几个英语选项 (美国、澳大利亚、尼日利亚、印度和英国)但 一次只有一个可用。你可以去选择哪一个 设置应用程序,然后控制->语言和输入->文本到语音 选项。选择 Google Text-to-speech Engine 旁边的齿轮图标, 然后在语言下,您可以更新您要使用的确切语言环境。 如果您选择“安装语音数据”,您甚至可以从样本中进行选择 某些地区的不同声音。您需要重启设备 更改此设置后使其生效。

在 Android 设备上播放时使用的声音 SpeechSynthesisUtterance 将取决于您在 安卓设置。您可以选择要播放的语言 javascript(详见下文),但您无法控制 使用的语言环境或准确的语音。

这个问题出现在 Chrome 和 Firefox 上,所以很可能是个问题 使用 Android 平台的 SpeechSynthesis API 实现。 浏览器更新不太可能解决此问题,但不同 Android 版本可能。 (我的测试设备是 Android 5.0.2,所以如果 这将在未来的更新中修复,请告诉我)。

【讨论】:

  • 谢谢,是的,我是在手机上完成的,虽然它现在使用 en-GB 语音,但我现在当然不能使用美国、印度或澳大利亚(或其他)语音!此外,我已经意识到这会影响任何具有超过 1 个语音的语言,例如西班牙语有 es-ES 和 es-US,但只使用 es-US 语音。我已经尝试过您链接页面中的提示,以设置话语的 lang 属性,但这不起作用。感谢您的回复,祝您好运解决您的 Mac 问题。
  • 是的,它不是一个“修复”,而是获得你想要的单个声音的解决方法。 Android 刚刚被淘汰,您使用哪种 tts 引擎似乎并不重要(我尝试过默认的 google 引擎、三星和 Vocalizer TTS)。如果更高版本的 android 已修复此问题,我会很感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多