Синтез речи больше не читает китайский текст

Следующий код хорошо работал в течение последних 2 месяцев, пока вчера он не перестал читать китайские тексты, но читает английские тексты, несмотря на то, что язык zh-CN. Судя по всему, теперь он читает только по-английски. Поискав в Интернете и сделав множество изменений и попыток около дня (загрузка и добавление голосов, добавление расширения Chrome «Chrome Speak» и т. д.), я так и не смог решить проблему. (Chrome Speak читает нормально, но я не мог понять, как отправить ему текст через javaScript)

var repete = 0;
function simpleSpeak(text, callback) {
    var u = new SpeechSynthesisUtterance();
    u.text = text;
    u.lang = 'zh-CN';
    u.rate = (repete % 2 == 0) ? 1 : 0.8;
    repete++;

    u.onerror = function (e) {
        alert('error!')
        if (callback) {
            callback(e);
    }
    window.speechSynthesis.speak(u);
};

Не могли бы вы мне помочь? ОС: Windows Vista, версия Chrome 48.0.2564.97 м


person molla conan    schedule 30.01.2016    source источник
comment
Он будет работать на Localhost, а не в Интернете.   -  person molla conan    schedule 30.01.2016


Ответы (2)


Похоже, это связано с API-интерфейсом веб-речи - свойство синтеза речи .lang не работает, где 'pt-BR' (португальский) больше не работает.

Ответ там ссылается на Chromium проблема 582455: SpeechSynthesisUtterance не меняет язык и предлагает решение прямой установки свойства .voice.

person Kevin Hakanson    schedule 30.01.2016
comment
Спасибо. Я также продолжал искать решение, но не нашел его. - person molla conan; 01.02.2016

Я думаю, что решил проблему, надеюсь, она решит и вашу. В следующем коде 17 соответствует «zh-CN», а «pt-BR» — 15.

var voiceSelected;
function loadVoices() {
    var voices = speechSynthesis.getVoices();
    voices.forEach(function (voice, i) {
        if (i == 17) voiceSelected = voice.name;
    });
}

loadVoices();
window.speechSynthesis.onvoiceschanged = function (e) {
    loadVoices();
};

function speakTTS(text) {
    var laf = new SpeechSynthesisUtterance();
    laf.text = text;
    laf.volume = 1;
    laf.rate = 1;
    laf.pitch = 1;
    laf.voice = speechSynthesis.getVoices().filter(function (voice) {
        return voice.name == voiceSelected;
    })[0];
    window.speechSynthesis.speak(laf);
}
person molla conan    schedule 03.02.2016