TTS

Conversor de text a veu

🔊 Conversor de text a veu

<!DOCTYPE html>
<!-- Declara que aquest document és HTML5 -->
<html lang="ca">
<!-- L'idioma principal del contingut és el català -->
<head>
  <meta charset="UTF-8">
  <!-- Assegura la correcta visualització de caràcters especials i emojis -->
  <title>Conversor de text a veu</title>
  <!-- Títol que apareix a la pestanya del navegador -->

  <style>
    /* Estils generals de la pàgina */
    body {
      font-family: sans-serif;        /* Tipus de lletra llegible */
      padding: 2em;                   /* Espai al voltant del contingut */
      background-color: hsl(194, 91%, 91%); /* Fons blau clar suau */
    }

    /* Estil comú per al camp de text i el selector d'idioma */
    input, select {
      font-size: 1.2em;               /* Mida de lletra una mica més gran */
      padding: 0.5em;                 /* Espai interior dins dels camps */
      margin-top: 1em;                /* Separació superior */
      width: 100%;                    /* Ocupen tot l'ample disponible */
      max-width: 500px;               /* Però no més de 500px */
    }

    /* Estil del botó d'altaveu (🔊) */
    #speakBtn {
      font-size: 2em;                 /* Molt gran per facilitar la interacció */
      background: none;               /* Sense fons */
      border: none;                   /* Sense vores */
      cursor: pointer;                /* Cursor en forma de mà en passar-hi */
      margin-top: 1em;                /* Separació respecte als elements anteriors */
    }

    /* Efecte visual quan l'usuari passa el ratolí pel botó */
    #speakBtn:hover {
      color: #c8e3f8;                 /* Canvia a un blau més clar */
    }
  </style>
</head>

<body>
  <!-- Títol visible de la pàgina amb un emoji d'altaveu -->
  <h2>🔊 Conversor de text a veu</h2>

  <!-- Camp on l'usuari escriu el text a sintetitzar -->
  <input type="text" id="cercar" placeholder="Escriu el text que vols escoltar">

  <!-- Selector per triar la veu/idioma desitjat -->
  <select id="voiceSelect">
    <option value="">Selecciona idioma</option>
    <option value="en-US">🇺🇸 Anglès (US)</option>
    <option value="en-GB">🇬🇧 Anglès (UK)</option>
    <option value="fr-FR">🇫🇷 Francès</option>
    <option value="de-DE">🇩🇪 Alemany</option>
    <option value="it-IT">🇮🇹 Italià</option>
    <option value="pt-PT">🇵🇹 Portuguès</option>
    <option value="es-ES">🇪🇸 Espanyol</option>
    <option value="ca-ES">🎗️ Català</option>
    <!-- Els valors (value) són codis d'idioma estàndard BCP 47 -->
  </select>

  <!-- Botó per iniciar la síntesi de veu -->
  <button id="speakBtn" title="Escolta el text">🔊</button>

  <script>
    // S'executa quan tot el contingut HTML ha carregat
    document.addEventListener('DOMContentLoaded', () => {
      // Referències als elements HTML que necessitarem
      const inputElement = document.getElementById('cercar');      // Camp de text
      const speakBtn = document.getElementById('speakBtn');        // Botó d'altaveu
      const voiceSelect = document.getElementById('voiceSelect');  // Selector d'idioma
      let voices = [];  // Array per emmagatzemar les veus disponibles

      // Funció per carregar la llista de veus del sistema
      function loadVoices() {
        voices = speechSynthesis.getVoices();
        // Aquesta API pot trigar a carregar les veus en alguns navegadors
      }

      // Assegurem-nos que les veus es carreguin, fins i tot si arriben més tard
      speechSynthesis.onvoiceschanged = loadVoices;
      loadVoices(); // Intentem carregar-les ja des del principi

      // Funció principal: converteix el text a veu
      function speakText() {
        const text = inputElement.value.trim(); // Obtenim i netegem el text
        if (!text) return; // Si està buit, no fem res

        const selectedLang = voiceSelect.value; // Idioma seleccionat per l'usuari
        const utterance = new SpeechSynthesisUtterance(text); // Creem l'objecte de parla

        // Busquem una veu que coincideixi exactament amb l'idioma triat
        const voice = voices.find(v => v.lang === selectedLang);

        if (voice) {
          // Si la trobem, l'assignem
          utterance.voice = voice;
          utterance.lang = voice.lang;
        } else {
          // Si no, mostrem un avís a la consola (per depuració)
          console.log('No s\'ha trobat cap veu per a ' + selectedLang);
          // Nota: l'API pot usar una veu per defecte si no s'assigna cap
        }

        // Paràmetres opcionals de parla
        utterance.rate = 1;   // Velocitat normal (1 = 100%)
        utterance.pitch = 1;  // To normal

        // Cancel·lem qualsevol parla anterior per evitar solapaments
        speechSynthesis.cancel();
        // Iniciem la nova síntesi de veu
        speechSynthesis.speak(utterance);
      }

      // Quan l'usuari fa clic al botó, es llegeix el text
      speakBtn.addEventListener('click', speakText);

      // ⚠️ Aquesta línia fa que el text es llegeixi AUTOMÀTICAMENT cada 10 segons
      // Pot ser útil per a demostracions, però pot resultar molest en ús normal
      setInterval(speakText, 10000);
    });
  </script>
</body>
</html>