Funció TTS dels navegadors: SpeechSynthesis

<?php

// 🔴 🔴 🔴 CANVI 1: Mapeig de codis curts ('cat', 'eng', etc.) a codis d'idioma vàlids
session_start();

// Mapeig de codis curts a codis d'idioma vàlids per a l'àudio
// Mapeig de codis curts a codis d'idioma vàlids per a l'àudio
$langMap = [
    'cat' => 'ca-ES', // Català (Espanya)
    'eus' => 'eu-ES', // Euskera / Basc (Espanya)
    'cas' => 'es-ES', // Castellà / Espanyol (Espanya)
    'eng' => 'en-US', // Anglès (Estats Units)
    'fra' => 'fr-FR', // Francès (França)
    'ger' => 'de-DE', // Alemany (Alemanya)
    'por' => 'pt-PT', // Portuguès (Portugal)
    'ita' => 'it-IT'  // Italià (Itàlia)
];

// Comprovem si $_SESSION['lang'] està definit i és vàlid
$shortLang = $_SESSION['lang'] ; // Assigna 'cat' si $_SESSION['lang'] no està definit

// Assignem el codi d'àudio corresponent
$_SESSION['lang_audio'] = $langMap[$shortLang] ?? 'es-ES'; // Assegura que sigui 'ca-ES' si el codi no es troba al mapeig

// Mostrem el resultat
//echo "<br>SESSION['lang_audio']: " . $_SESSION['lang_audio'];

// 🔴 🔴 🔴 fi CANVI
?>
<?php 
//echo $_SESSION['resposta']; //prova per veure que entra bé
   // exit ('31');
?>
 <form id="cercaForm" method="POST" action="BD_conexions/conexio_diccionari_bd.php">
 
             <div class="search-container">
                <!-- Camp de cerca -->
                <input 
            type="text" 
            id="cercar" 
            name="cercar" 
            onkeyup="" 
            placeholder="cercar.." 
            autofocus 
            value="<?php echo isset($_SESSION['cercar']) ? htmlspecialchars($_SESSION['cercar'], 
                    ENT_QUOTES, 'UTF-8') : ''; ?>"
                    >
                <!-- Botó de cerca -->
                <button type="submit">Cercar/Confirmar</button>
                <button id="speakButton" title="Llegir en veu alta">
                <span>🔊</span> 
                </button>
            </div> 
    <div>
  
    <p>
    <input type="button" value="<?php echo '-num-'.  $_SESSION['num'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '-id-'.  $_SESSION['id'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '-retorn-'. $_SESSION['nom'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '--'.  $_SESSION['lang_r'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '-1-'. $_SESSION['diccionari'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '-2-'. $_SESSION['diccionari_r'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '-3-'. $_SESSION['dic'].'--'; ?>" style="display:none;">
    <input type="button" value="<?php echo '--'. $_SESSION['bd']; ?>" style="display:none;">
    <input type="button" value="<?php echo '--'. $_SESSION['bd_r']; ?>" style="display:none;">
    <input
        type="text" 
        id="dicionari_A"
        name="dicionari_AJ" 
        onkeyup="" 
        placeholder=<?php echo htmlspecialchars($_SESSION['diccionari']); ?>
        autofocus
        data-diccionari=<?php echo htmlspecialchars($_SESSION['diccionari']); ?>
        style="display:none;">
</p>
<script>
        // Capturar elements del DOM
        const entrada = document.getElementById('cercar'); // Primer camp de text
        const boto = document.getElementById('boto');       // Botó
        const sortida = document.getElementById('replicar'); // Segon camp de text

        // Afegir un event listener al botó
        boto.addEventListener('click', function() {
            // Obtenir el valor de la primera entrada
            const text = entrada.value;

            // Assignar el valor a la segona entrada
            sortida.value = text;
        });
        
    </script>



<script>
  
  document.addEventListener('DOMContentLoaded', () => {
    const inputElement = document.getElementById('cercar');
    const speakBtn = document.getElementById('speakButton');
    let voices = [];

    // 🔴 Carreguem l'idioma des de PHP
    const userLang = '<?php echo addslashes($_SESSION["lang_audio"]); ?>';

    function loadVoices() {
      voices = speechSynthesis.getVoices();
    }

    speechSynthesis.onvoiceschanged = loadVoices;
    loadVoices();

    function speakText() {
      const text = inputElement.value.trim();
      if (!text) return;

      const utterance = new SpeechSynthesisUtterance(text);

      // 🔴 Busquem una veu que suporti l'idioma de la sessió (ex: 'ca-ES')
      let selectedVoice = voices.find(v => v.lang === userLang);

      // Si no n'hi ha d'exacta, provem amb el codi base (ex: 'ca')
      if (!selectedVoice) {
        const baseLang = userLang.split('-')[0];
        selectedVoice = voices.find(v => v.lang.startsWith(baseLang));
      }

      // Assignem la veu trobada (o només l'idioma si no hi ha veu específica)
      if (selectedVoice) {
        utterance.voice = selectedVoice;
        utterance.lang = selectedVoice.lang;
      } else {
        utterance.lang = userLang; // el navegador triarà una veu
      }

      utterance.rate = 1;
      utterance.pitch = 1;

      speechSynthesis.cancel();
      speechSynthesis.speak(utterance);
    }

    speakBtn.addEventListener('click', (e) => {
      e.preventDefault();
      speakText();
    });
  });

</script>


    </div>
             <!-- Contenidor de l'autocompletat -->
             <div id="resultats_autocompletar_container">
                <ul id="resultats_autocompletar">
                    <!-- Resultats dinàmics via JavaScript -->
                </ul>
            </div>
            


        </form>
    

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

This site uses Akismet to reduce spam. Learn how your comment data is processed.