speechSynthesis.speak не работает в Chrome
Я использую Chrome версии 55.0.2883.87 м (64-разрядная версия) на Windows 10.
Следующий простой HTML-файл воспроизводит проблему и извлечен из моего более сложного приложения. Предполагается говорить 3 слова при загрузке страницы. Он работает на MS Edge и Firefox, но не работает на Chrome. Этот код работал для меня на Chrome без проблем пару недель назад.
<html>
<head>
<script lang="javascript">
window.speechSynthesis.speak(new SpeechSynthesisUtterance("cat"));
window.speechSynthesis.speak(new SpeechSynthesisUtterance("dog"));
window.speechSynthesis.speak(new SpeechSynthesisUtterance("bark"));
</script>
</head>
<body></body>
</html>
6 ответов
Я, возможно, никогда не узнаю наверняка, потому что эта проблема была периодической, но, похоже, она исчезла после того, как я начал отменять прямо перед выступлением.
utter = new window.SpeechSynthesisUtterance("cat");
window.speechSynthesis.cancel();
window.speechSynthesis.speak(utter);
Я не думаю, что отмена обязательно должна происходить между созданием и использованием объекта высказывания. Просто перед каждым выступлением. Возможно, у меня была другая проблема, поскольку я создавал только один объект высказывания, а не группу. Я видел это только в Chrome 78. Используя Windows 7, 64-бит. Никогда не видел проблемы в Firefox или Edge.
ИЗМЕНИТЬ 2 недели спустя. Никаких повторений после нескольких десятков попыток. Кажется.cancel() решил мою проблему. Мои симптомы: вызов SpeakSynthesis.speak() в Chrome иногда не запускал речь. Не было никаких непосредственных указаний на проблему в коде,speechSynthesis.speaking
было бы правдой и .pending
было бы ложью. Не было бы событий от объекта высказывания. Обычно, когда речь работает, я получаю'start'
событие примерно через 0,1 секунды после вызова.speak().
SpeechSynthesis.speak() больше не допускается без активации пользователя в веб-браузере Google Chrome с 2018 года. Это нарушает политику автоматического воспроизведения Google Chrome. Таким образом, Google Chrome удалось отменить функцию автоматического воспроизведения, но вы можете использовать ее, добавив кнопку для выполнения пользовательского вызова.
Вы можете посетить здесь, чтобы проверить статус, предоставляемый самим Chrome, также ниже прилагается изображение, которое ясно показывает, что вызов SpeakSynthesis.speak () запрещен без разрешения пользователя.
Чтобы добавить к этому, проблемой для меня была скорость воспроизведения экземпляра
SpeechSynthesisUtterance
было выше 2. Я обнаружил, что в хроме должно быть установлено значение 2 или меньше (хотя в других браузерах, таких как сафари, он работает с более высокими показателями).
В Chrome, если скорость произнесения выше 2, это вызывает
window.speechSynthesis
застрять и нуждается
window.speechSynthesis.cancel()
прежде чем он снова начнет воспроизводить звук (с действительной скоростью ниже 2) через
.speak()
.
Ваш тест преобразования текста в голос сработал только один раз? Вот почему.
В chrome вы должны отменить речевой синтез, в противном случае он не соответствует политике автозапуска Google. Итак, вы должны начать свой скрипт с:
window.speechSynthesis.cancel()
Чтобы отменить любой синтез речи, который произошел раньше.
resultsDisplay = document.getElementById("rd");
startButton = document.getElementById("startbtn");
stopButton = document.getElementById("stopbtn");
recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition)();
recognition.lang = "en-US";
recognition.interimResults = false;
recognition.maxAlternatives = 5;
recognition.onresult = function(event) {
resultsDisplay.innerHTML = "You Said:" + event.results[0][0].transcript;
};
function start() {
recognition.start();
startButton.style.display = "none";
stopButton.style.display = "block";
}
function stop() {
recognition.stop();
startButton.style.display = "block";
stopButton.style.display = "none";
}
.resultsDisplay {width: 100%; height: 90%;}
#stopbtn {display: none;}
<div class="resultsDisplay" id="rd"></div>
<br/>
<center>
<button onclick="start()" id="startbtn">Start</button>
<button onclick="stop()" id="stopbtn">Stop</button>
</center>
Пытаться
utterance = new SpeechSynthesisUtterance("cat, dog, bark");
speechSynthesis.speak(utterance);
Вместо того, чтобы указывать текст при вызове new, вы можете попробовать указать объект с частотой, громкостью и текстом отдельно, а затем преобразовать его в голос.