Как я могу получить женский голос с помощью Web Speech API в Google Chrome

На веб-странице я хочу, чтобы мои тексты произносил женский голос. Я попытался сделать это, следуя коду. Но все же сейчас говорит мужской голос. Как я могу настроить женский голос, чтобы говорить мои тексты? Может ли кто-нибудь поделиться со мной правильным кодом, который работает в Google Chrome.

var voices = speechSynthesis.getVoices();
var msg = new SpeechSynthesisUtterance("Hello World!");
msg.default=false; 
msg.localservice=true;
msg.lang = "en-GB";
msg.voice = voices[3].name;
speechSynthesis.speak(msg);

person Zubair    schedule 24.10.2016    source источник


Ответы (5)


Код ниже работал для меня. Я надеюсь, что это работает для вас.

var msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();
msg.voice = voices[3];
msg.text = "Hello World";
speechSynthesis.speak(msg);

С 1-й попытки может выдать мужской голос. Но со 2-й попытки (без перепрошивки) выдаст женский голос и попробуй развернуть на фиктивном сервере, там с первого раза заработает как по маслу.

person Teddy Payne    schedule 09.12.2016
comment
stackoverflow.com/questions/45877555/ , Что-то странное мне попалось. - person Nirojan Selvanathan; 25.08.2017

У меня такое бывает, что голос не меняется при первой загрузке страницы.

Я нашел решение, которое работает для меня.
getVoices() должен запускаться, когда документ готов.
Поэтому я добавляю в начало своего js вот так.

   $(document).ready(function() {
        var voices = window.speechSynthesis.getVoices();
    })
person Jamille    schedule 09.03.2018

В Chrome я делаю что-то вроде этого:

<html>
<head>
<script>
    function speak(language, country, preferredNames, text) {
        var resolvePromise;
        var promise = new Promise(r => resolvePromise = r);

        var voices = window.speechSynthesis.getVoices();
        if (voices.length == 0) {
            new Promise(r => {
                window.speechSynthesis.onvoiceschanged = () => { 
                        window.speechSynthesis.onvoiceschanged = null;
                        r(); 
                    };
            })
            .then(() => speak(language, country, preferredNames, text))
            .then(resolvePromise);
        } else {
            var msg = new SpeechSynthesisUtterance(text);
            voices.sort((a, b) => {
                if (language != null) {
                    var matchA = a.lang.indexOf(language + "-") == 0;
                    var matchB = b.lang.indexOf(language + "-") == 0;
                    if (! matchA && ! matchB) return 0;
                    if (! matchA && matchB) return 1;
                    if (! matchB && matchA) return -1;
                }
                if (country != null) {
                    var matchA = a.lang.indexOf("-" + country) == a.lang.length - ("-" + country).length;
                    var matchB = b.lang.indexOf("-" + country) == b.lang.length - ("-" + country).length;
                    if (! matchA && ! matchB) return 0;
                    if (! matchA && matchB) return 1;
                    if (! matchB && matchA) return -1;
                }
                if (preferredNames != null) {
                    var indexA = voices.length;
                    var indexB = voices.length;
                    preferredNames.forEach((e, i) => {
                        if (indexA == voices.length && a.name.match(e) != null) indexA = i; 
                        if (indexB == voices.length && b.name.match(e) != null) indexB = i; 
                    });
                    return indexA - indexB;
                }
                return 0;
            });
            if (voices.length > 0) msg.voice = voices[0];
            if (language != null) {
                msg.lang = language;
                if (country != null) msg.lang += "-" + country;
            }
            msg.onend = resolvePromise;
            window.speechSynthesis.speak(msg);

            // msg.onend not triggered without call to console.log(msg)?
            console.log(msg);
        }

        return promise;
    }

    speak("en", null, [ /Google US English/, /Samantha/, /Fiona/, /Victoria/, /female/i ], "Hello, world.")
    .then(() => speak("en", null, [ /female/i ], "Hello, world."))
    .then(() => speak("en", "US", [ /female/i ], "Hello, world."))
    .then(() => speak("en", "US", null, "Hello, world."))
    .then(() => speak("en", "GB", [ /\Wmale/i ], "Hello, world."));
</script>
</head>
<body>
</body>
</html>
person mab    schedule 30.01.2017

Этот код работал для меня.

  var speakObj = new SpeechSynthesisUtterance();
  speakObj.text = text;
  speakObj.voice = speechSynthesis.getVoices().filter(function(voice) {
    return voice.name == "Google UK English Female"

  })[0];
  window.speechSynthesis.speak(speakObj);
person Abhineet Modi    schedule 05.01.2018

После долгого поиска и устранения неполадок я смог найти решение.

4 человека уже предложили мне несколько решений. Но это не сработало для меня. Но помог найти решение. Спасибо им всем.

Чтобы решить проблему, я сделал две вещи.

  1. Мне пришлось загружать голоса во время события onvoiceschanged следующим образом:

    var voices;    
    window.speechSynthesis.onvoiceschanged = function() {
        voices=window.speechSynthesis.getVoices();
    };
    

Я нашел этот совет по по этой ссылке < /а>.

  1. «Google UK English Female» у меня не работает. Поэтому я использовал «Microsoft Zira Desktop — английский (США)» следующим образом:

    speech.voice = voices.filter(function(voice) { return voice.name == 'Microsoft Zira Desktop - English (United States)'; })[0];
    
person Zubair    schedule 24.06.2018