Как SpeechSynthesis возвращает выбранный список языков? - PullRequest
0 голосов
/ 07 февраля 2019

Доброе утро всем,

Я все еще работаю над вопросником для неграмотных людей.Для этого я использую приложение Text to Speech (благодаря @ JO3-W3B-D3V)

Проблема в том, что вопросник будет разработан на нескольких языках, а это значит, что приложение Text to Speech должнотакже поддерживает несколько языков.

SpeechSynthesis.getVoices()

Если я правильно понял, функция выше возвращает список всех объектов, представляющих все доступные голоса на текущем устройстве.Теперь к моим вопросам:

  1. Есть ли способ вернуть выбор этих языков?Например, списки не должны возвращать все 15 языков, доступных на устройстве, а только 4 выбранных?

  2. Есть ли способ добавить больше языков на устройство?Я использую Chrome.Если я правильно понял, Chromes получает языки от Microsoft и Google.Поэтому в Chrome должна отображаться новая языковая опция, если я добавлю новый язык в свою операционную систему (Windows 10).Это предположение правильно?Я спрашиваю, потому что я уже сделал это, и ничего не изменилось, поэтому я могу что-то упустить.

Надеюсь, мои вопросы имеют смысл :)

Хорошего дня!

1 Ответ

0 голосов
/ 07 февраля 2019

Объяснил

Хорошо, поэтому я отвечу на это в двух частях, учитывая тот факт, что вы вроде задали два вопроса, оба из которых относительно просты и, к счастью, просты.

Вопрос первый

Вы спрашивали, как получить _ выбранных языков, которые вы хотели бы поддерживать, ну, это просто, это так же просто, как манипулировать массивом, в моем примере яЯ использовал функцию reduce, довольно простую вещь.

PS Ради некоторой консистенции я написал этот фрагмент в очень стиле, подобном тому, который я написал в другой вопрос , который вы задали в отношении 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);
})();

Вопрос второй

Я не совсем уверен, есть ли «чистый и легкий» способ сделать это, проведя собственное исследование по этому вопросуЯ обнаружил, что выглядит так, как будто это потребует некоторой формы переделок.Один из лучших источников информации, которые я нашел, это этот вопрос .

Более подробно рассмотрев этот вопрос, похоже, что Artyom также предполагает, что не существует простого способа добиться этого, он выглядит , как будто вы можете только добавитьязык путем установки языка в операционной системе, поэтому я склонен верить.

Заключение

Одна возможная идея состоит в том, что вы могли бы , и я подчеркиваю слово может возможно, сделайте это с помощью реализации собственного API, однако Я не могу представить, что это будет надежная или надежная реализация, так как мой вывод основан на исследованиях, предлагаемых длядополнительный язык, который будет включен, пользователь в некоторой степени отвечает за это, так как он выглядит так, как будто ему нужно, чтобы пользователь установил язык _ в своей ОС, чтобы speechSynthesis чтобы использовать _ язык.

Я действительно нахожу немного странным, что кажется, что есть небольшая / нет формальная документация по этому предмету, скорее я просто нашел в основномнеофициальная документация, предложения и предположения.Однако это может быть связано с моим отсутствием расследования, учитывая, что я потратил ~ 15 минут на изучение этого вопроса.

Источники

  1. Ссылка на flaviocopes.com относительно speechSynthesis.
  2. Ссылка на Artyom.js, aбиблиотека для API, связанных с речью.
  3. Ссылка на предыдущий вопрос переполнения стека, аналогичная второй части этого вопроса.
  4. Ссылка настатья среднего размера.
  5. Документация MDN.
  6. Пост в блоге на дереве.

Хотя у меня может не быть ответа, который вы хотите получить на свой второй вопрос, я надеюсь, что весь этот ответ помог в той или иной форме!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...