Android-Chrome 中的 SpeechSynthesis:无法更改美国英语的英语语音

Fra*_*zer 6 javascript text-to-speech speech-synthesis android-chrome

我正在 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>
Run Code Online (Sandbox Code Playgroud)

还有剧本...

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');});
Run Code Online (Sandbox Code Playgroud)

还有一个 jsbin: https: //jsbin.com/xefukemuga/edit? html,js,output 在 Android Chrome 中运行此文件并点击单词“tomato”。

我到处搜索并尝试了各种修复。如何控制 Android-Chrome 使用哪种语音?

Dou*_*oug 6

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

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

当您播放 SpeechSynthesisUtterance 时,Android 设备上使用的语音将取决于您在 Android 设置中选择的内容。您可以从 javascript 选择要播放的语言(详细信息请参见下文),但您无法控制所使用的区域设置或确切的语音。

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