Krótki wpis o mojej eksperymentalnej implementacji Web Speech API a konkretnie interfejsu SpeechSynthesis który pozwala na dodanie możliwości odtwarzania wersji audio każdego postu.

Implementacja dotyczy bezpośrednio kodu szablonu WordPress, ale po wprowadzeniu kilku drobnych zmian można jej używać w dowolnym przypadku.

Po udoskonaleniu tego rozwiązania fajnie byłoby udostępnić je jako wtyczkę.

Eksperymentalna wersja kodu:

<div id="speak-container" style="display: none;">
  <button id="speak-button"></button>
</div>

<script>
  // Check browser support
  if ('speechSynthesis' in window) {
    // Cancel audio reader before page leave
    window.onbeforeunload = () => {
      window.speechSynthesis.cancel();
    }
    // Wait for voices initialisation
    window.speechSynthesis.onvoiceschanged = () => {
      const speakContainer = document.getElementById('speak-container');
      const button = document.getElementById('speak-button');
      const buttonTextPlay = "▶ Play audio version of the post";
      const buttonTextStop = "⏹ Stop audio version";
      let isPlaying = false;
      // Show play button if user has any voices installed
      if (window.speechSynthesis.getVoices().length) {
        button.textContent = buttonTextPlay;
 	speakContainer.style.display = 'initial';
      }

      const startAudioReader = (text) => {
        const msg = new SpeechSynthesisUtterance();
        // Set the text.
        msg.text = text;
        // Set the lang from Polylang plugin 
        msg.lang = '<?php echo str_replace('_', '-', get_locale()); ?>';

        // Queue this utterance.
        window.speechSynthesis.speak(msg);
      }

      // Set up an event listener for when the 'Play audio' button is clicked.
      button.addEventListener('click', () => {
        isPlaying = !isPlaying;
        if (!isPlaying) { 
          window.speechSynthesis.cancel();
          button.textContent = buttonTextPlay;
          return;
        }
        startAudioReader(`
          <?php echo str_replace('${', '\${', wp_strip_all_tags( get_the_content())); ?>
        `);
        button.textContent = buttonTextStop;
      });
    }
  }
</script>

Leave a Reply

Twój adres e-mail nie zostanie opublikowany.