SpeechSynthesis如何返回选择的语言列表?

时间:2019-02-07 09:10:08

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

大家早上好,

我仍在为文盲制作问卷。为此,我正在使用“文字转语音”应用程序(感谢@ JO3-W3B-D3V)

问题在于问卷将以多种语言开发,这意味着从文本到语音的应用程序也必须支持多种语言。

SpeechSynthesis.getVoices()

如果我理解正确,上面的函数将返回一个代表所有对象的列表,这些对象代表当前设备上的所有可用声音。现在我的问题:

  1. 是否可以返回这些语言的选择?例如,列表不应该返回设备上可用的全部15种语言,而只能返回4种选择的语言?

  2. 是否可以向设备添加更多语言?我正在使用Chrome。如果我理解正确,Chrome就会从Microsoft和Google获得语言。因此,如果我在操作系统(Windows 10)中添加了新语言,则Chrome应该显示新的语言选项。那个假设正确吗?我问是因为我已经做过了,什么也没改变,所以我可能会遗漏一些东西。

希望我的问题有道理:)

祝您有美好的一天!

1 个答案:

答案 0 :(得分:1)

解释

好吧,考虑到您 kinda 问了两个问题,这两个部分相对来说都是相对简单明了的。

问题一

您已经问过如何获取想要支持的_种选择的语言,这很简单,就像操作数组一样容易,在我的示例中,我使用了reduce功能,相当简单的东西。

PS 为了某种形式的一致性,我以一种非常类似于{{3}的方式}您询问的speechSynthesis

假设

正如代码注释中所述,我以没有重复条目的方式编写了此代码段,即在下面的代码段中,您最终得到的列表仅包含一个支持英语的实体。换句话说,您将不会同时拥有en-GBen-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分钟的时间来研究此问题。

来源

  1. Artyom
  2. A link to flaviocopes.com regarding speechSynthesis.
  3. A link to Artyom.js, a library for speech related APIs.
  4. A link to a previous stack overflow question similar to the second part of this question.
  5. A link to a medium article.
  6. MDN documentation.

尽管我可能没有第二个问题所需的答案,但我希望整个答案对您有所帮助! :)