大家早上好,
我仍在为文盲制作问卷。为此,我正在使用“文字转语音”应用程序(感谢@ JO3-W3B-D3V)
问题在于问卷将以多种语言开发,这意味着从文本到语音的应用程序也必须支持多种语言。
SpeechSynthesis.getVoices()
如果我理解正确,上面的函数将返回一个代表所有对象的列表,这些对象代表当前设备上的所有可用声音。现在我的问题:
是否可以返回这些语言的选择?例如,列表不应该返回设备上可用的全部15种语言,而只能返回4种选择的语言?
是否可以向设备添加更多语言?我正在使用Chrome。如果我理解正确,Chrome就会从Microsoft和Google获得语言。因此,如果我在操作系统(Windows 10)中添加了新语言,则Chrome应该显示新的语言选项。那个假设正确吗?我问是因为我已经做过了,什么也没改变,所以我可能会遗漏一些东西。
希望我的问题有道理:)
祝您有美好的一天!
答案 0 :(得分:1)
好吧,考虑到您
您已经问过如何获取想要支持的_
种选择的语言,这很简单,就像操作数组一样容易,在我的示例中,我使用了reduce
功能,相当简单的东西。
PS 为了某种形式的一致性,我以一种非常类似于{{3}的方式}您询问的speechSynthesis
。
正如代码注释中所述,我以没有重复条目的方式编写了此代码段,即在下面的代码段中,您最终得到的列表仅包含一个支持英语的实体。换句话说,您将不会同时拥有en-GB
和en-US
,当然您可以更改此设置,我只是假定您想要这种功能,当然,这完全取决于您和您的要求。
// IIFE for the sake of it.
(function() {
"use strict";
// This is a simple list of languages that you wish to support.
var supportedLanguages = ['en', 'de', 'es', 'fr'];
var languages = [];
// This is essentially similar to jQuery's $.ready.
var ready = function(callback) {
var d = document,
s = d.readyState;
// DOMContentLoaded was fired
if (s == "complete" || s == "loaded" || s == "interactive") {
callback();
} else {
if (d.addEventListener) {
d.addEventListener("DOMContentLoaded", callback, false);
} else {
d.attachEvent("onDOMContentLoaded", callback);
}
}
};
// This is just a simple function to process whether or not you'd like to
// push a voice onto the array or not.
var shouldPush = function(array, object) {
var language = object.lang || '';
var snipped = language.substring(0, 2);
// Generate a list of all of the known languages.
var languageList = array.map(function(object) {
return object.lang;
});
// Create a list of short hand language names.
var snippedList = languageList.map(function(language) {
return language.substring(0, 2);
});
// Save having a bloated if statement, personally I find this
// more readable.
//
// Only push relevant ones, saves having any duplicated entities, i.e.
// this will not allow for both en-US & en-GB to be among the list,
// this can be altered, this is merely based on an assumption that you
// wouldn't want both en-US & en-GB, etc.
var isToPush = !snippedList.includes(snipped) &&
!languageList.includes(language) &&
supportedLanguages.includes(snipped);
// If true, push to array.
if (isToPush) {
array.push(object);
}
// Then of course return the array object.
return array;
};
// This is essentially the list of voices that you've picked to support.
var getSelectedLanguages = function() {
languages = speechSynthesis.getVoices().reduce(shouldPush, []);
};
// A starting point for this snippet.
var start = function() {
speechSynthesis.onvoiceschanged = function() {
getSelectedLanguages();
console.log(languages);
};
};
// Run the code when ready.
ready(start);
})();
我不确定是否有一种“干净便捷”的方法来进行此操作,对这件事进行了自己的研究后发现,看起来是需要某种形式的修补。我发现的更好信息来源之一是other question。
进一步研究了这个问题,看起来this question也暗示没有简单的方法可以实现,看起来,就像您只能通过将语言安装到操作系统,所以我深信不疑。
一个可能的想法是您 可以 ,我强调可以这个词可以通过实施您自己的API,但是,我无法想象这将是可靠或可靠的实现,因为我的结论是根据研究结果得出的,目的是为了使用其他语言被包括在内,用户对此负有一定责任,因为它看起来就像它需要用户在其操作系统上安装_
语言以便{{ 1}}来使用speechSynthesis
语言。
实际上,我发现关于该主题的正式文档很少/没有正式文档,这有点奇怪,而我只是发现了大部分非正式文档,建议和假设。但是,这可能是由于我缺乏调查而引起的,请记住,我最多只花了15分钟的时间来研究此问题。
Artyom
speechSynthesis
. 尽管我可能没有第二个问题所需的答案,但我希望整个答案对您有所帮助! :)