Как изменить голос в Синтезе речи?

Я пробую простой пример с синтезом речи.

<script>

voices = window.speechSynthesis.getVoices()
var utterance = new SpeechSynthesisUtterance("Hello World");
utterance.voice = voices[4];
utterance.lang = voices[4].lang;
window.speechSynthesis.speak(utterance);

</script>

Но это дает ошибку, что голоса не определены. Я обнаружил, что getVoices() загружается асинхронно. Я увидел этот ответ и обновил свой код, как показано ниже, чтобы использовать обратный вызов.

<script>
window.speechSynthesis.onvoiceschanged = function() {
voices = window.speechSynthesis.getVoices()
var utterance = new SpeechSynthesisUtterance("Hello World");
utterance.voice = voices[4];
utterance.lang = voices[4].lang;
window.speechSynthesis.speak(utterance);
};
</script>

Но по какой-то странной причине текст произносится три раза вместо одного. Как я могу исправить этот код?


person codingsplash    schedule 09.03.2017    source источник


Ответы (3)


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

let voices, utterance;

function speakVoice() {
voices = this.getVoices();
utterance = new SpeechSynthesisUtterance("Hello World");
utterance.voice = voices[1];
speechSynthesis.speak(utterance);
};

speechSynthesis.addEventListener('voiceschanged', speakVoice);
person Andrew    schedule 23.03.2017
comment
Можно ли как-то установить голос для всех высказываний, которые будут созданы? Или его нужно определять для каждого высказывания? - person user1063287; 24.08.2018
comment
@user1063287 user1063287 вы, вероятно, могли бы просто создать одно высказывание, установить голосовой объект и обновлять текст высказывания перед каждым произнесением: let utt = new window.SpeechSynthesisUtterance(); utt.voice = voices[2]; utt.text = 'say this'; speechSynthesis.speak(utt); - person Andrew; 26.08.2018

Это можно увидеть на многих демонстрациях типа JS Bin. Например:

http://jsbin.com/sazuca/1/edit?html,css,js,output

https://codepen.io/matt-west/pen/wGzuJ

Такое поведение наблюдается в Chrome, который использует событие voiceschanged при использовании нелокального голоса. Другой эффект заключается в том, что список голосов часто повторяется втрое.

Спецификация W3C гласит:

событие voiceschanged

Запускается, когда содержимое SpeechSynthesisVoiceList, которое возвращает метод getVoices, изменилось. Примеры включают: синтез на стороне сервера, когда список определяется асинхронно, или когда голоса на стороне клиента устанавливаются/удаляются.

... поэтому я предполагаю, что событие запускается один раз, когда Chrome получает голоса, а затем еще два раза, когда используется первый нелокальный голос.

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

    // Add voices to dropdown list
    loadVoices();
    // For browsers that use voiceschanged event
    speechSynthesis.onvoiceschanged = function(e) {
        // Load the voices into the dropdown
        loadVoices();
        // Don't add more options when voiceschanged again
        speechSynthesis.onvoiceschanged = null;
    }

Где loadVoices() — это функция, которая добавляет голоса к параметрам выбора. Это не идеально, однако работает во всех браузерах (с синтезом речи), независимо от того, используют они onvoiceschanged или нет.

person Frazer    schedule 23.05.2017

Вы можете просто добавить этот код и использовать SpeechSynthesis в своем проекте, у меня это работает.

var su;

su = new SpeechSynthesisUtterance();

su.text = "Hello World";

speechSynthesis.speak(su);

speechSynthesis.cancel();
person Sandipan Thorat    schedule 11.12.2017
comment
Он спрашивает, как изменить голос - person Ateik; 30.03.2018