Речь обрывается в Firefox, когда страница автоматически обновляется, но не в Google Chrome.

У меня есть проблема, когда в Firefox речь отключается, если страница автоматически обновляется, но в Google Chrome она заканчивает произносить речь, даже если страница автоматически обновляется. Как это исправить, чтобы речь не была обрезана в Firefox, даже когда страница автоматически обновляется?

msg = new SpeechSynthesisUtterance("please finish saying this entire sentence.");
window.speechSynthesis.speak(msg);

(function ($) {
  'use strict';
  if (window == window.top) {
    var body = $('body').empty();
    var myframe = $('<iframe>')
      .attr({ src: location.href })
      .css({ height: '95vh', width: '100%' })
      .appendTo(body)
      .on('load', function () {
        var interval;
        interval = 750; 
        setTimeout(function () {
          myframe.attr({ src: location.href });
        }, interval);
      });
  }
})(jQuery);

Ответы

Ответ 1

У меня есть проблема, когда в Firefox речь отключается, если страница автоматически обновляется, но в Google Chrome она заканчивает произносить речь, даже если страница автоматически обновляется.

Описанное поведение для Firefox является разумной ожидаемой реализацией.

Просматривая исходный код Firefox и Chromium, реализация speechSynthesis.speak() основана на speechSynthesis.speak() соединении с локальным речевым сервером. Этот сервер в * nix обычно является speech-dispatcher или speechd ( speech-dispatcher). См. Как программно отправить команду сокета unix на системный сервер, автоматически созданный браузером, или преобразовать JavaScript в C++ исходный код для Chromium? за описание попытки реализовать SSML-разбор в Chromium.

В конце концов решили написать собственный код для выполнения этого требования, используя JavaScript в соответствии со спецификацией W3C SpeechSynthesisSSMLParser, задав несколько вопросов на сайтах SE, регистрируя проблемы и ошибки и публикуя их в списках рассылки W3C без каких-либо доказательств того, что синтаксический анализ SSML когда-либо будет включен как часть. API веб-речи.

Как только это соединение инициировано, создается очередь для вызовов .speak(). Даже когда соединение закрыто, Task Manager может показывать активный процесс, зарегистрированный службой.

Процесс в Chromium/Chrome не без ошибок, наиболее близким к тому, что описано в вопросе, является

.volume собственности .volume

Наиболее вопиющей проблемой является реализация Chromium/Chrome webkitSpeechReconition которая записывает аудио пользователя и webkitSpeechReconition эти аудиоданные в удаленную службу, где транскрипт возвращается в браузер - без явного уведомления пользователя, имеющего место, помеченного как WONT FIX

Соответствующие проблемы W3C Speech API на GitHub


Таким образом, не будет описывать поведение в Firefox как "проблему", но поведение в Chrome как потенциальную "проблему".

Погружение в реализацию W3C Web Speech API в браузерах не является тривиальной задачей. По нескольким причинам. Включая очевидную направленность или доступный вариант коммерческих услуг TTS/SST и проприетарных реализаций синтеза и распознавания речи с закрытым исходным кодом в "смартфонах"; вместо исправления различных проблем с фактическим развертыванием W3C Web Speech API в современных браузерах.

speechd речи (речевой диспетчер) очень полезны в отношении серверной части (локальный сокет speech-dispatcher).

Не могу говорить за сопровождающих Firefox. Предполагается, что маловероятно, что если сообщение об ошибке, относящееся к запросу функции продолжения выполнения вывода звука с помощью .speak() из перезагруженного window, согласуется с недавними политиками автоматического воспроизведения, реализованными браузерами. Хотя вы все равно можете отправить сообщение об ошибке в Firefox, чтобы спросить, ожидается ли продолжение вывода звука (из любого API или интерфейса) во время перезагрузки текущего window; и если есть какие-либо предпочтения или политики, которые можно установить для переопределения описанного поведения, как предложено в ответе @zip. И получите ответ от самих разработчиков.

Есть отдельные люди и группы, которые составляют код FOSS, которые активны в домене и готовы помочь в разработке SST/TTS, многие из которых активны в GitHub, что является еще одним вариантом, чтобы задавать вопросы о том, как реализовать то, что вы пытаетесь достичь конкретно в браузере Firefox.

Помимо того, что вы запрашиваете у разработчиков запрос функции, вы можете прочитать исходный код и попытаться создать один или несколько обходных путей. Альтернативы включают в себя использование meSpeak.js, хотя это не обязательно meSpeak.js, что Firefox намеренно блокирует вывод звука во время перезагрузки window.

Ответ 2

Экспериментальная технология, вероятно, не правильно обрабатывается Firefox.

Попробуйте SpeechSynthesis.cancel() прежде чем повторять ваш .speak().

var synth = window.speechSynthesis;
let msg = new SpeechSynthesisUtterance("say something");
synth.cancel();
msg = new SpeechSynthesisUtterance("say something");
synth.speak(msg);

Ответ 3

Не уверен, почему есть разница в поведении... guest271314 может быть что-то в его ответе. Тем не менее, вы можете запретить FF останавливать tts, перехватывая событие reload с помощью обработчика onbeforeunload и ожидая окончания произнесения высказывания:

msg = new SpeechSynthesisUtterance("say something");
window.speechSynthesis.speak(msg);
window.onbeforeunload = function(e) {
  if(window.speechSynthesis.speaking){
    event.preventDefault();
    msg.addEventListener('end', function(event) {
      //logic to continue unload here
    });
  }
};

Ответ 4

РЕДАКТИРОВАНИЕ: Смотрите более элегантное решение с обещаниями ниже первоначального ответа!


Ниже приведен обходной путь к несоответствиям браузера, обнаруженным в Firefox, проверка synth.speaking в интервале и запуск перезагрузки только в том случае, если он false предотвращает преждевременную обрезку синтезатора:

(Он не работает должным образом в фрагменте SO, я предполагаю, что он не похож на iFrames в iFrames или что-либо еще, просто скопируйте, вставьте код в файл и откройте его с помощью Firefox!)

<p>I'm in the body, but will be in an iFrame</p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
	var synth = window.speechSynthesis;
	msg = new SpeechSynthesisUtterance("please finish saying this entire sentence.");
	synth.speak(msg);
	
	(function ($) {
		'use strict';
		if (window == window.top) {
			var body = $('body').empty();
			var myframe = $('<iframe>')
				.attr({ src: location.href })
				.css({ height: '95vh', width: '100%' })
				.appendTo(body)
				.on('load', function () {
					var interval;
					interval = setInterval(function () {
						if (!synth.speaking) {
							myframe.attr({ src: location.href });
							clearInterval(interval);
						}
					}, 750);
				});
		}
	})(jQuery);
</script>

Ответ 5

Fire Fox:

Прежде всего введите и найдите "about: config" в браузере, заполнив его в адресной строке. Это перейдет на другую страницу, где будет всплывающее окно с просьбой принять любой риск, вы должны принять это. Найдите в списке параметр с именем accessibility.blockautorefresh и щелкните его правой кнопкой мыши. На экране появятся некоторые параметры в виде списка, выберите параметр "Переключить" и установите для него значение "Истина", а не "Ложь". Это изменение заблокирует автоматическое обновление в браузере Firefox. Помните, что эта опция обратима!