javascript - Android-Chrome 中的 SpeechSynthesis:无法从美国英语更改英语语音
问题描述
我在 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 中运行它,然后点击“tomato”这个词。
我到处搜索并尝试了各种修复。您如何控制 Android-Chrome 使用的语音?
解决方案
在 Android 版本 5.0.2 上解决此问题的唯一方法是更改 Android 设置中的默认语音,然后重新启动设备。这将让您使用您想要的语音,但其他英语语音将不可用。这里有一些更详细的信息:
SpeechSynthesis.getVoices() 将返回几个英语选项(美国、澳大利亚、尼日利亚、印度和英国),但一次只有一个可用。您可以通过转到设置应用程序,然后控制-> 语言和输入-> 文本到语音选项来选择哪一个。选择 Google Text-to-speech Engine 旁边的齿轮图标,然后在 Language 下,您可以更新您想要使用的确切语言环境。如果您选择“安装语音数据”,您甚至可以从某些语言环境的不同语音样本中进行选择。更改此设置后需要重启设备才能生效。
播放 SpeechSynthesisUtterance 时在 Android 设备上使用的语音取决于您在 Android 设置中选择的内容。您可以从 javascript 中选择要播放的语言(请参阅下文了解详细信息),但您无法控制语言环境或使用的确切语音。
此问题出现在 Chrome 和 Firefox 上,因此很可能是 Android 平台的 SpeechSynthesis API 实现存在问题。浏览器更新不太可能解决此问题,但不同版本的 Android 可能会。(我的测试设备是 Android 5.0.2,所以如果在以后的更新中解决了这个问题,请告诉我)。
推荐阅读
- html - 视频容器响应能力
- typescript - @apache-arrow/ts 无法编译
- python - 当起始图像没有变化时,pyplot 没有动画
- android - AOSP Android.bp 用于预构建的 apk-s
- javascript - 如何在 ExtJS 中建模多对一关系?
- r - 使用复选框覆盖 selectInput 值
- applescript - 如何使用苹果脚本从剪贴板中删除最后一行以及第一个和最后一个引号?
- c - 在 c 中动态更改定义宏
- c - c中整数在内存中的位置
- swift - `无法将类型“()”的返回表达式转换为返回类型“非托管”
?'` - 但文档说 NULL 是允许的?